# 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.log` 和 `evaluation_results/moviegen_101_200/reuse_schedules_evaluation.log` - 验证集提示词清单与清单文件: `prompts/MovieGenVideoBench_extended_101_200.txt` 和 `prompts/MovieGenVideoBench_extended_101_200.json` - 验证集九组视频: `videos/moviegenvideobench_extended_101_200_dmd_*_seed0` ## 已完成事项(原待办) ### 首个分块全为完整模型步骤的 FRRF / FRRR 状态:已完成。评测于 `2026-07-29T04:12:19Z` 开始,于 `2026-07-29T04:37:17Z` 完成。 所需调度: ```text 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 步预测的速度场。两种调度的最终干净上下文 更新仍使用完整生成器。 - [x] 增加明确的 `frrf` / `frrr` 速度场复用调度。 - [x] 强制两种调度的首个分块均使用 FFFF。 - [x] 增加调度测试和随机种子 0 的空跑测试。 - [x] 增加可恢复的九方案评测与汇总支持。 - [x] 使用八张 GPU,在验证集第 101–200 条提示词上生成 FRRF 和 FRRR 视频。 - [x] 验证每个样本(包括 FFFF 和两种复用调度)都在生成初始噪声前, 将所有随机数生成器重置为随机种子 0。 - [x] 验证每种调度均有 100 个视频,每个视频为 81 帧、832 × 480。 - [x] 运行 VBench 的六个维度。 - [x] 以已有的随机种子 0 验证集 FFFF 为参照,计算 PSNR/SSIM/LPIPS;每种调度统计 100 个视频和 8,100 对配对帧。 - [x] 更新 `evaluation_results/moviegen_101_200/summary.json`。 - [x] 替换“结果总览”中的 FRRF 行,增加 FRRR,并更新结论。 “结果总览”已替换为新协议结果。旧 FRRF 调度的产物仍保留,但不再纳入 九方案汇总。 输出目录: ```text videos/moviegenvideobench_extended_101_200_dmd_frrf_chunk0_ffff_seed0 videos/moviegenvideobench_extended_101_200_dmd_frrr_chunk0_ffff_seed0 ``` 配对结果文件: ```text 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 | 通用训练配置: ```text 8 张 GPU 每张 GPU 1 条轨迹 每个全局优化步骤 8 条轨迹 2000 个优化步骤 融合模块学习率 5e-5 预测器模块学习率 5e-6 100 步线性预热 + 余弦衰减 BF16 激活值 FP32 可训练参数和 AdamW 状态 随机种子 0 每 100 步保存一次 ``` 阶段 2 输出根目录: ```text /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` 指标。这只影响 日志记录;数值指标、最终检查点、上传、验证和同步均已成功完成。 每个训练完成的检查点都支持以下两种部署调度: ```text FPPF:F0 -> P1 -> P2 -> F3 FPPP:F0 -> P1 -> P2 -> P3 ``` ### MovieGen 验证集评测 - 初始评测日期:`2026-07-26` - 初始评测时间段:`2026-07-26T16:23:11Z` 至 `2026-07-26T17:35:53Z` - FRRF/FRRR 新协议补充评测时间段:`2026-07-29T04:12:19Z` 至 `2026-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/` 目录。