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

52 lines
6.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 训练前多维度审查(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.md``consolidate_system.md` 全部缺失(TRM4 有),`_load_evolve_prompts``else ""` 静默兜底空串 | 全部进化 LLM 调用以空 system prompt 运行,edits 恒空 → 3 epochs 表面正常跑完但 **零进化**。已跑过的 train-ar30 / train-action-recognition 同样受影响,结果需回查 |
| P0-2 | `inference.py:462` | traces 表只建表、全仓库无写入(TRM4 TracePlugin 未迁移);训练轨迹只存 `predictions.steps_json` | 训练内 `run_diagnosis``get_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/sh`questions: 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。