跳到主要内容

微调 Open-Sora

创建包含 OpenSora 镜像的实例

  1. 登录潞晨云平台

    • 使用您的账号信息登录到潞晨云的管理控制台。
  2. 进入云主机界面

    • 在控制台中找到并点击进入“实例”的服务选项。
  3. 创建实例

    • 点击“创建实例”按钮开始创建新的算力机器实例。
  4. 配置实例

    • 选择合适的 GPU 类型,确保它满足您的运算需求。
    • 选择系统镜像时,挑选 OpenSora 镜像。
  5. 创建或选择共享存储(如果需要)

    • 如果之前已经创建了共享存储,可以直接跳过此步骤。
    • 否则,前往“共享存储”或者相应的存储服务页面,创建一个新的共享存储卷。
    • 创建时需注意设置好存储大小和其他参数,以适应多个实例同时访问的需求。
  6. 挂载共享存储

    • 在创建实例的过程中,允许您添加或挂载已有的存储卷。
    • 选择之前创建的共享存储,并正确配置挂载点。
  7. 初始化实例

    • 完成上述所有配置后,提交创建请求。
    • 实例创建完成后,通常会经历一个初始化过程,在这期间请耐心等待。
  8. 使用实例

    • 初始化完成后,您可以通过 SSH 或其他远程连接方式登录到新创建的实例。
    • 根据需要配置环境,并开始使用 OpenSora 镜像进行工作。

微调 OpenSora 训练配置

在 OpenSora 镜像中,已为多种训练和推理任务提供了详尽的配置选项。具体配置文件位于 ~/Open-Sora/configs 目录下。本文档将指导如何使用 opensora-v1-2/train/stage3.py 中的配置来微调个性化 OpenSora 模型。

1. 数据集配置

dataset = dict(
type="VariableVideoTextDataset",
transform_name="resize_crop",
)

说明:

  • 类型:指定训练数据集的类型。在此配置中,使用了一个可变视频文本数据集,这意味着数据集中的视频和文本内容可以有不同的长度和格式。
  • 转换:transform_name="resize_crop" 表示在数据加载过程中应用的变换操作。这里执行的是缩放和裁剪,目的是将视频帧调整至统一尺寸。

注意:本文档使用的是 OpenSora 镜像中已处理的数据集。如需创建个性化训练数据集,请参照数据处理指南

2. 桶配置

bucket_config = {  # 20s/it
"144p": {1: (1.0, 475), 51: (1.0, 51), 102: (1.0, 27), 204: (1.0, 13), 408: (1.0, 6)},
"256": {1: (1.0, 297), 51: (0.5, 20), 102: (0.5, 10), 204: (0.5, 5), 408: ((0.5, 0.5), 2)},
"240p": {1: (1.0, 297), 51: (0.5, 20), 102: (0.5, 10), 204: (0.5, 5), 408: ((0.5, 0.4), 2)},
"360p": {1: (1.0, 141), 51: (0.5, 8), 102: (0.5, 4), 204: (0.5, 2), 408: ((0.5, 0.3), 1)},
"512": {1: (1.0, 141), 51: (0.5, 8), 102: (0.5, 4), 204: (0.5, 2), 408: ((0.5, 0.2), 1)},
"480p": {1: (1.0, 89), 51: (0.5, 5), 102: (0.5, 3), 204: ((0.5, 0.5), 1), 408: (0.0, None)},
"720p": {1: (0.3, 36), 51: (0.2, 2), 102: (0.1, 1), 204: (0.0, None)},
"1024": {1: (0.3, 36), 51: (0.1, 2), 102: (0.1, 1), 204: (0.0, None)},
"1080p": {1: (0.1, 5)},
"2048": {1: (0.05, 5)},
}

说明:

  • 定义:此配置定义了不同分辨率视频的处理方式。每个分辨率对应一个字典,其中键为帧数,值为一个元组,表示保留率和最大批量大小。
  • 保留率:控制视频被分配到特定桶的概率。
  • 最大批量大小:控制每个桶的批处理大小。例如,对于 480p 分辨率的 102 帧视频,最大批处理大小为 3。

建议:根据您的数据集特性和硬件资源选择合适的桶配置。例如,如果您的数据集包含大量低分辨率视频,可以适当增加低分辨率视频的保留率和最大批量大小。

