mirror of
https://github.com/THUDM/CogVideo.git
synced 2025-06-26 12:28:08 +08:00
120 lines
5.4 KiB
Markdown
120 lines
5.4 KiB
Markdown
# CogVideoX diffusers 微调方案
|
||
|
||
[Read this in English](./README_zh.md)
|
||
|
||
[日本語で読む](./README_ja.md)
|
||
|
||
本功能尚未完全完善,如果您想查看SAT版本微调,请查看[这里](../sat/README_zh.md)。其数据集格式与本版本不同。
|
||
|
||
## 硬件要求
|
||
|
||
+ CogVideoX-2B / 5B T2V LORA: 1 * A100 (5B need to use `--use_8bit_adam`)
|
||
+ CogVideoX-2B SFT: 8 * A100 (制作中)
|
||
+ CogVideoX-5B-I2V 暂未支持
|
||
|
||
## 安装依赖
|
||
|
||
由于相关代码还没有被合并到diffusers发行版,你需要基于diffusers分支进行微调。请按照以下步骤安装依赖:
|
||
|
||
```shell
|
||
git clone https://github.com/huggingface/diffusers.git
|
||
cd diffusers # Now in Main branch
|
||
pip install -e .
|
||
```
|
||
|
||
## 准备数据集
|
||
|
||
首先,你需要准备数据集,数据集格式如下,其中,videos.txt 存放 videos 中的视频。
|
||
|
||
```
|
||
.
|
||
├── prompts.txt
|
||
├── videos
|
||
└── videos.txt
|
||
```
|
||
|
||
你可以从这里下载 [迪士尼汽船威利号](https://huggingface.co/datasets/Wild-Heart/Disney-VideoGeneration-Dataset)
|
||
|
||
视频微调数据集作为测试微调。
|
||
|
||
## 配置文件和运行
|
||
|
||
`accelerate` 配置文件如下:
|
||
|
||
+ accelerate_config_machine_multi.yaml 适合多GPU使用
|
||
+ accelerate_config_machine_single.yaml 适合单GPU使用
|
||
|
||
`finetune` 脚本配置文件如下:
|
||
|
||
```shell
|
||
|
||
accelerate launch --config_file accelerate_config_machine_single.yaml --multi_gpu \ # 使用 accelerate 启动多GPU训练,配置文件为 accelerate_config_machine_single.yaml
|
||
train_cogvideox_lora.py \ # 运行的训练脚本为 train_cogvideox_lora.py,用于在 CogVideoX 模型上进行 LoRA 微调
|
||
--gradient_checkpointing \ # 启用梯度检查点功能,以减少显存使用
|
||
--pretrained_model_name_or_path $MODEL_PATH \ # 预训练模型路径,通过 $MODEL_PATH 指定
|
||
--cache_dir $CACHE_PATH \ # 模型缓存路径,由 $CACHE_PATH 指定
|
||
--enable_tiling \ # 启用tiling技术,以分片处理视频,节省显存
|
||
--enable_slicing \ # 启用slicing技术,将输入切片,以进一步优化内存
|
||
--instance_data_root $DATASET_PATH \ # 数据集路径,由 $DATASET_PATH 指定
|
||
--caption_column prompts.txt \ # 指定用于训练的视频描述文件,文件名为 prompts.txt
|
||
--video_column videos.txt \ # 指定用于训练的视频路径文件,文件名为 videos.txt
|
||
--validation_prompt "" \ # 验证集的提示语 (prompt),用于在训练期间生成验证视频
|
||
--validation_prompt_separator ::: \ # 设置验证提示语的分隔符为 :::
|
||
--num_validation_videos 1 \ # 每个验证回合生成 1 个视频
|
||
--validation_epochs 100 \ # 每 100 个训练epoch进行一次验证
|
||
--seed 42 \ # 设置随机种子为 42,以保证结果的可复现性
|
||
--rank 128 \ # 设置 LoRA 参数的秩 (rank) 为 128
|
||
--lora_alpha 64 \ # 设置 LoRA 的 alpha 参数为 64,用于调整LoRA的学习率
|
||
--mixed_precision bf16 \ # 使用 bf16 混合精度进行训练,减少显存使用
|
||
--output_dir $OUTPUT_PATH \ # 指定模型输出目录,由 $OUTPUT_PATH 定义
|
||
--height 480 \ # 视频高度为 480 像素
|
||
--width 720 \ # 视频宽度为 720 像素
|
||
--fps 8 \ # 视频帧率设置为 8 帧每秒
|
||
--max_num_frames 49 \ # 每个视频的最大帧数为 49 帧
|
||
--skip_frames_start 0 \ # 跳过视频开头的帧数为 0
|
||
--skip_frames_end 0 \ # 跳过视频结尾的帧数为 0
|
||
--train_batch_size 4 \ # 训练时的 batch size 设置为 4
|
||
--num_train_epochs 30 \ # 总训练epoch数为 30
|
||
--checkpointing_steps 1000 \ # 每 1000 步保存一次模型检查点
|
||
--gradient_accumulation_steps 1 \ # 梯度累计步数为 1,即每个 batch 后都会更新梯度
|
||
--learning_rate 1e-3 \ # 学习率设置为 0.001
|
||
--lr_scheduler cosine_with_restarts \ # 使用带重启的余弦学习率调度器
|
||
--lr_warmup_steps 200 \ # 在训练的前 200 步进行学习率预热
|
||
--lr_num_cycles 1 \ # 学习率周期设置为 1
|
||
--optimizer AdamW \ # 使用 AdamW 优化器
|
||
--adam_beta1 0.9 \ # 设置 Adam 优化器的 beta1 参数为 0.9
|
||
--adam_beta2 0.95 \ # 设置 Adam 优化器的 beta2 参数为 0.95
|
||
--max_grad_norm 1.0 \ # 最大梯度裁剪值设置为 1.0
|
||
--allow_tf32 \ # 启用 TF32 以加速训练
|
||
--report_to wandb # 使用 Weights and Biases 进行训练记录与监控
|
||
```
|
||
|
||
## 运行脚本,开始微调
|
||
|
||
单机(单卡,多卡)微调:
|
||
|
||
```shell
|
||
bash finetune_single_rank.sh
|
||
```
|
||
|
||
多机多卡微调:
|
||
|
||
```shell
|
||
bash finetune_multi_rank.sh #需要在每个节点运行
|
||
```
|
||
|
||
## 载入微调的模型
|
||
|
||
+ 请关注[cli_demo.py](../inference/cli_demo.py) 以了解如何加载微调的模型。
|
||
|
||
## 最佳实践
|
||
|
||
+ 包含70个分辨率为 `200 x 480 x 720`(帧数 x 高 x
|
||
宽)的训练视频。通过数据预处理中的帧跳过,我们创建了两个较小的49帧和16帧数据集,以加快实验速度,因为CogVideoX团队建议的最大帧数限制是49帧。我们将70个视频分成三组,分别为10、25和50个视频。这些视频的概念性质相似。
|
||
+ 25个及以上的视频在训练新概念和风格时效果最佳。
|
||
+ 现使用可以通过 `--id_token` 指定的标识符token进行训练效果更好。这类似于 Dreambooth 训练,但不使用这种token的常规微调也可以工作。
|
||
+ 原始仓库使用 `lora_alpha` 设置为 1。我们发现这个值在多次运行中效果不佳,可能是因为模型后端和训练设置的不同。我们的建议是将
|
||
lora_alpha 设置为与 rank 相同或 rank // 2。
|
||
+ 建议使用 rank 为 64 及以上的设置。
|
||
|