6.4 KiB
6.4 KiB
训练前多维度审查(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 ValueError;n_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=None(judge 基础设施异常)与 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
- 接线:seed 携带 pools.json 机制(或 frozen_pools_path 配置)+ 新建 adhoc-baseline seed + 训练 yaml/sh(
questions: benchmarks/Video-MME、run_holdout_eval 显式决策)。 - P0-1~P0-6 全部修复;P1 按成本尽量修(P1-1 至少给训练 run 加缓存 salt 或 TTL)。
- 备份当前冻结产物(P2-1)。
- 训练启动前预检脚本:val per-class 覆盖、微型题型排除、evolve/diagnose 模板存在性 fail-loud。