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

大模型视频生成实战: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 环境搭建

bash 复制代码
# 创建独立环境
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 官方仓库克隆

bash 复制代码
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 图生视频 ⭐⭐⭐ 进阶

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

下载完成后放在项目 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'

解决方案:

bash 复制代码
pip install einops

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

bash 复制代码
conda install -c conda-forge einops -y

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


3.2 第二个坑:dashscope API Key 验证

报错:

复制代码
ModuleNotFoundError: No module named 'dashscope'

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

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

python 复制代码
# 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

python 复制代码
# 修改前(会触发 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:

python 复制代码
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

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

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


4. 最终可用的运行脚本

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

python 复制代码
"""
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、显存优化等)。如果你也在尝试本地部署视频模型,希望这篇记录能帮你少走弯路。但如果你是为了真正产出内容,建议尽早切换到生产级工具,把时间花在内容创作上,而不是和模型搏斗。

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


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

相关推荐
Gideon_k_Marx3 小时前
读代码3:OLMo3全详解 - layer2--Data (上)
人工智能·深度学习·机器学习·语言模型·自然语言处理
春风化作秋雨3 小时前
Transformer:颠覆AI的注意力革命
人工智能·深度学习·transformer
m0_747304163 小时前
机器学习入门
人工智能·深度学习·机器学习
枳实-叶4 小时前
50 道嵌入式音视频面试题
面试·职场和发展·音视频
陪你步步前行5 小时前
关于dice, miou, loss计算的细节
人工智能·深度学习·机器学习
科学创新前沿5 小时前
逆向设计新范式:深度学习驱动的声学超材料智能优化!
人工智能·python·深度学习·声学·逆向设计·声学超材料
Yao.Li6 小时前
LINEMOD 训练流程与实施细节
人工智能·深度学习·机器学习
淑子啦6 小时前
React录制视频和人脸识别
javascript·react.js·音视频
Fleshy数模6 小时前
ResNet 残差网络:迁移学习实现食物分类实战
人工智能·深度学习·残差网络·卷积神经网络