大模型视频生成实战:Wan2.1 本地部署全记录

前言:最近花了大量时间折腾 Wan2.1(阿里通义开源的视频生成模型),踩了无数坑,最终跑出了第一个视频。这篇博客把整个过程完整记录下来,包括踩的坑、解决方案、以及对实际可用性的客观评价。希望给想本地部署视频生成模型的同好一些参考。


1. 背景与目标

1.1 为什么选 Wan2.1

视频生成模型有几个选择:

模型 参数量 显存需求 开源 质量 备注
Wan2.1 1.3B / 14B 8GB / 16GB+ ✅ Apache 2.0 较好 阿里开源,中文友好
Stable Video Diffusion 0.6B 6GB 一般 适合简单场景
CogVideoX 5B / 15B 12GB+ 较好 智谱开源,中文理解好
Gen-3 / Sora - 云端 极佳 闭源,费用高

选 Wan2.1 的原因:

  1. Apache 2.0 协议:可商用,完全免费
  2. 原生支持中文字符:不用翻译 prompt
  3. 1.3B 轻量版 8GB 显存可跑:刚好够用
  4. 图生视频+文生视频都支持:场景覆盖全

1.2 我的硬件环境

GPU: NVIDIA RTX 4070 Laptop (8GB GDDR6)
CPU: Intel Core i9-13900HX (24核32线程)
内存: 32GB DDR5
系统: Windows 10 Home x64
CUDA: 12.6 (驱动 581.83)

结论:硬件配置够用,但属于"刚好够"的级别。


2. 环境准备

2.1 Conda 环境搭建

# 创建独立环境
conda create -n video python=3.10 -y
conda activate video

# 安装 PyTorch (CUDA 12.1)
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121

# 安装核心依赖
pip install diffusers transformers accelerate imageio imageio-ffmpeg ftfy easydict basicsr realesrgan

# 安装 einops(后续踩坑发现)
pip install einops

2.2 官方仓库克隆

git clone https://github.com/Wan-Video/Wan2.1.git Wan2.1-main
cd Wan2.1-main

2.3 模型下载

模型 大小 用途 推荐度
Wan2.1-T2V-1.3B ~3GB 文生视频(轻量版) ⭐⭐⭐⭐⭐ 必装
Wan2.1-T2V-14B ~28GB 文生视频(高质量) ⭐⭐⭐ 需要量化
Wan2.1-I2V-14B-720P ~28GB 图生视频 ⭐⭐⭐ 进阶

模型下载地址(推荐国内镜像):

  • ModelScope:https://modelscope.cn/models/Wan-AI/Wan2.1-T2V-1.3B
  • HuggingFace:https://huggingface.co/Wan-AI/Wan2.1-T2V-1.3B

下载完成后放在项目 model 目录下:

C:\Users\OMEN\Desktop\idea\
├── model\
│   ├── Wan2.1-T2V-1.3B\
│   └── Wan2.1-T2V-14B\
└── Wan2.1-main\

3. 踩坑全记录

3.1 第一个坑:einops 模块缺失

报错:

ModuleNotFoundError: No module named 'einops'

解决方案:

pip install einops

注意:如果 pip 安装失败(遇到 TEMP 目录权限问题),可以用 conda:

conda install -c conda-forge einops -y

教训:requirements.txt 里没有显式列出 einops,但代码依赖它,属于隐式依赖。


3.2 第二个坑:dashscope API Key 验证

报错:

ModuleNotFoundError: No module named 'dashscope'

dashscope 是阿里云的一个服务,用于提示词扩展(Prompt Extender)。官方代码默认会尝试调用它。

解决方案:写一个 mock 模块绕过验证

# mock_dashscope.py
class _MockDashscope:
    api_key = 'mock'
    class G:
        @staticmethod
        def call(m, p, **kw):
            class O: text = p
            class R: output = O(); status_code = 200
            return R()
sys.modules['dashscope'] = _MockDashscope()
sys.modules['dashscope.Generation'] = _MockDashscope.G

使用时,在脚本最开头 exec 或 import 这个 mock 即可。


