EXP-3D-RGBD-COMPLETION-V11 修正记录
Amendment 1:浮点舍入导致的颜色越界(2026-09-29 19:5x,远端时间)
写于查看任何 V11 结果之前。除了下文的诊断,我只看过训练损失和步数:DEV 曲线、checkpoint 选择、DEV 指标与 EVAL-V3 都没有读取。EVAL-V3 此时尚未运行。
发生了什么
- 失败: 冻结的训练在每个 checkpoint 步用 DEV 评价选择 checkpoint,其中指标函数(
statistics._rgb)要求渲染颜色严格在 [0, 1] 内。 - C1(宽度 32)seed 20260928 在第 5000 步失败;
- C1 seed 20260930 在第 6000 步失败;
- 报错都是
ValueError: RGB must be in [0, 1]。 - 冻结规则的后果: 这类 Python 错误不自动重试;主变体失败,实验停止。runner 于 19:33 停止,C0 的 3 个训练和 C1 seed 20260929 都已正常完成。
- 诊断(
audit/amendment1_rgb_range_diagnostic.json): - 做法:重新加载出错的两个 checkpoint,只渲染 DEV 上下文视角的颜色并统计其范围,不计算任何指标,不读取任何 query 帧。
- 结果:48 个上下文视角中,两次都只有 1 个视角越界(ai_032_001,角色 B,帧 5),分别有 7 个和 2 个值等于 1.0000001192。
- 这正好比 1 大一个 float32 最小单位(2⁻²³ ≈ 1.2×10⁻⁷):渲染器把各采样点的颜色加权求和,再加上背景,这个求和的舍入偏差所致。没有 NaN,训练没有发散。更宽的 carrier 会把亮面的颜色推到接近饱和,所以只有宽度 32 的变体遇到这个问题。
修正
- 截断规则: 新增
clip_rounding(src/mcss/mechanism_pilot/rgbd_completion_evaluation_amend1.py),作用于渲染颜色。 - 超出 [0, 1] 不超过 1×10⁻⁶(约 8 个 float32 最小单位)时,截回 [0, 1];
- 超出更多时仍然报错;
- 非有限值原样交给冻结的有限性检查;
- 完全在 [0, 1] 内的输出原样返回,逐位不变。
- 修改范围: 评价模块只在两次渲染调用外包一层
clip_rounding,其余代码与冻结版本逐字相同。 - 训练、DEV 评价与 runner 的新脚本(
*_amend1.py)与冻结版本只差评价模块的导入或脚本名; - 测试
tests/test_rgbd_completion_amend1.py检查了这一点,以及截断规则本身。 - 不受影响的部分: 冻结文件都没有修改。EVAL-V3 阶段只渲染深度,收尾脚本对保存下来的(已截断的)颜色用冻结的指标函数重算,都不受影响。
- 事前试跑: 在出错的两个 checkpoint 上试跑了修正后的评价,两次都完成;试跑输出没有读取,已直接删除。
重跑
- 存档: 失败的两个训练作为第 2 次尝试存入
audit/failed_attempts/,事故类型为amendment1_rgb_float_rounding;原来的training_failures.json同样移入该目录。 - 重跑方式: 用修正后的训练脚本从头重跑,其余配置完全相同,计入原有的重跑预算。
- 逐位复现检查: 在 CPU 上训练是确定性的,所以重跑必须与失败的那次逐位相同:
- seed 20260928 的前 5000 行训练记录;
- seed 20260930 的全部 6000 行训练记录;
- 不相同就停止。
- 已完成的 4 个训练: 不重跑。它们的 DEV 曲线由冻结的评价计算,没有遇到越界;修正后的评价对这些值会给出逐位相同的结果。
- 后续流程: 与冻结的 runner 相同,包括 DEV 选择、诊断、参照、统计、复现审计、EVAL-V3 的封存、打分与分析,以及收尾。其中 DEV 选择的评价改用修正后的评价模块。