一、大模型视频生成实战: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 的原因:
- Apache 2.0 协议:可商用,完全免费
- 原生支持中文字符:不用翻译 prompt
- 1.3B 轻量版 8GB 显存可跑:刚好够用
- 图生视频+文生视频都支持:场景覆盖全
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 质量评价
客观说:视频质量一般,存在以下问题:
- 细节模糊:480P 分辨率本身偏低,加上 SDPA fallback 可能有轻微精度损失
- 运动不够流畅:81 帧约 3.4 秒,动作偏少
- 风格偏写实:和预期"自然纪录片"风格有一定差距
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 本地部署适合学习研究,不适合作为主力生产工具。
对于真正要产出内容的创作者,建议:
- 用 Stable Diffusion 做角色图
- 用 国产 AI 图生视频工具(可灵、即梦等)做视频
- 用 剪映 做剪辑配音
- 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=True,offload_model=True |
RuntimeError: mat1 mat2 shape mismatch |
SDPA fallback 实现有 bug,需修复 attention.py |
| 采样速度极慢(>2分钟/步) | 正常,SDPA 比 FA 慢 50-100 倍 |
8. 参考资料
写在最后:折腾 Wan2.1 的过程虽然痛苦,但也学到了很多(Flash Attention、SDPA、显存优化等)。如果你也在尝试本地部署视频模型,希望这篇记录能帮你少走弯路。但如果你是为了真正产出内容,建议尽早切换到生产级工具,把时间花在内容创作上,而不是和模型搏斗。
有问题欢迎在评论区交流!
原创不易,转载须注明出处。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)