3. 梯度检查点技术

grad_checkpoint = True

说明:当内存受限时,建议启用梯度检查点技术。

4. 加速设置

num_workers = 4
num_bucket_build_workers = 16
dtype = "bf16"
plugin = "zero2"

说明:

  • num_workers:确定分布式场景下的数据采样线程数。本配置适用于四卡数据并行(由数据并行度确定)。
  • num_bucket_build_workers:构建桶索引时使用的线程数。增加线程数可加快索引构建速度,但也消耗更多资源。
  • dtype:使用的数值类型。bf16 可减少内存占用和计算时间,并且防止梯度溢出。
  • plugin:使用的 ColossalAI 加速插件。zero2 是一种高效的分布式训练技术,有助于减少内存占用

5. 模型配置

model = dict(
type="STDiT3-XL/2",
from_pretrained="hpcai-tech/OpenSora-STDiT-v3",
qk_norm=True,
enable_flash_attn=True,
enable_layernorm_kernel=True,
freeze_y_embedder=True,
)

vae = dict(
type="OpenSoraVAE_V1_2",
from_pretrained="hpcai-tech/OpenSora-VAE-v1.2",
micro_frame_size=17,
micro_batch_size=4,
)

text_encoder = dict(
type="t5",
from_pretrained="DeepFloyd/t5-v1_1-xxl",
model_max_length=300,
shardformer=True,
)

scheduler = dict(
type="rflow",
use_timestep_transform=True,
sample_method="logit-normal",
)

Open-Sora 使用的模型可在 Hugging Face 中下载,模型名称对应如下:

TypeModel NameSTDiT3-XL/2hpcai-tech/OpenSora-STDiT-v3OpenSoraVAE_V1_2hpcai-tech/OpenSora-VAE-v1.2t5DeepFloyd/t5-v1_1-xxl

说明:可在 common data 中找到对应模型,并更新对应的 from_pretrained 路径。

6. 掩码设置

Python复制
mask_ratios = {
"random": 0.01,
"intepolate": 0.002,
"quarter_random": 0.002,
"quarter_head": 0.002,
"quarter_tail": 0.002,
"quarter_head_tail": 0.002,
"image_random": 0.0,
"image_head": 0.22,
"image_tail": 0.005,
"image_head_tail": 0.005,
}

说明:通过在训练时添加噪声,增强模型的鲁棒性。

7. 实验管理

seed = 42
outputs = "outputs"
wandb = False
epochs = 1000
log_every = 10
ckpt_every = 200

说明:

  • seed:设置随机种子以确保结果的可复现性。
  • outputs:输出目录,用于保存训练过程中生成的日志文件和模型检查点。
  • wandb:是否使用 WandB 进行实验跟踪。
  • epochs:总的训练轮次。
  • log_every:每多少个迭代轮次打印一次日志。
  • ckpt_every:每多少个迭代轮次保存一次检查点。

8. 优化设置

load = None
grad_clip = 1.0
lr = 1e-4
ema_decay = 0.99
adam_eps = 1e-15
warmup_steps = 1000

说明:

  • load:从何处加载模型权重。若设为 None,则从头开始微调。
  • grad_clip:梯度裁剪值,防止梯度爆炸。
  • lr:学习率,影响模型的收敛速度和性能。
  • ema_decay:指数移动平均的衰减率,平滑模型更新。
  • adam_eps:Adam 优化器的 ε 值,防止除零错误。
  • warmup_steps:学习率预热步数,避免训练初期的不稳定。

训练启动命令

以使用开源 Disney 数据为例,请上传 Disney-VideoGeneration-Dataset.zip 到 /root,并解压。同时,上传 modified_data.csv 到 /root。

torchrun --standalone --nproc_per_node 4 scripts/train.py configs/opensora-v1-2/train/stage3.py --data-path modified_data.csv

说明:

  • --standalone:允许 torchrun 自动配置环境变量(仅限单机模式)。
  • --nproc_per_node:指定使用的 GPU 数量。
  • scripts/train.py:OpenSora 提供的训练脚本。
  • configs/opensora-v1-2/train/stage3.py:配置文件路径。
  • --data-path:指定数据集的路径。

img.png

表明训练已开始。