Self-Forcing / experiment.md
Cccccz's picture
Add files using upload-large-folder tool
d1d122e verified
|
Raw
History Blame Contribute Delete
21.6 kB

Self-Forcing DMD / FRRF / Predictor v4 实验记录

结果总览

数据划分与统一设置

  • 训练集:从 vidprom_filtered_extended.txt 以随机种子 0 采样的 1000 条提示词。
  • 本文只展示验证集结果:MovieGenVideoBench_extended.txt 第 101–200 条非空提示词,即 Python 切片 [100:200];保存在 prompts/MovieGenVideoBench_extended_101_200.txt
  • 训练集与该验证集的精确字符串重合数为 0。
  • 评测使用随机种子 0、每条提示词生成 1 个 81 帧、832 × 480 视频,并在 VBench custom_input 模式下计算相同六个维度。
  • 六维均值是六项等权算术平均,仅用于本实验横向比较,不是 VBench 官方加权总分。

预测器与速度场复用调度的首个分块均为 FFFF,FPPF/FPPP/FRRF/FRRR 描述其后续分块;FFFF 则在所有分块都使用完整生成器。F 表示完整 生成器,P 表示预测器,R 表示复用同一分块第一步的速度场。

验证集(第 101–200 条)VBench

训练方案 推理方式 主体一致性 背景一致性 运动平滑度 动态程度 美学质量 成像质量 六维均值 相对 FFFF
DMD 基线 FFFF 0.9317 0.9443 0.9762 0.7000 0.6204 0.7004 0.8122 0.0000
无需训练(速度场复用) FRRF 0.9079 0.9334 0.9729 0.7100 0.6167 0.6865 0.8046 -0.0076
阶段 1 FPPF 0.9186 0.9409 0.9803 0.7100 0.6132 0.6908 0.8089 -0.0032
阶段 2-A 在线策略 FPPF 0.9161 0.9400 0.9820 0.7000 0.6120 0.6873 0.8062 -0.0060
阶段 2-B 离线 FFFF FPPF 0.8959 0.9319 0.9825 0.6900 0.6086 0.6741 0.7972 -0.0150
无需训练(速度场复用) FRRR 0.5739 0.7704 0.9179 1.0000 0.4117 0.4464 0.6867 -0.1255
阶段 1 FPPP 0.8239 0.8979 0.9744 0.5100 0.5619 0.6636 0.7386 -0.0736
阶段 2-A 在线策略 FPPP 0.8420 0.9074 0.9815 0.4400 0.5516 0.6238 0.7244 -0.0878
阶段 2-B 离线 FFFF FPPP 0.7767 0.8816 0.9820 0.2900 0.4873 0.5085 0.6544 -0.1578

在验证集上,阶段 1 FPPF 的运动平滑度比 FFFF 高 0.0041,动态程度高 0.01;其均值损失主要来自主体一致性、美学质量和成像质量。阶段 2-A FPPF 的动态程度与 FFFF 相同,但其余质量项略低。

与 FFFF 的逐帧相似度

每个方案均按同名视频和帧位置与验证集 FFFF 配对,统计 100 个视频、8,100 对原始分辨率 RGB 帧。PSNR/SSIM 越高、LPIPS 越低 表示越接近 FFFF,但这些指标不代表对真实视频的保真度。

训练方案 推理方式 VBench 六维均值 PSNR SSIM LPIPS
无需训练(速度场复用) FRRF 0.8046 18.2527 0.5706 0.2828
阶段 1 FPPF 0.8089 18.8213 0.6032 0.2497
阶段 2-A 在线策略 FPPF 0.8062 18.9809 0.6105 0.2497
阶段 2-B 离线 FFFF FPPF 0.7972 19.1423 0.6066 0.2721
无需训练(速度场复用) FRRR 0.6867 14.6036 0.2631 0.6725
阶段 1 FPPP 0.7386 18.3280 0.5483 0.3371
阶段 2-A 在线策略 FPPP 0.7244 18.7079 0.5867 0.3362
阶段 2-B 离线 FFFF FPPP 0.6544 18.7494 0.5700 0.4340

