CogVideoX 文生视频完全拆解:5 步跑通 + 显存优化清单
【免费下载链接】CogVideotext and image to video generation: CogVideoX (2024) and CogVideo (ICLR 2023)项目地址: https://gitcode.com/GitHub_Trending/co/CogVideo
CogVideoX 是智谱开源的视频生成模型系列,输入一段文字能产出 5~10 秒视频,输入一张图能让它动起来。这个仓库是官方实现:推理代码基于 HuggingFace diffusers,微调代码基于 DeepSpeed。下面按"先跑通、再讲透"的顺序推进:先在单卡上出第一条片,再拆 pipeline 内部的数据流,最后给显存优化清单和 LoRA 微调路线。
先跑通:3 条命令出第一条 5 秒视频
装依赖,选对模型档位
Python 版本必须落在 3.10~3.12,依赖清单锁定在 diffusers≥0.35.2、torch≥2.8.0、numpy==1.26.0(见 requirements.txt)。克隆仓库并安装:
git clone https://gitcode.com/GitHub_Trending/co/CogVideo cd CogVideo pip install -r requirements.txt三个档位,按显存选:
- CogVideoX-2B:480×720 分辨率,12GB 老卡(GTX 1080Ti)能跑;
- CogVideoX-5B / 5B-I2V:同为 480×720,RTX 3060 级别起步;
- CogVideoX1.5-5B:768×1360 高清档,161 帧 @16fps 可到 10 秒。
最短文生视频命令
推理入口是 cli_demo.py,直接命令行执行:
python inference/cli_demo.py \ --prompt "A red fox sprinting across a frozen lake, snowflakes in the air, cinematic slow motion" \ --model_path THUDM/CogVideoX-2b \ --generate_type t2v \ --num_inference_steps 50 \ --guidance_scale 6.0 \ --output_path ./output.mp4跑完得到output.mp4。注意三个默认值:采样 50 步、guidance_scale 6.0(无分类器引导强度,即"多听提示词的话")、bfloat16精度。1.0 系列是 49 帧 @8fps ≈ 6 秒,1.5 系列 81 帧 @16fps ≈ 5 秒。
提示词是出片质量的第一变量:模型用详细长描述训练,一句"女孩骑车"会明显细节不足。仓库自带扩写器 convert_demo.py,用 GPT/GLM-4 把短句重写成长描述,先扩写再进 pipeline,效果差异肉眼可见。
pipeline 内部:一条数据流走完四段
上面那条命令的黑箱,拆开是四个串行阶段。跟着数据走一遍。
提示词怎么变成数字
T5-XXL 文本编码器把你的 prompt 编码成一串 token 嵌入序列,作为条件喂进 DiT(Diffusion Transformer,用 Transformer 替代 UNet 做去噪的扩散主干)。文本编码器在推理中只做一次编码,之后不再参与计算。
视频怎么压成潜变量
直接在像素空间生成 81 帧 480×720 不可行。3D 因果 VAE(带时间因果约束的三维卷积 VAE)先把视频压进潜空间:空间 8 倍下采样、时间 4 倍下采样,81 帧 × 480×720 变成约 20×60×90 的三维张量。"因果"指每个潜在帧只依赖它之前的帧,所以能稳定生成更长序列而不爆显存。
噪声怎么逆推
DiT 执行去噪循环:从纯高斯噪声出发,50 步逐格预测并扣除噪声,潜变量慢慢显影。两个细节值得看:
- 调度器是
CogVideoXDPMScheduler,配timestep_spacing="trailing";官方注释明确 2B 模型建议换CogVideoXDDIMScheduler(步数更少、更快); use_dynamic_cfg=True让引导强度随噪声水平动态变化,而不是一律用 6.0,这是 5B 系列画面稳定的关键。
核心循环简化后只有两行:
for t in reversed(pipe.scheduler.timesteps): noise_pred = pipe.transformer(latents, t, encoder_hidden_states).sample latents = pipe.scheduler.step(noise_pred, t, latents).prev_sample画面怎么渲染出来
去噪结束后,VAE 解码器把潜变量还原成 81 帧图像,export_to_video按 16fps 写成 mp4。解码是全流程显存峰值最高的环节,后面"显存开关"一节专门处理它。
从图到动效的最短路径
I2V 只是换了 pipeline 类(CogVideoXImageToVideoPipeline)并多传一个image:
python inference/cli_demo.py \ --prompt "Gentle waves roll onto the sand, palm shadows swaying in the breeze" \ --model_path THUDM/CogVideoX-5b-I2V \ --generate_type i2v \ --image_or_video_path ./beach.jpg输入图被当作"首帧",生成画面从这一帧开始运动。一个特殊能力:CogVideoX1.5-5B-I2V 支持任意分辨率,输出尺寸跟随输入图;其余模型传自定义宽高会被静默改回推荐值(日志里有警告,别当没看见)。仓库 gradio_composite_demo/ 里备了示例图,可以直接拿来当输入:
显存不够时的三个开关
三个开关都在 cli_demo.py 里,可以叠加使用:
- offload 档位:
enable_sequential_cpu_offload()逐模块搬运进显存,最省显存但最慢;显存 ≥24GB 时改enable_model_cpu_offload(),速度明显回升; - VAE 分块:
vae.enable_slicing()+vae.enable_tiling()把解码切成小块,砍掉解码阶段的几 GB 峰值; - 量化:cli_demo_quantization.py 支持 torchao 的 int8 与 fp8 权重量化,fp8 要求 Hopper 架构(H100 及以上),普通卡用 int8 即可。
官方口径:2B 能在 GTX 1080Ti 上跑、5B 能在 RTX 3060 上跑,前提就是上面这些开关全部打开。
LoRA 微调:自定义风格的第一条路
想要特定人物、场景或动作风格,全参 SFT 太贵,LoRA(低秩适配,只训练少量新增矩阵)是首选。
数据集只要三个文件
./data ├── prompts.txt # 每行一条提示词,与视频按行对齐 ├── videos/ # .mp4 片段 └── videos.txt # 视频文件清单I2V 任务再加images/与images.txt。帧数必须满足 8N+1(49、81);分辨率不符会直接 resize,长宽比失真,建议先裁后缩。训练前代码会把视频预编码成 latent 缓存在磁盘上——改过数据后记得删掉缓存目录,否则会拿旧 latent 训练。
显存档位与一键启动
官方实测(见 finetune/README.md):2B LoRA rank128 单卡 16GB(4080)即可;5B LoRA 需 24GB(4090);1.5 系列 LoRA 需 35GB(A100)。全参 SFT 的 2B 用 DeepSpeed zero-2 + 优化器 offload,单卡 4090 的 17GB 也压得下。
cd finetune bash train_ddp_t2v.sh # 文生视频 LoRA bash train_ddp_i2v.sh # 图生视频 LoRA启动前改 shell 脚本里的--data_root、--output_dir、--train_resolution(格式为 帧数×高×宽)。官方经验:rank ≥64,lora_alpha设为 rank 或 rank//2,比默认值 1 稳定得多。训练完在推理端加--lora_path加载,load_lora_weights+fuse_lora已在 cli_demo.py 里写好。
下一步可以做什么
按成本从低到高,给你 5 个动手项:
- 同一提示词分别用 2B 和 5B 各出一条片,对比闪烁与细节:
--model_path THUDM/CogVideoX-5b --num_inference_steps 50; - 在 cli_demo.py 中把调度器换成
CogVideoXDDIMScheduler,记录步数减半后的耗时与画质变化; - 跑一遍 cli_demo_quantization.py 的 int8 档,用
nvidia-smi记下量化前后的峰值显存差; - 准备 30~50 条自有视频做一次 2B LoRA 训练(16GB 显存够用),数据集加载逻辑在 t2v_dataset.py;
- 用 ddim_inversion.py 做视频编辑:DDIM 逆变换把现有视频拉回潜空间,换新 prompt 重新生成(仅 5B 系列可用,2B 效果不佳)。
代码示例基于项目源码简化,完整实现请参考对应文件:cli_demo.py、convert_demo.py、cli_demo_quantization.py、ddim_inversion.py、train.py。
【免费下载链接】CogVideotext and image to video generation: CogVideoX (2024) and CogVideo (ICLR 2023)项目地址: https://gitcode.com/GitHub_Trending/co/CogVideo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考