CogVideoX LoRA 微调实战指南:24GB 单显卡跑通个性化视频风格训练
【免费下载链接】CogVideotext and image to video generation: CogVideoX (2024) and CogVideo (ICLR 2023)项目地址: https://gitcode.com/GitHub_Trending/co/CogVideo
如果你希望 CogVideoX 这个开源视频生成模型能稳定产出某种特定角色、风格或主体的视频,但没有条件做全参数训练,那么 CogVideoX LoRA 微调是目前最省资源的路径:16~24GB 的消费级显卡,配上几十个短视频,就能把模型往你的目标风格上带,训练完的产物只是一个几十字节的适配器文件,推理时加载即可。下面按"先判断能不能跑 → 备数据 → 改脚本 → 训练 → 加载 → 排错"的顺序,把整个流程里最容易出错的地方讲清楚。
先确认你的显卡够不够跑
选模型之前先看三组约束:模型规模、训练分辨率、训练方式,三者共同决定显存底线。下表按"同规格下 LoRA 明显更省"的原则重新整理,SFT 一行合并了多种分布式策略的显存档位:
| 模型 | 微调方式 | 训练规格(帧×高×宽) | 单卡显存档位 | 参考卡 |
|---|---|---|---|---|
| CogVideoX-2B | LoRA(rank 128) | 49×480×720 | 16GB | RTX 4080 |
| CogVideoX-5B | LoRA(rank 128) | 49×480×720 | 24GB | RTX 4090 |
| CogVideoX1.5-5B | LoRA(rank 128) | 81×768×1360 | 35GB | A100 |
| CogVideoX-2B | SFT | 49×480×720 | 36GB(DDP)~14GB(8卡 zero-3+offload) | A100~RTX 4080 |
| CogVideoX-5B | SFT | 49×480×720 | 42GB(8卡 zero-2)~28GB(8卡 zero-3+offload) | A100~RTX 5090 |
| CogVideoX1.5-5B | SFT | 81×768×1360 | 56GB(单卡 zero-2 offload)~40GB(8卡 zero-3+offload) | A100 |
LoRA 还是 SFT,一句话怎么选
LoRA 只训练注入在注意力层上的低秩矩阵,权重体积和显存开销都小,适合个人做风格定制;SFT 是全参数微调,单卡起步就要 36GB,多卡 zero 配置才能把显存压下来,更适合有团队的场景。
判断依据:显卡小于 24GB 或只有单卡,直接选 LoRA,不要考虑 SFT。
数据集准备:两条规则决定训练成败
数据集目录结构很简单:
. ├── prompts.txt # 每条视频对应的提示词 ├── videos/ # .mp4 视频文件 ├── videos.txt # 视频文件列表 ├── images/ # 可选,I2V 参考图 └── images.txt # 可选,参考图列表真正容易翻车的是两条格式规则。第一条:帧数必须满足 8N+1(如 49、81),训练入口 finetune/schemas/args.py 里有校验,不满足直接报错。第二条:分辨率建议用模型默认值——CogVideoX 用 480×720,CogVideoX1.5 用 768×1360。注意代码对尺寸不符的样本是直接 resize 的,宽高比会被拉变形,如果素材比例不统一,建议自己先 crop + resize 再训练,否则模型会学到带形变的画面。
I2V 的参考图可以不提供
做图像到视频微调时,如果不给images/,代码会自动抽取每个视频的第一帧作为条件图像,这对"让视频动起来"类任务通常够用。仓库里的 I2V 示例输入长这样:
一个隐蔽的坑:latent 缓存
训练前视频会被自动编码成 latent 并缓存在磁盘上,这是为了提速。代价是:你修改、增删过数据后,必须手动删掉videos/下的latent/目录,否则新加的视频根本不会进入训练。
判断依据:改过数据却没删 latent 缓存,是"明明加了数据却像没加"这类问题的头号原因。
启动训练:改脚本里的哪几行
环境方面,微调代码依赖 diffusers 的主分支,直接pip install diffusers装到的发行版可能缺少对应实现,安装方式以 finetune/README_zh.md 中的说明为准。仓库本身:
git clone https://gitcode.com/GitHub_Trending/co/CogVideo cd CogVideo训练入口是 finetune/train_ddp_t2v.sh(文生视频)和train_ddp_i2v.sh(图生视频),脚本本身就是参数清单,需要改的集中在四处:--output_dir(输出目录)、--data_root(数据集根目录)、--caption_column/--video_column(提示词与视频列表路径)、--train_resolution(按"帧数x高x宽"写,如49x480x720)。改完在finetune/目录下运行:
bash train_ddp_t2v.sh # 文本到视频 bash train_ddp_i2v.sh # 图像到视频LoRA 的三个参数
rank默认 128,官方最佳实践建议不低于 64,数值越大表达能力越强但更吃显存。lora_alpha值得特别注意:原始仓库默认是 1,官方自己的实验结论是这个值效果不好,建议改成与 rank 相同或 rank//2(比如 rank 128 时 alpha 取 128 或 64)。target_modules默认注入to_q/to_k/to_v/to_out.0四个注意力模块,一般不用动。
两个容易漏掉的开关
其一,--id_token:给目标风格指定一个标识词(类似 DreamBooth),训练时提示词里带上它,效果普遍更好。其二,--do_validation默认关闭;如果你用 SFT 且显卡在 24GB 以下,务必保持关闭,因为验证阶段不做 offload,峰值显存会顶破。
判断依据:启动前核对三件事——train_resolution是否 8N+1、mixed_precision是否选对、do_validation是否按显存档位设置。
数据量给多少、训练多久
官方用 70 个同概念视频做对照实验,把数据切成 10 / 25 / 50 三组,结论是 25 个及以上的视频效果明显最好,少于这个数模型往往学不会新概念。训练步数没有固定答案:train_epochs默认 10,checkpoint 默认每 200 步存一次(脚本里改成了 10 步,方便快速看效果)。学习率默认 2e-5 配 constant_with_warmup 调度,warmup 100 步,这个组合对 LoRA 基本可以直接用。
过拟合的信号是:训练视频几乎能背下来,但换个提示词就崩。解法是增加数据多样性(同一风格多拍几种场景、镜头)并适当缩短训练步数,而不是调学习率。
判断依据:先按 25 个以上短视频起跑,一两个 epoch 后看 checkpoint 出片,风格没学进去优先怀疑数据量和提示词质量,其次才怀疑超参。
训练结束后,如何加载 LoRA 适配器
LoRA 的产物是pytorch_lora_weights.safetensors,加载分两步:把权重挂到 pipeline 上,再按 alpha/rank 的比例设定作用强度(这个比例就是训练时 alpha 的实际意义,推理时必须和训练配置一致):
pipe.load_lora_weights(lora_dir, weight_name="pytorch_lora_weights.safetensors") pipe.set_adapters(["cogvideox-lora"], [lora_alpha / lora_rank])实际使用时更省事:推理脚本 inference/cli_demo.py 原生支持--lora_path和--lora_rank参数,直接传入适配器目录即可生成视频。
SFT 全参模型要先合并权重
如果走的是 SFT 路线,checkpoint 是分片的,不能直接加载,要先用 checkpoint 目录下的zero_to_fp32.py把权重合并成完整模型,再当作基座使用。推理显存紧张时,脚本里的enable_sequential_cpu_offload()可以逐层卸载到 CPU;显存更紧可以看量化推理脚本inference/cli_demo_quantization.py。
判断依据:LoRA 出片效果不对时,第一优先检查推理时的 lora_scaling 是否等于训练用的 alpha/rank。
遇到问题的三个高频场景
显存不够
LoRA 场景下先把batch_size压到 1,用gradient_accumulation_steps等效放大批量;SFT 场景换用finetune/configs/里的 zero2/zero3 配置模板(在accelerate_config.yaml的deepspeed_config_file里指定),并打开优化器与参数 offload。任何情况下,24GB 以下显卡都建议关掉 validation。
学了但画面变形或没学进去
按顺序排查:数据改过后有没有删 latent 缓存;提示词与视频内容是否匹配;素材宽高比是否被直接 resize 拉变形。
训练损失抖动或 NaN
最常见原因是精度选错:只有 CogVideoX-2B 支持 fp16 训练,5B 系列都是 bf16 预训练的,mixed_precision用 fp16 会不稳定,改成 bf16 即可,参数校验里也会打印对应警告。
判断依据:排错顺序固定为"缓存 → 数据 → 精度",大多数问题不出在超参上。
下一步:数据集打字幕与相关工具
很多人卡在数据准备的另一头:视频有了,高质量的提示词难写。官方训练数据用的字幕模型 CogVLM2-Caption 已开源,仓库里的tools/caption/video_caption.py可以批量给视频生成描述,直接产出prompts.txt,效果大致如下:
其余几个方向按需取用:推理显存紧张看量化脚本inference/cli_demo_quantization.py;多卡出片看tools/parallel_inference/;要改模型结构而非只加适配器,去sat/目录(注意它的数据集格式与 diffusers 版不同);更完整的参数与最佳实践细节都写在 finetune/README_zh.md 里。
判断依据:数据不够多先解决字幕,推理不够快先上量化,这两条路都不需要改训练代码。
【免费下载链接】CogVideotext and image to video generation: CogVideoX (2024) and CogVideo (ICLR 2023)项目地址: https://gitcode.com/GitHub_Trending/co/CogVideo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考