WanVideo/HunyuanVideo LoRA训练(二) 数据集构建与训练参数配置
前言
万相 LoRA 模型的训练原则与 Flux LoRA 保持一致,均强调在数据集准备前需充分识别和区分主要特征与次要特征。相关内容在 **B 站教学视频**中已有详细讲解,建议多次复习以加深理解。
在万相的视频训练中,还需特别注意其采用硬编码的 16 帧率机制,因此数据集中的**视频素材必须严格按照 16 帧每秒进行帧率控制。**若帧率不符合要求,即便帧数充足,仍有可能被训练流程自动丢弃。
综上所述,万相 LoRA 的训练过程中存在诸多容易被忽略的细节问题,建议参考本篇文章进行操作,确保训练顺利完成。
一、数据集构建
在万相的 LoRA 模型训练中,由于采用了硬编码的帧率限制,所有数据集的视频素材必须严格控制在 16 帧每秒。如果帧率超过该值,例如一个 20 帧/秒、时长 2 秒的视频,总帧数为 40 帧,系统会强制将其降采样至 16 帧/秒,最终只保留 32 帧。
在此基础上,如果训练流程还涉及分桶(bucket)处理,如果视频总帧数不足 33 帧,很可能会被直接丢弃。由此可见,数据集的帧率和总帧数必须严格符合要求,否则将导致数据无法参与训练。因此,务必在数据准备阶段精准控制帧率,确保视频素材符合万相训练的规范。
由于本次实验旨在训练一个爆炸效果的 LoRA 模型,因此所有数据集均选用了包含不同物体爆炸场景的视频素材。在视频领域中,不同状态或动作的细微差别都需要尽可能明确地加以描述,这也对提示词的表达能力提出了更高要求。
与图像 LoRA 模型训练类似,视频训练同样需要为目标特征设定一个独特且统一的触发词。本次训练中所使用的触发词为 “pilipala”,用以表示爆炸效果的关键特征。除了爆炸本身,提示词还应覆盖视频中具有一致性的辅助特征,以增强模型的理解能力。例如,在本次数据集中,背景均为黑色,因此提示词中需明确包含该元素。
以上面视频为例,完整提示词为:
“a bottle filled with flowers is placed on the table against a black background pilipala,”
该提示词不仅描述了场景中的物体、背景与摆放位置,同时通过触发词“pilipala”引导模型学习爆炸特效的表现形式。
数据集的核心在于质量控制,其中包括分辨率的统一、帧数的规范处理以及标签的准确标注。这些因素将直接影响 LoRA 模型的训练效果与最终结果的稳定性与可控性。对于尚不清楚操作细节的同学,建议反复观看该**视频教程**,加深理解并确保操作规范。
二、参数配置介绍
在万相的 LoRA 模型训练仓库 Diffusion-Pipe 中,有两个关键配置文件需要进行设置:数据集配置文件与训练参数配置文件,二者均位于 diffusion-pipe/examples
目录下。下面将对这两个文件中的核心参数进行尽可能详尽的说明与解析。
2.1 训练配置参数介绍
- resolutions
-
作用:定义训练所用的图像分辨率,单位为图像的边长(用于正方形图像)。
-
说明:支持设置多个分辨率,训练过程中图像会分别缩放至这些尺寸,进行多分辨率联合训练。
-
示例:
resolutions = [656, 480] # 表示将图像分别缩放为 656×656 和 480×480 进行训练。
- enable_ar_bucket
- 作用:是否启用**纵横比桶(Aspect Ratio Bucket)**机制。
- 说明:启用后,系统将根据图像的纵横比动态调整输入大小,有助于适配不同形状的图像或视频帧。
- 默认值:
true
(建议开启)
- min_ar / max_ar
-
作用:限定训练数据的最小/最大纵横比(宽高比)。
-
说明:用于筛选图像或视频帧,防止极端比例样本干扰训练。
-
默认值:
min_ar = 0.5 # 最小纵横比(如高宽比接近2:1) max_ar = 2.0 # 最大纵横比(如宽高比接近2:1)
- num_ar_buckets
-
作用:设置纵横比桶的数量。
-
说明:系统将根据 log 空间将允许的纵横比范围分为若干桶,图像根据自身比例分配至不同桶中进行训练。
-
示例:
num_ar_buckets = 7 # 表示纵横比将划分为 7 个桶,提升对不同尺寸图像的适应性。
- frame_buckets
-
作用:用于视频训练时的帧数分桶设置。
-
说明:将不同帧数的视频划分至对应帧数桶中,确保训练时序列长度一致;图像则通常分配至长度为 1 的桶。
-
示例:
frame_buckets = [31, 36] # 表示支持帧长为 31 和 36 的视频样本输入。
这里桶的划分在训练过程中至关重要,尤其是在万相视频存在硬编码的前提下。由于系统要求每段视频严格为 16 帧每秒,因此建议尽可能保持数据集帧数的一致性,以减少帧桶数量。帧桶数量越多,训练时的显存和内存占用也会相应增加,可能导致资源浪费或训练不稳定。因此,建议将视频帧数控制在统一标准下,集中使用少量帧桶以提升训练效率与资源利用率。更多详细说明可参考 B 站关于万相 LoRA 训练的视频教程。
- path
-
作用:指定训练图像/视频及其对应字幕文件所在的路径。
-
说明:字幕文件需与图像/视频同名,扩展名为
.txt
。若无字幕文件,训练将使用空字符串作为描述继续进行。 -
示例:
path = '/root/dir/wanlora'
注意:请根据您本地的数据集路径修改该参数。
- mask_path
-
作用:指定遮罩图像的存放路径。
-
说明:遮罩应与训练图像文件同名(忽略扩展名),用于标记训练区域与忽略区域:白色为训练区域,黑色为遮挡区域,灰度表示加权区域。
-
示例:
mask_path = '/home/anon/data/images/grayscale/masks
注意:请根据您的实际数据集设置正确的路径。
- num_repeats
-
作用:设定每个 epoch 中训练数据的重复次数。
-
说明:增加此数值可增强样本的训练频率,相当于一种数据增强策略。
-
示例:
num_repeats = 10 # 表示数据将在每个 epoch 内重复 10 次。
- eval_every_n_epochs
-
作用:每隔多少个 epoch 进行一次模型评估。
-
示例:
eval_every_n_epochs = 1 # 表示每完成一个 epoch 就执行一次评估。
- eval_micro_batch_size_per_gpu
-
作用:评估阶段每个 GPU 的微批量大小。
-
说明:通常小于训练时的批量大小,用于适配评估所需的显存。
-
示例:
eval_micro_batch_size_per_gpu = 1
- save_every_n_epochs
-
作用:每隔多少个 epoch 保存一次模型权重。
-
说明:适当调高可减少模型数量,节省磁盘空间。
-
示例:
save_every_n_epochs = 2 # 表示每两个 epoch 保存一次。
- checkpoint_every_n_minutes
-
作用:每隔指定分钟保存一次训练检查点,用于防止意外中断造成进度丢失。
-
示例:
checkpoint_every_n_minutes = 120 # 表示每 120 分钟保存一次。
- activation_checkpointing
-
作用:启用激活检查点机制,可降低显存占用。会略微增加计算开销。
-
默认值:
true
(建议开启)
- partition_method
-
作用:指定 Deepspeed 如何将模型参数划分至多个 GPU。一般不需要修改。
-
示例:
partition_method = 'parameters'
- steps_per_print
-
作用:设定每隔多少训练步骤打印一次日志信息,用于监控训练进度。
-
示例:
steps_per_print = 1 # 表示每一步都打印一次日志。
2.2 模型配置参数介绍
【model】
- type
-
作用:指定主模型类型。
-
示例:
type = 'wan' #表示使用的是万相(Wan)系列模型。
- ckpt_path
-
作用:设置主模型加载的预训练检查点路径。通常指向
.ckpt
或模型文件夹。 -
示例:
ckpt_path = '/root/diffusion-pipe/submodules/Wan2_1/Wan2.1-I2V-14B-480P'
- dtype
-
作用:定义主模型的权重数据精度。
-
说明:使用
bfloat16
可减少显存消耗,并在部分硬件中保持良好精度。 -
示例:
dtype = 'bfloat16'
- transformer_dtype
-
作用:定义 Transformer 模块中权重的精度格式。
-
说明:使用
float8
可进一步压缩模型,提高训练效率(需硬件支持)。 -
示例:
transformer_dtype = 'float8'
- timestep_sample_method
-
作用:定义 Diffusion 中时间步的采样策略。
-
说明:
logit_normal
:对数正态分布(偏重中间步骤)uniform
:均匀分布(各时间步等概率)
-
示例:
timestep_sample_method = 'logit_normal'
【adapter】
- type
-
作用:指定适配器类型。
-
说明:设置为
lora
表示使用 LoRA(Low-Rank Adaptation)进行轻量微调。 -
示例:
type = 'lora'
- rank
-
作用:设置 LoRA 的秩值(rank),表示中间矩阵维度。
-
说明:秩越高,表达能力越强,但也更耗显存。
-
示例:
rank = 32
- dtype(LoRA)
-
作用:定义 LoRA 权重的数据精度,建议与主模型保持一致。
-
示例:
dtype = 'bfloat16'
- init_from_existing
-
作用:指定已有的 LoRA 权重路径,用于继续训练或微调。
-
示例:
init_from_existing = '/data/diffusion_pipe_training_runs/something/epoch50'
【optimizer】
- type
-
作用:定义优化器类型。
-
说明:
AdamW8bitKahan
是一种内存优化型 8 位 AdamW 算法,适合大模型训练。 -
示例:
type = 'AdamW8bitKahan'
- lr
-
作用:设置优化器的初始学习率。
-
示例:
lr = 2e-5
- betas
-
作用:配置 Adam 优化器中的两个 β 值。
-
说明:
- β1 控制一阶矩估计(动量)
- β2 控制二阶矩估计(方差)
-
示例:
betas = [0.9, 0.99]
- weight_decay
-
作用:设置权重衰减系数,用于正则化,防止过拟合。
-
示例:
weight_decay = 0.01
- stabilize
-
作用:控制是否启用训练稳定化技巧(如梯度剪裁、平滑权重更新等),默认关闭。
-
示例:
stabilize = false