结论

  1. 质量上限仍是 FFFF。 它在验证集上的六维均值为 0.8122。
  2. 当前推荐部署阶段 1 FPPF。 它是验证集上最接近 FFFF 的 方案,均值为 0.8089,比 FFFF 低 0.0032。
  3. FRRF 是当前最好的无预测器复用方案。 它的均值为 0.8046, 比 FFFF 低 0.0076,比阶段 1 FPPF 低 0.0044;其动态程度为 0.7100,但主体一致性、背景一致性、运动平滑度和成像质量仍低于 FFFF。
  4. FRRR 不适合当前部署。 虽然其动态程度达到 1.0000,但六维均值 只有 0.6867;相对 FFFF 的 PSNR/SSIM/LPIPS 也恶化到 14.6036/0.2631/0.6725,说明连续三步复用导致明显漂移。
  5. 阶段 2 展开训练仍未超过阶段 1。 阶段 2-A 在线策略 FPPF 比阶段 1 FPPF 低 0.0027;阶段 2-B 低 0.0118。
  6. 阶段 2 内部仍是在线策略优于固定的离线 FFFF 标签。 验证集中,FPPF 高 0.0090,FPPP 高 0.0700。
  7. P3 暂时不能替代最终的完整模型步骤。 同一检查点从 FPPF 改为 FPPP 后,验证集均值在阶段 1、阶段 2-A、阶段 2-B 分别 下降 0.0703、0.0818、0.1428。
  8. 当前结论来自 100 条独立验证提示词、单一随机种子、每条单样本; 正式报告统计显著性时仍建议补充多随机种子实验或置信区间。

训练完成状态

模型 训练标签 步数 最终损失 推荐推理方式 状态
阶段 1 离线 FFFF 相邻步骤 2000 0.0635 FPPF(当前最佳) 已完成并同步
阶段 2-A 在线策略完整教师模型 2000 0.0787 FPPF(次选) 已完成并同步
阶段 2-B 固定离线 FFFF 2000 0.3685 不推荐 已完成并同步

这些损失来自不同监督目标,不能把其绝对值直接当作模型质量差异;部署 选择以上述统一 VBench 评测为准。

结果入口

  • 完整实验记录和配置:本文后续“详细实验记录”
  • 验证集(第 101–200 条)机器可读汇总: evaluation_results/moviegen_101_200/summary.json
  • 验证集完整流水线日志: evaluation_results/moviegen_101_200/evaluation_suite.logevaluation_results/moviegen_101_200/reuse_schedules_evaluation.log
  • 验证集提示词清单与清单文件: prompts/MovieGenVideoBench_extended_101_200.txtprompts/MovieGenVideoBench_extended_101_200.json
  • 验证集九组视频: videos/moviegenvideobench_extended_101_200_dmd_*_seed0

已完成事项(原待办)

首个分块全为完整模型步骤的 FRRF / FRRR

状态:已完成。评测于 2026-07-29T04:12:19Z 开始,于 2026-07-29T04:37:17Z 完成。

所需调度:

FRRF:分块 0 为 F-F-F-F;分块 1–6 为 F-R-R-F
FRRR:分块 0 为 F-F-F-F;分块 1–6 为 F-R-R-R

其中,R 表示复用同一分块第 0 步预测的速度场。两种调度的最终干净上下文 更新仍使用完整生成器。

  • 增加明确的 frrf / frrr 速度场复用调度。
  • 强制两种调度的首个分块均使用 FFFF。
  • 增加调度测试和随机种子 0 的空跑测试。
  • 增加可恢复的九方案评测与汇总支持。
  • 使用八张 GPU,在验证集第 101–200 条提示词上生成 FRRF 和 FRRR 视频。
  • 验证每个样本(包括 FFFF 和两种复用调度)都在生成初始噪声前, 将所有随机数生成器重置为随机种子 0。
  • 验证每种调度均有 100 个视频,每个视频为 81 帧、832 × 480。
  • 运行 VBench 的六个维度。
  • 以已有的随机种子 0 验证集 FFFF 为参照,计算 PSNR/SSIM/LPIPS;每种调度统计 100 个视频和 8,100 对配对帧。
  • 更新 evaluation_results/moviegen_101_200/summary.json
  • 替换“结果总览”中的 FRRF 行,增加 FRRR,并更新结论。

