Skip to content

Fix for AutoModel.from_pretrained crashing #8

Description

@EviLooo

Title

Fix for AutoModel.from_pretrained crashing on Google Colab (trust_remote_code, dtype, and missing attention fallback)

Description

If you are trying to run AutoModel.from_pretrained("ShandaAI/FloodDiffusionTiny") in a Google Colab notebook or a fresh environment, it currently crashes due to four issues with dependencies and the cached HuggingFace files:

  1. Incompatible Transformers Version: Modern versions of transformers (v5.x) crash when trying to load google/umt5-base. You must downgrade to a specific v4 version (like 4.44.0) that supports umt5 without breaking tokenizers on Python 3.12.
  2. trust_remote_code check fails: hf_pipeline.py checks kwargs.get('trust_remote_code'), but transformers strips this out before passing it to the model.
  3. dtype TypeError: diffusion_forcing_wan_tiny.py passes dtype= to the text encoder, but newer versions of transformers strictly require torch_dtype=.
  4. Missing Native Attention Fallback: tools/attention.py forces the use of Flash Attention. If a user doesn't have it (for example collab/kaggle T4 gpu doesn't support it), the code just hits assert FLASH_ATTN_2_AVAILABLE and crashes. Furthermore, writing a custom PyTorch fallback fails because the variable lk defaults to q_lens (length 65), even though the text key tensor k is only length 1 for cross-attention, causing severe shape mismatches.

The Fix

Step 1: Force install a compatible transformers version in your terminal/notebook. (Note: You can optionally add flash-attn --no-build-isolation to this command if your GPU supports it).

pip install transformers==4.44.0

Step 2: Run this Python script immediately after downloading the model. It safely patches the code bugs in the HuggingFace cache and injects a mathematically safe PyTorch attention fallback so the model can generate motion perfectly without Flash Attention.

# Delete corrupted cache
import shutil
import glob
import sys
from transformers import AutoModel

shutil.rmtree("/root/.cache/huggingface/hub/models--ShandaAI--FloodDiffusionTiny", ignore_errors=True)
shutil.rmtree("/root/.cache/huggingface/modules/transformers_modules/ShandaAI", ignore_errors=True)
print("✅ Cache cleared")

# 1. Trigger first download (downloads hf_pipeline.py, then crashes)
try:
    AutoModel.from_pretrained("ShandaAI/FloodDiffusionTiny", trust_remote_code=True)
except Exception:
    pass

# 2. trust_remote_code patch
for f in glob.glob("/root/.cache/huggingface/modules/transformers_modules/ShandaAI/FloodDiffusionTiny/*/hf_pipeline.py"):
    text = open(f).read()
    text = text.replace(
        "if not kwargs.get('trust_remote_code', False):",
        "if False:"
    )
    open(f, 'w').write(text)
    print("✅ Patch 1 applied")

# 3. Trigger second download (downloads the rest of the model, then crashes on dtype)
try:
    AutoModel.from_pretrained("ShandaAI/FloodDiffusionTiny", trust_remote_code=True)
except Exception:
    pass

# 4. Patch the dtype bug
for f in glob.glob("/root/.cache/huggingface/hub/models--ShandaAI--FloodDiffusionTiny/*/*/ldf_models/diffusion_forcing_wan_tiny.py"):
    text = open(f).read()
    text = text.replace(
        "dtype=dtype\n        ).encoder",
        "torch_dtype=dtype\n        ).encoder"
    )
    open(f, 'w').write(text)
    print("✅ Patch 2 (dtype) applied")

# 5. Inject Safe PyTorch Attention fallback
# NOTE: You can skip this entire block (Step 5) if you successfully installed `flash-attn`
for f in glob.glob("/root/.cache/huggingface/hub/models--ShandaAI--FloodDiffusionTiny/*/*/ldf_models/tools/attention.py"):
    with open(f, 'r') as file:
        lines = file.readlines()

    else_idx = -1
    return_idx = -1

    # Find exactly where the else: block starts and where the function returns
    for i, line in enumerate(lines):
        if line.startswith("    else:"):
            else_idx = i
        if line.startswith("    # output") or line.startswith("    return"):
            if else_idx != -1:
                return_idx = i
                break

    if else_idx != -1 and return_idx != -1:
        new_lines = lines[:else_idx+1] # Keep everything up to 'else:'

        # A perfect SDPA fallback that correctly chunks the flattened tensors!
        new_code = """        import torch.nn.functional as _F
        out = []
        q_start = 0
        k_start = 0
        for i in range(b):
            q_len = q_lens[i].item()
            k_len = k_lens[i].item()
            q_i = q[q_start:q_start+q_len].transpose(0, 1) # [Nq, Lq, D]
            k_i = k[k_start:k_start+k_len].transpose(0, 1) # [Nk, Lk, D]
            v_i = v[k_start:k_start+k_len].transpose(0, 1)
            
            x_i = _F.scaled_dot_product_attention(
                q_i.unsqueeze(0), k_i.unsqueeze(0), v_i.unsqueeze(0),
                dropout_p=dropout_p if dropout_p else 0.0,
                is_causal=causal if causal else False,
                scale=softmax_scale,
            ).squeeze(0).transpose(0, 1) # [Lq, Nq, D]
            out.append(x_i)
            
            q_start += q_len
            k_start += k_len
        x = torch.cat(out, dim=0).unflatten(0, (b, lq))
"""
        new_lines.append(new_code)
        new_lines.extend(lines[return_idx:]) # Keep the return statement

        with open(f, 'w') as file:
            file.writelines(new_lines)
        print("✅ Patch 3 (Attention gracefully handles unpadded variable lengths!)")

# Clean memory
for key in list(sys.modules.keys()):
    if 'FloodDiffusion' in key or 'ldf' in key or 'hf_pipeline' in key or 'diffusion_forcing' in key or 'attention' in key:
        del sys.modules[key]


# === Run the Model ===
import torch

print("\nLoading model...")
model = AutoModel.from_pretrained(
    "ShandaAI/FloodDiffusionTiny",
    trust_remote_code=True
)
print("🎉 Model loaded successfully!")

model = model.to('cuda')

# Generate motion
print("🏃 Generating motion...")
motion = model("a person walking forward", length=60)
print(f"✅ Generated motion shape: {motion.shape}")

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions