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 训练配置参数介绍

  1. resolutions
  • 作用:定义训练所用的图像分辨率,单位为图像的边长(用于正方形图像)。

  • 说明:支持设置多个分辨率,训练过程中图像会分别缩放至这些尺寸,进行多分辨率联合训练。

  • 示例

    resolutions = [656, 480] # 表示将图像分别缩放为 656×656 和 480×480 进行训练。
    
  1. enable_ar_bucket
  • 作用:是否启用**纵横比桶(Aspect Ratio Bucket)**机制。
  • 说明:启用后,系统将根据图像的纵横比动态调整输入大小,有助于适配不同形状的图像或视频帧。
  • 默认值true(建议开启)
  1. min_ar / max_ar
  • 作用:限定训练数据的最小/最大纵横比(宽高比)。

  • 说明:用于筛选图像或视频帧,防止极端比例样本干扰训练。

  • 默认值

    min_ar = 0.5  # 最小纵横比(如高宽比接近2:1)
    max_ar = 2.0  # 最大纵横比(如宽高比接近2:1)
    
  1. num_ar_buckets
  • 作用:设置纵横比桶的数量。

  • 说明:系统将根据 log 空间将允许的纵横比范围分为若干桶,图像根据自身比例分配至不同桶中进行训练。

  • 示例

    num_ar_buckets = 7	# 表示纵横比将划分为 7 个桶,提升对不同尺寸图像的适应性。
    
  1. frame_buckets
  • 作用:用于视频训练时的帧数分桶设置。

  • 说明:将不同帧数的视频划分至对应帧数桶中,确保训练时序列长度一致;图像则通常分配至长度为 1 的桶。

  • 示例

    frame_buckets = [31, 36]	# 表示支持帧长为 31 和 36 的视频样本输入。
    

这里桶的划分在训练过程中至关重要,尤其是在万相视频存在硬编码的前提下。由于系统要求每段视频严格为 16 帧每秒,因此建议尽可能保持数据集帧数的一致性,以减少帧桶数量。帧桶数量越多,训练时的显存和内存占用也会相应增加,可能导致资源浪费或训练不稳定。因此,建议将视频帧数控制在统一标准下,集中使用少量帧桶以提升训练效率与资源利用率。更多详细说明可参考 B 站关于万相 LoRA 训练的视频教程

  1. path
  • 作用:指定训练图像/视频及其对应字幕文件所在的路径。

  • 说明:字幕文件需与图像/视频同名,扩展名为 .txt。若无字幕文件,训练将使用空字符串作为描述继续进行。

  • 示例

    path = '/root/dir/wanlora'
    

    注意:请根据您本地的数据集路径修改该参数。

  1. mask_path
  • 作用:指定遮罩图像的存放路径。

  • 说明:遮罩应与训练图像文件同名(忽略扩展名),用于标记训练区域与忽略区域:白色为训练区域,黑色为遮挡区域,灰度表示加权区域。

  • 示例

    mask_path = '/home/anon/data/images/grayscale/masks
    

    注意:请根据您的实际数据集设置正确的路径。

  1. num_repeats
  • 作用:设定每个 epoch 中训练数据的重复次数。

  • 说明:增加此数值可增强样本的训练频率,相当于一种数据增强策略。

  • 示例

    num_repeats = 10 	# 表示数据将在每个 epoch 内重复 10 次。
    
  1. eval_every_n_epochs
  • 作用:每隔多少个 epoch 进行一次模型评估。

  • 示例

    eval_every_n_epochs = 1		# 表示每完成一个 epoch 就执行一次评估。
    
  1. eval_micro_batch_size_per_gpu
  • 作用:评估阶段每个 GPU 的微批量大小。

  • 说明:通常小于训练时的批量大小,用于适配评估所需的显存。

  • 示例

    eval_micro_batch_size_per_gpu = 1
    
  1. save_every_n_epochs
  • 作用:每隔多少个 epoch 保存一次模型权重。

  • 说明:适当调高可减少模型数量,节省磁盘空间。

  • 示例

    save_every_n_epochs = 2 	# 表示每两个 epoch 保存一次。
    
  1. checkpoint_every_n_minutes
  • 作用:每隔指定分钟保存一次训练检查点,用于防止意外中断造成进度丢失。

  • 示例

    checkpoint_every_n_minutes = 120 	# 表示每 120 分钟保存一次。
    
  1. activation_checkpointing
  • 作用:启用激活检查点机制,可降低显存占用。会略微增加计算开销。

  • 默认值true(建议开启)

  1. partition_method
  • 作用:指定 Deepspeed 如何将模型参数划分至多个 GPU。一般不需要修改。

  • 示例

    partition_method = 'parameters'
    
  1. steps_per_print
  • 作用:设定每隔多少训练步骤打印一次日志信息,用于监控训练进度。

  • 示例

    steps_per_print = 1		# 表示每一步都打印一次日志。
    

2.2 模型配置参数介绍

model

  1. type
  • 作用:指定主模型类型。

  • 示例

    type = 'wan'		#表示使用的是万相(Wan)系列模型。
    
  1. ckpt_path
  • 作用:设置主模型加载的预训练检查点路径。通常指向 .ckpt 或模型文件夹。

  • 示例

    ckpt_path = '/root/diffusion-pipe/submodules/Wan2_1/Wan2.1-I2V-14B-480P'
    
  1. dtype
  • 作用:定义主模型的权重数据精度。

  • 说明:使用 bfloat16 可减少显存消耗,并在部分硬件中保持良好精度。

  • 示例

    dtype = 'bfloat16'
    
  1. transformer_dtype
  • 作用:定义 Transformer 模块中权重的精度格式。

  • 说明:使用 float8 可进一步压缩模型,提高训练效率(需硬件支持)。

  • 示例

    transformer_dtype = 'float8'
    
  1. timestep_sample_method
  • 作用:定义 Diffusion 中时间步的采样策略。

  • 说明

    • logit_normal:对数正态分布(偏重中间步骤)
    • uniform:均匀分布(各时间步等概率)
  • 示例

    timestep_sample_method = 'logit_normal'
    

adapter

  1. type
  • 作用:指定适配器类型。

  • 说明:设置为 lora 表示使用 LoRA(Low-Rank Adaptation)进行轻量微调。

  • 示例

    type = 'lora'
    
  1. rank
  • 作用:设置 LoRA 的秩值(rank),表示中间矩阵维度。

  • 说明:秩越高,表达能力越强,但也更耗显存。

  • 示例

    rank = 32
    
  1. dtype(LoRA)
  • 作用:定义 LoRA 权重的数据精度,建议与主模型保持一致。

  • 示例

    dtype = 'bfloat16'
    
  1. init_from_existing
  • 作用:指定已有的 LoRA 权重路径,用于继续训练或微调。

  • 示例

    init_from_existing = '/data/diffusion_pipe_training_runs/something/epoch50'
    

optimizer

  1. type
  • 作用:定义优化器类型。

  • 说明AdamW8bitKahan 是一种内存优化型 8 位 AdamW 算法,适合大模型训练。

  • 示例

    type = 'AdamW8bitKahan'
    
  1. lr
  • 作用:设置优化器的初始学习率。

  • 示例

    lr = 2e-5
    
  1. betas
  • 作用:配置 Adam 优化器中的两个 β 值。

  • 说明

    • β1 控制一阶矩估计(动量)
    • β2 控制二阶矩估计(方差)
  • 示例

    betas = [0.9, 0.99]
    
  1. weight_decay
  • 作用:设置权重衰减系数,用于正则化,防止过拟合。

  • 示例

    weight_decay = 0.01
    
  1. stabilize
  • 作用:控制是否启用训练稳定化技巧(如梯度剪裁、平滑权重更新等),默认关闭。

  • 示例

    stabilize = false