“结果总览”已替换为新协议结果。旧 FRRF 调度的产物仍保留,但不再纳入 九方案汇总。

输出目录:

videos/moviegenvideobench_extended_101_200_dmd_frrf_chunk0_ffff_seed0
videos/moviegenvideobench_extended_101_200_dmd_frrr_chunk0_ffff_seed0

配对结果文件:

evaluation_results/moviegen_101_200/ffff_vs_frrf_chunk0_ffff_psnr_ssim_lpips.json
evaluation_results/moviegen_101_200/ffff_vs_frrr_chunk0_ffff_psnr_ssim_lpips.json

运行入口:

  • scripts/run_moviegen_first100_dmd_frrf.sh
  • scripts/run_moviegen_first100_dmd_frrr.sh
  • scripts/run_moviegen_101_200_evaluation.sh
  • scripts/wait_and_run_moviegen_101_200_reuse_schedules.sh

详细实验记录

Predictor v4:1000 条提示词的离线训练

  • 提示词来源:prompts/vidprom_filtered_extended.txt
  • 选取方式:使用 random.Random(0).sample 选取 1000 条非空记录
  • 留出集排除规则:排除与 prompts/MovieGenVideoBench_extended.txt 前 100 条非空提示词完全 相同的记录
  • 构建后重合检查:训练提示词与基准集第 1–100 条、第 101–200 条的精确 重合数均为 0/100;与整个 1003 条提示词基准文件的精确重合数也为 0
  • 生成随机种子:每个样本均重置为 0
  • 选中提示词数 / 唯一提示词数:1000 / 1000
  • cases.jsonl SHA-256: e1d9cd6b5261b513f8d2983dde2fbc7e05e19e3c966ad041f9cd8040d2a01cbe
  • 数据集根目录: /mnt/local_nvme/zoubin/cz/self_forcing_predictor_v4_1000_seed0
  • 预测器源模块:[1, 28]
  • 捕获干净预特征的候选模块:[0, 1, 28, 29]
  • 教师轨迹:7 个各含 3 个潜空间帧的分块,每个分块执行 4 个完整模型步骤
  • 训练清单:使用分块 1–6,每个分块包含 3 个相邻状态转换;预计得到 6000 条分块记录 / 18000 对训练数据
  • NVMe 训练输出: /mnt/local_nvme/zoubin/cz/self_forcing_predictor_v4_training_1000_seed0
  • 最终同步的数据集: data/self_forcing_predictor_v4_1000_seed0
  • 最终同步的训练输出: checkpoints/predictor_v4_1000_seed0
  • 端到端监督进程 PID:1251561
  • 监督进程日志: checkpoints/predictor_v4_1000_seed0/end_to_end.log
  • 启动时间:2026-07-24T10:19:58Z
  • 初始状态:由于 8 张 H100 GPU 均被已有的 HY-WorldPlay 预测器训练 任务占用,因此进入排队状态。监督进程在等待期间不占用 GPU 显存。
  • GPU 冒烟测试和 1000 个样本的八卡离线构建均已成功完成。验证后的数据集 包含 7000 条分块记录,以及 6000 个训练分块 / 18000 对相邻步骤数据。
  • 历史状态:数据集构建完成后按要求暂停训练;后续正式训练取代了这一暂停 状态。
  • 暂停前的一次短训练运行到第 90 步,尚未到达第 100 步的首个检查点。 其日志保存在 /mnt/local_nvme/zoubin/cz/self_forcing_predictor_v4_training_1000_seed0/aborted_step90_20260724T142101Z; 后续从头训练不会恢复该运行的任何权重。