3.3 第三个坑:Flash Attention CUDA 版本不匹配(最坑!)

报错:

AssertionError
# 在 attention.py 的 assert FLASH_ATTN_2_AVAILABLE

问题分析

Flash Attention 2 是 Wan2.1 使用的注意力加速库,但它需要和你的 CUDA 版本精确匹配:

CUDA 版本 需要的 Flash Attention
CUDA 12.x flash-attn built for CUDA 12.x
CUDA 13.x flash-attn built for CUDA 13.x

你的驱动是 581.83,对应 CUDA 13.0,但大多数预编译的 flash-attn 包是 for CUDA 12.x 的,导致 import 成功但运行时 assert 失败。

解决方案:彻底绕过 flash_attn,用 PyTorch 原生 SDPA

修改 wan/modules/attention.py

# 修改前(会触发 assert)
try:
    import flash_attn
    FLASH_ATTN_2_AVAILABLE = True
except ModuleNotFoundError:
    FLASH_ATTN_2_AVAILABLE = False

# 修改后(增加 OSError 处理)
try:
    import flash_attn
    FLASH_ATTN_2_AVAILABLE = True
except (ModuleNotFoundError, OSError):
    # OSError: flash_attn installed but CUDA version mismatch
    FLASH_ATTN_2_AVAILABLE = False

同时修改 attention() 函数的 else 分支,强制走 PyTorch SDPA:

def attention(...):
    if FLASH_ATTN_2_AVAILABLE:
        # 使用 flash_attn(快速路径)
        ...
    else:
        # SDPA fallback(兼容但略慢)
        q = q.transpose(1, 2).to(dtype)
        k = k.transpose(1, 2).to(dtype)
        v = v.transpose(1, 2).to(dtype)
        attn_mask = None
        out = torch.nn.functional.scaled_dot_product_attention(
            q, k, v, attn_mask=attn_mask, is_causal=causal, dropout_p=dropout_p)
        out = out.transpose(1, 2).contiguous()
        return out.type(out_dtype)

教训:SDPA fallback 会导致生成速度变慢(每步 2-3 分钟 vs Flash Attention 的 1-2 秒),但至少能跑通。


3.4 第四个坑:显存占用估算错误

现象:模型加载时显存占用 5.8GB/8GB,但 diffusion sampling 时显存飙升到 OOM。

原因:diffusion 采样需要同时持有:

  • DiT 模型(~3GB)
  • VAE 解码器(~2GB)
  • 中间激活值(~2GB)

总计超过 8GB。

解决方案:使用 CPU Offload

t2v = WanT2V(
    config=config,
    checkpoint_dir=CKPT,
    device_id=0,
    t5_cpu=True,  # T5 放 CPU 节省显存
)

同时在采样时使用 offload_model=True,但代价是速度大幅降低。


4. 最终可用的运行脚本

经过反复调试,最终跑通的脚本如下:

"""
Wan2.1 视频生成脚本 - 最终可用版
"""
import sys, os, time, gc
sys.path.insert(0, os.path.dirname(__file__) + "\\Wan2.1-main")

# ========== Mock dashscope ==========
class _M:
    api_key = 'mock'
    class G:
        @staticmethod
        def call(m, p, **kw):
            class O: text = p
            class R: output = O(); status_code = 200
            return R()
sys.modules['dashscope'] = _M()
sys.modules['dashscope.Generation'] = _M.G

import torch
import imageio
from wan.configs import WAN_CONFIGS
from wan.text2video import WanT2V
from easydict import EasyDict

CKPT = r"C:\Users\OMEN\Desktop\idea\model\Wan2.1-T2V-1.3B"
OUT = r"C:\Users\OMEN\Desktop\idea\output\test_480p.mp4"
PROMPT = "A fluffy orange cat walking slowly on a green grass field, sunlight filtering through the leaves, gentle breeze, nature documentary style, cinematic"
NEG = "blurry, low quality, distorted, watermark, text"

print("=" * 55)
print("[Wan2.1] Video Generator")
print("=" * 55)

