Files
Video-Tree-TRM5/research-wiki/reviews/2026-07-16-preflight-train-review.md
T

6.4 KiB
Raw Blame History

训练前多维度审查(video-split 冻结切分 → Video-MME 900 训练)

2026-07-16。8 维度并行审查 + 每条发现 2 名独立验证员对抗核实:19 条确认 / 4 条存疑 / 12 条误报被反驳。 场景锚定:global 冻结池 210/90/600、12 题型、baseline=infer_adhoc、concurrency=24、3 epochs、skill_update_mode=patch。 关键条目(P0-1/P0-2/微型题型)已由主会话人工复核确认。

P0 —— 不修则训练无效或必崩

# 位置 缺陷 后果
P0-1 runner.py:2272 + prompts/ 进化模板 evolve_skill/system/tool/rank.mdconsolidate_system.md 全部缺失(TRM4 有),_load_evolve_promptselse "" 静默兜底空串 全部进化 LLM 调用以空 system prompt 运行,edits 恒空 → 3 epochs 表面正常跑完但 零进化。已跑过的 train-ar30 / train-action-recognition 同样受影响,结果需回查
P0-2 inference.py:462 traces 表只建表、全仓库无写入(TRM4 TracePlugin 未迁移);训练轨迹只存 predictions.steps_json 训练内 run_diagnosisget_traces 拿空轨迹 → 诊断瀑布坍缩(算法保真 #7 失效)。离线管线已有 StepsJsonRunLog 适配器可复用
P0-3 runner.py:2044 / validate.py:682 / gate.py:99 微型题型三连雷(根因同一):新冻结切分中 Temporal Perception、Spatial Perception、Spatial Reasoning 在 val 池 0 题_class_baseline_acc AssertionError;非 test 单元仅 2 个 → 案例包排除后阶梯为空 raise ValueErrorn_plan=1 时 e-process 结构性 reject_inertia 训练中途必崩两处 + 微型类白烧进化成本。建议训练 task_types 排除微型类,或切分加 per-class val 下限
P0-4 inference.py:423,446 prediction 未归一化且落库 insert 在 try 块之外;LLM 提交 {"answer": ["B"]} 等非标量 → sqlite 绑定异常击穿整个 gather 训练崩溃,且 Redis 缓存重放使 resume 后确定性复现 → 死循环
P0-5 runner.py:316 vs config.py:63 early_stop_patience 实际按 step 计数(每 epoch 一次性累加 ~20),文档语义是"轮" patience=4 时 epoch 1 只要没严格超过 baseline 就终止全部训练,交付 v1 基线
P0-6 momentum.py:151 prompts/slow_momentum.md 缺失,use_slow_momentum=true 下无条件 read_text 修复 P0-1 后必现:首个 accept 的 epoch 末 FileNotFoundError,崩在慢更新中段(叠加慢更新非幂等 → resume 二次污染)

P1 —— 信号污染类,强烈建议训练前修

# 位置 缺陷
P1-1 main.py:93 + redis_cache.py:42 REDIS_CACHE_TTL=0 → 永不过期;缓存键仅 hash(model+messages),不含采样参数。prompt 未被进化修改的题跨 epoch 逐字节重放首次采样,γ-EMA/e-process 把重放当独立证据
P1-2 llm.py:116,575 SSE 流截断(无 [DONE])当成功处理并写入永不过期缓存 → 半截答案永久毒化
P1-3 llm.py:182 httpx.RemoteProtocolError/ReadError/ConnectTimeout/PoolTimeout 不在瞬时错误清单,零重试直接落错题;8 次重试预算对最常见断连完全无效
P1-4 validate.py:304,593 基线臂 INFRA 错误(prediction=None)折叠为"基线答错"永久写 BaselineCache(内容寻址无失效),INFRA 护栏在缓存写入之后才检查
P1-5 diagnose.py:2194 + runner.py:1019 cause_category=Nonejudge 基础设施异常)与 degraded 题在训练链路中进 defect 正文进化路径,反转"判不准默认 lapse"的保护方向;runner 对 degraded_count 零检查
P1-6 patch.py:343,320 冻结区判定只查 edit target 起点不查跨度:起点在正文、末端延伸进 appendix/momentum 区的 delete/replace 被放行 → marker 破坏 → epoch≥2 时 appendix_region_bounds ValueError 崩溃
P1-7 workspace.py:282,311,365 manifest.json 全部写路径为裸 write_text 非原子写(checkpoint.py 已有 tmp+replace 先例);训练高频重写,截断即 workspace 不可恢复

P2 —— 操作规程可规避 / 影响半径小

# 位置 缺陷 规避
P2-1 video_split_cli.py:557 冻结产物无覆盖保护(承诺的 --force 门不存在),commit 换 SHA 后重跑会静默替换 pools.json 立即备份当前冻结产物并记录 sha256;训练前不再重跑切分脚本
P2-2 log.py:77 只读查询也以 baseline_run_id 打开 HarnessLog → upsert 改写 infer_adhoc 的 _runs 溯源元数据 违反 log.py 自身 docstring 约定,宜改走 RunLogImpl
P2-3 diagnose.py:2081 / inference.py:461 predictions/traces 无主键 + step 中途崩溃 resume 同 run_id 重跑 → 重复行双计入诊断统计 避免中途 kill;后续补去重
P2-4 diagnose.py:2194(离线) 孤立 C3 瞬时失败 → 题永久 uncertain 且断点续跑不重试(影响个位数题;C1/C2 失败会 fail-loud 全崩,批量污染不可达) 检查 uncertain 占比(本轮 3/236
P2-5 runner.py:1444 R2 的 dual_metric "final" 行在 revert 判定前落库,回退版本留下污染记录(存疑级) harness-eval 读数时注意
P2-6 breaker.py:36 熔断半开无单探针语义,cooldown 到期 24 并发同时放行(存疑级) 持续故障时人工暂停
P2-7 runner.py:2286 prompts/span_eval_user.md 缺失(同款空串兜底),但 diagnose.py 实际未消费该字段 迁移时顺手补

反驳的 12 条(误报,不需处理)

McNemar 护栏时序、diag_fingerprint 声明式指纹、T0 计入 val 错题、sub_pattern 序列化丢失、correctness 重复行、双题目权威、resume 结构键缺池参数、evolve_single_tool TypeError、momentum guidance 消毒、缓存反序列化无防护、CLI store_true 覆盖 YAML、load_config 静默过滤未知键 —— 均经双验证员核实为不可达或有上游防御。

结合前一轮预检的完整训练前 checklist

  1. 接线:seed 携带 pools.json 机制(或 frozen_pools_path 配置)+ 新建 adhoc-baseline seed + 训练 yaml/shquestions: benchmarks/Video-MME、run_holdout_eval 显式决策)。
  2. P0-1~P0-6 全部修复;P1 按成本尽量修(P1-1 至少给训练 run 加缓存 salt 或 TTL)。
  3. 备份当前冻结产物(P2-1)。
  4. 训练启动前预检脚本:val per-class 覆盖、微型题型排除、evolve/diagnose 模板存在性 fail-loud。