正式八卡训练

  • 启动时间:2026-07-25T13:16:41Z
  • GPU:8 × NVIDIA H100 80GB
  • 单卡批大小:16
  • 全局批大小:128
  • 梯度累积步数:1
  • 最大训练步数:2000
  • 训练从全新初始化开始,不恢复已归档的第 90 步运行。
  • 批大小验证:单卡运行 36 步,覆盖全部 6 个上下文长度桶,并且没有发生 显存不足。PyTorch 峰值显存约为 35.18 GiB。
  • 正式运行第 10 步状态:损失 1.7726008478、流匹配均方误差 1.7364688764、隐藏状态均方误差 0.3613196773、平均微步耗时 0.9235374251 秒、PyTorch 峰值显存 35.18 GiB。采样检查时 8 张 GPU 的利用率均为 100%。
  • SwanLab 项目: https://swanlab.cn/@ZhuoChen/Self-Forcing-Predictor-v4
  • SwanLab 运行记录: https://swanlab.cn/@ZhuoChen/Self-Forcing-Predictor-v4/runs/4h9zkrjp
  • 监督进程 PID:3351068
  • 监督进程日志: checkpoints/predictor_v4_1000_seed0/training_and_sync.log
  • 训练日志: /mnt/local_nvme/zoubin/cz/self_forcing_predictor_v4_training_1000_seed0/train_log.jsonl
  • 每 100 步将检查点写入 NVMe。第 2000 步完成后,监督进程会自动将数据集 和训练产物同步到上文列出的项目路径。

批大小 32 续训

  • 批大小为 16 的运行在记录第 320 步后被主动停止。最近的完整检查点为 第 300 步,因此从第 300 步的完整状态继续训练,包括模型、优化器、 学习率调度器、训练轮次位置和各进程随机数生成器状态。
  • 恢复时间:2026-07-25T13:35:17Z
  • 单卡批大小:32
  • 全局批大小:256
  • 梯度累积步数:1
  • 第 330 步验证:损失 0.1543566273、平均微步耗时 1.9139812439 秒、 PyTorch 峰值显存 68.46 GiB。
  • 驱动报告的显存稳定在每张 GPU 约 76.5 GiB。训练跨越多个上下文长度桶 时没有发生显存不足,8 个工作进程均保持活跃。
  • SwanLab 运行记录: https://swanlab.cn/@ZhuoChen/Self-Forcing-Predictor-v4/runs/zd7a5ge6
  • 监督进程 PID:3358910

批大小 32 从头重训

  • 上述续训在记录第 870 步后按要求停止,其完整文件和检查点保存在: /mnt/local_nvme/zoubin/cz/self_forcing_predictor_v4_training_archives/bs16_then_bs32_resume_stopped_step870_20260725
  • 重新启动时间:2026-07-25T14:41:01Z
  • 恢复设置:null
  • 启动前输出目录为空,新日志从全局第 1 步开始。
  • 单卡批大小:32
  • 全局批大小:256
  • 第 10 步状态:损失 1.7685708122、流匹配均方误差 1.7325291700、 隐藏状态均方误差 0.3604163701、平均微步耗时 1.8527149781 秒、 PyTorch 峰值显存 68.46 GiB。
  • SwanLab 运行记录: https://swanlab.cn/@ZhuoChen/Self-Forcing-Predictor-v4/runs/4kxa9v7b
  • 监督进程 PID:3380489
  • 最终状态:从头训练至第 2000 步,并于 2026-07-25T19:52:55Z 完成同步。
  • 最终损失:0.0635068361
  • 最终检查点: checkpoints/predictor_v4_1000_seed0/predictor_step_02000.safetensors

Predictor v4 阶段 2:分离梯度的 FPPP 展开训练

  • 实现日期:2026-07-25
  • 阶段 2 的两个训练版本分别从阶段 1 第 2000 步的 FP32 模型状态独立 初始化,均不继承阶段 1 的优化器、学习率调度器、训练轮次或全局步数。
  • 训练展开调度固定为:
    • 分块 0:F-F-F-F
    • 分块 1–6:F-P-P-P
  • P1、P2 和 P3 均接受隐藏状态与流匹配监督。
  • 在每个时间步和分块边界,预测器隐藏状态、预测的干净潜变量和上一分块的 隐藏状态都会分离梯度。
  • 每条轨迹包含 18 个受监督状态: 6 个训练分块 × 3 个预测器时间步
  • 持久历史只包含以下 K/V:将最终干净分块潜变量在上下文时间步 0 输入冻结 的完整生成器后写入的 K/V。中间时间步的 K/V 只存在于临时工作区。
  • 在线时间步使用以下精确 FP32 值: [1000.0, 937.5, 833.3333129882812, 625.0]
  • 每条提示词的初始噪声和转换噪声都精确复现推理时随机种子 0 的随机数序列。