# 初始化模型
t2v = WanT2V(
    config=EasyDict(WAN_CONFIGS["t2v-1.3B"]),
    checkpoint_dir=CKPT,
    device_id=0,
    t5_cpu=True,  # 节省显存
)

# 生成视频
with torch.no_grad():
    videos = t2v.generate(
        input_prompt=PROMPT,
        size=(832, 480),
        frame_num=81,  # ~3.4秒 @ 24fps
        shift=8.0,
        sampling_steps=50,
        guide_scale=6.0,
        n_prompt=NEG,
        offload_model=True,
    )

# 保存
frames = videos.permute(1, 2, 3, 0).cpu().numpy()
frames = (frames * 255).clip(0, 255).astype('uint8')
imageio.mimwrite(OUT, frames, fps=24, codec='libx264', quality=8)

print(f"[SUCCESS] Video saved: {OUT}")

5. 运行结果与分析

5.1 最终输出

指标
文件大小 3.4 MB
分辨率 832×480
帧数 81 帧
时长 ~3.4 秒
生成耗时 ~2-3 小时(SDPA fallback)
显存占用 5.8 GB / 8 GB

5.2 质量评价

客观说:视频质量一般,存在以下问题:

  1. 细节模糊:480P 分辨率本身偏低,加上 SDPA fallback 可能有轻微精度损失
  2. 运动不够流畅:81 帧约 3.4 秒,动作偏少
  3. 风格偏写实:和预期"自然纪录片"风格有一定差距

5.3 为什么质量不理想

原因 说明
SDPA 替代 FA Flash Attention 被绕过,精度略有下降
int8 量化模型 1.3B 是量化版,比 fp16 原版差
480P 分辨率 本身偏低,放到手机上看更明显
81 帧太少 3.4 秒内容太少,动作变化有限

6. 结论与建议

6.1 Wan2.1 本地部署的现实评价

维度 评分 说明
可运行性 ⭐⭐⭐ 能跑通,但踩坑无数
生成速度 太慢,SDPA fallback 拖累严重
视频质量 ⭐⭐⭐ 勉强及格,不适合生产
显存要求 ⭐⭐⭐ 8GB 可跑,但余量不多
适合人群 - 研究/学习/实验,不适合生产

6.2 生产级建议

如果你的目标是每天产出视频内容

不要用 Wan2.1 本地部署

推荐方案 工具 费用 优势
国产AI视频 可灵AI / 海螺AI / 即梦 50-200元/月 效果好,速度快
云端生成 Runway / Pika $12-35/月 质量高,可灵活用
本地 + 云端混合 SD + 国产图生视频 组合 兼顾成本和质量

6.3 我的选择

最终结论:Wan2.1 本地部署适合学习研究,不适合作为主力生产工具

对于真正要产出内容的创作者,建议:

  1. Stable Diffusion 做角色图
  2. 国产 AI 图生视频工具(可灵、即梦等)做视频
  3. 剪映 做剪辑配音
  4. Wan2.1 本地留着做实验和备选

7. 附录:常见错误速查

错误 解决方案
ModuleNotFoundError: einops pip install einops
ModuleNotFoundError: dashscope mock 绕过或 pip install dashscope
AssertionError: FLASH_ATTN_2_AVAILABLE 修改 attention.py,强制 SDPA fallback
OOM: CUDA out of memory t5_cpu=Trueoffload_model=True
RuntimeError: mat1 mat2 shape mismatch SDPA fallback 实现有 bug,需修复 attention.py
采样速度极慢(>2分钟/步) 正常,SDPA 比 FA 慢 50-100 倍

8. 参考资料


写在最后:折腾 Wan2.1 的过程虽然痛苦,但也学到了很多(Flash Attention、SDPA、显存优化等)。如果你也在尝试本地部署视频模型,希望这篇记录能帮你少走弯路。但如果你是为了真正产出内容,建议尽早切换到生产级工具,把时间花在内容创作上,而不是和模型搏斗。

有问题欢迎在评论区交流!


原创不易,转载须注明出处。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