两个相互独立的八卡训练版本均已成功完成:

版本 训练展开调度 监督方式 最终步数 最终损失
阶段 2-A FPPP 在当前学生状态上查询完整教师模型 2000 0.0786837618
阶段 2-B FPPP 使用已保存的离线 FFFF 轨迹中的固定隐藏状态与流匹配目标 2000 0.3684817659

通用训练配置:

8 张 GPU
每张 GPU 1 条轨迹
每个全局优化步骤 8 条轨迹
2000 个优化步骤
融合模块学习率 5e-5
预测器模块学习率 5e-6
100 步线性预热 + 余弦衰减
BF16 激活值
FP32 可训练参数和 AdamW 状态
随机种子 0
每 100 步保存一次

阶段 2 输出根目录:

/mnt/local_nvme/zoubin/cz/self_forcing_predictor_v4_stage2_onpolicy_fppp_1000_seed0
/mnt/local_nvme/zoubin/cz/self_forcing_predictor_v4_stage2_offline_ffff_fppp_1000_seed0
checkpoints/predictor_v4_stage2_onpolicy_fppp_1000_seed0
checkpoints/predictor_v4_stage2_offline_ffff_fppp_1000_seed0

分离梯度训练监督进程在占用 8 张 GPU 前会等待以下条件全部满足:

  1. NVMe 中阶段 1 的 training_latest.pt 明确记录第 2000 步;
  2. NVMe 中存在 predictor_step_02000.safetensors
  3. 阶段 1 产物已完成向项目目录的同步;
  4. 阶段 1 训练与同步监督进程已经退出;
  5. 阶段 2 实现的就绪标记已经存在。

随后,监督进程先为每种监督模式各运行一次完整的八卡轨迹冒烟测试,再依次 训练并同步阶段 2-A 和阶段 2-B。

  • 阶段 2 监督进程 PID:3442042(已成功退出)
  • 监督进程日志: checkpoints/predictor_v4_stage2_suite/wait_and_train.log
  • 等待脚本: scripts/wait_stage1_then_run_stage2.sh
  • 套件脚本: scripts/run_predictor_v4_stage2_suite.sh
  • 就绪标记: checkpoints/predictor_v4_stage2_code.ready
  • 就绪状态:通过 Python 编译、Shell 语法、离线目标形状与数据类型、 缓存分离梯度以及随机种子 0 精确噪声序列检查后释放。两个强制自动八卡 轨迹冒烟测试也均已通过。
  • 阶段 2-A 于 2026-07-26T10:02:29Z 完成同步。
  • 阶段 2-B 及完整套件于 2026-07-26T11:34:47Z 完成同步。
  • 阶段 2-A SwanLab: https://swanlab.cn/@ZhuoChen/Self-Forcing-Predictor-v4/runs/vx0szxt9
  • 阶段 2-B SwanLab: https://swanlab.cn/@ZhuoChen/Self-Forcing-Predictor-v4/runs/lhs9t5au
  • SwanLab 拒绝了每一步中字符串类型的 supervision_mode 指标。这只影响 日志记录;数值指标、最终检查点、上传、验证和同步均已成功完成。

每个训练完成的检查点都支持以下两种部署调度:

FPPF:F0 -> P1 -> P2 -> F3
FPPP:F0 -> P1 -> P2 -> P3

MovieGen 验证集评测

  • 初始评测日期:2026-07-26
  • 初始评测时间段:2026-07-26T16:23:11Z2026-07-26T17:35:53Z
  • FRRF/FRRR 新协议补充评测时间段:2026-07-29T04:12:19Z2026-07-29T04:37:17Z
  • 提示词来源:prompts/MovieGenVideoBench_extended.txt
  • 提示词范围:按从 1 开始计数的第 101–200 条非空记录,共 100 条唯一 提示词
  • 提示词文件:prompts/MovieGenVideoBench_extended_101_200.txt
  • 提示词 SHA-256: a3fef56aa8c4a33a8245391888f6f998e2a6a1c278e6492988501d7ad0352621
  • 数据划分清单:prompts/MovieGenVideoBench_extended_101_200.json
  • 与选中的 1000 条预测器训练提示词的精确重合数:0
  • 随机种子:每条提示词均为 0
  • 推理设置:8 张 GPU,每条提示词生成 1 个样本,启用 EMA
  • 已评测版本:FFFF、FRRF、FRRR、阶段 1 FPPF/FPPP、阶段 2-A FPPF/FPPP 和阶段 2-B FPPF/FPPP
  • NVMe 暂存根目录: /mnt/local_nvme/zoubin/cz/self_forcing_moviegen_101_200_evaluation
  • 项目视频目录: videos/moviegenvideobench_extended_101_200_dmd_*_seed0
  • 完整性验证:9 组结果均包含 100 个视频;全部 900 个视频都能解码为 81 帧、832 × 480
  • VBench 验证:每个版本在六个维度中都恰好包含 100 条逐视频记录
  • 配对验证:8 个非基线版本均包含 100 个视频,每个版本都与验证集 FFFF 输出形成 8,100 对配对帧
  • 数据划分准备脚本: scripts/prepare_moviegen_validation_split.py
  • 可恢复的评测启动脚本: scripts/run_moviegen_101_200_evaluation.sh
  • 汇总与完整性检查脚本: scripts/summarize_moviegen_101_200_evaluation.py
  • 机器可读汇总: evaluation_results/moviegen_101_200/summary.json
  • 初始评测日志: evaluation_results/moviegen_101_200/evaluation_suite.log
  • FRRF/FRRR 新协议评测日志: evaluation_results/moviegen_101_200/reuse_schedules_evaluation.log
  • 完成标记: evaluation_results/moviegen_101_200_evaluation.complete

完整的 VBench 与配对指标数值维护在“结果总览”中;未经四舍五入的精确值和 全部源结果路径记录在机器可读汇总文件中。

Wan14B DMD 预测器训练

  • 启动日期:2026-07-29
  • 状态:进行中
  • 训练顺序:先训练 Predictor-only,再训练 Full + Predictor Joint。
  • 两个版本均训练 2000 个 student DMD step。
  • 每个 student step 前更新 Fake Score 5 次。
  • Predictor-only 随机退出:P1、P2、P3 等概率采样。
  • Joint 随机退出:F0、P1、P2、P3 等概率采样;预计约 1500 次 Predictor optimizer 更新。
  • Predictor 融合/残差学习率:1e-5
  • Predictor block 学习率:1e-6
  • Joint Full Generator 学习率:2e-7
  • Fake Score 学习率:4e-7
  • 学生 optimizer:AdamW,betas=(0.0, 0.999),100 步线性预热后 余弦衰减。
  • EMA:第 200 步开始,衰减率 0.99
  • 实模冒烟:Predictor-only 和 Joint 的 DMD 反向均通过;Joint 的 Full/Predictor 梯度、FSDP 后冻结副本同步、Full/Predictor EMA 检查点保存和重新读取均通过。
  • 训练托管会话:tmux predictor_v4_dmd_suite
  • 总日志: /mnt/local_nvme/zoubin/cz/predictor_v4_dmd_suite.log
  • Predictor-only NVMe 输出: /mnt/local_nvme/zoubin/cz/self_forcing_predictor_v4_dmd_predictor_only
  • Predictor-only SwanLab: https://swanlab.cn/@ZhuoChen/Self-Forcing-Predictor-v4/runs/yzdlp32v
  • Joint NVMe 输出: /mnt/local_nvme/zoubin/cz/self_forcing_predictor_v4_dmd_joint
  • Predictor-only 配置: configs/predictor_v4_dmd_predictor_only.yaml
  • Joint 配置:configs/predictor_v4_dmd_joint.yaml
  • 串行训练与评测脚本:scripts/run_predictor_v4_dmd_suite.sh

训练完成后自动执行:

  1. Predictor-only 在 MovieGen 第 101–200 条验证集上评测 FPPF、FPPP;
  2. Joint 在相同验证集上评测新 Full 的 FFFF、FPPF、FPPP;
  3. 所有推理 case 使用随机种子 0;
  4. 计算 VBench 六指标和相对各自 FFFF 的 PSNR、SSIM、LPIPS;
  5. 将 NVMe 训练产物同步到项目 checkpoints/ 目录。