From 655e1fb93c3427669ebff19256dfc642564ed555 Mon Sep 17 00:00:00 2001 From: cbb <2625274797@qq.com> Date: Sun, 18 Oct 2026 00:50:27 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20ml=20=E8=BF=90=E8=A1=8C=E6=89=8B?= =?UTF-8?q?=E5=86=8C=E5=AE=A1=E6=9F=A5=E8=BF=BD=E5=8A=A0=E7=AC=AC=E4=BA=8C?= =?UTF-8?q?=E8=BD=AE=EF=BC=88=E5=AF=B9=E4=BF=AE=E8=AE=A2=E7=89=88=20d3b7c7?= =?UTF-8?q?b=20=E7=9A=84=E5=8F=AF=E8=A1=8C=E6=80=A7=E8=AF=84=E4=BC=B0?= =?UTF-8?q?=EF=BC=8C=E5=8F=AA=E8=AF=BB=E4=BB=A3=E7=A0=81=E6=9C=AA=E8=B7=91?= =?UTF-8?q?=EF=BC=89=EF=BC=9A13=20=E6=9D=A1=E5=A4=84=E7=BD=AE=E8=A1=A8?= =?UTF-8?q?=EF=BC=88R10=20=E9=98=88=E5=80=BC/=E5=85=B1=E8=AF=86=E8=A1=A5?= =?UTF-8?q?=E9=87=8F/=E5=A4=B4=E5=88=86=E7=9B=AE=E5=BD=95/$PYTHON/?= =?UTF-8?q?=E4=B8=89=E5=8F=A3=E5=BE=84/exec=5Fs=20=E7=BD=AE=20None/?= =?UTF-8?q?=E6=B1=A0=E5=8F=AA=E7=94=A8=E6=9C=AC=E8=BD=AE/fp32/=E9=AA=8C?= =?UTF-8?q?=E6=94=B6=E6=B1=87=E6=80=BB=20=E5=B7=B2=E8=90=BD=E5=9C=B0?= =?UTF-8?q?=EF=BC=89=EF=BC=9B=E6=96=B0=E5=BC=95=E5=85=A5=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20B1~B8=E2=80=94=E2=80=943=20mm=20=E6=98=AF=E9=9D=A0=E6=94=BE?= =?UTF-8?q?=E6=9D=BE=E8=BF=90=E8=A1=8C=E6=97=B6=E6=8A=95=E5=BD=B1=E8=BF=81?= =?UTF-8?q?=E5=B0=B1=E6=95=B0=E6=8D=AE=E5=88=86=E5=B8=83=EF=BC=88=E6=AD=A3?= =?UTF-8?q?=E8=A7=A3=E5=9C=A8=E8=AE=A4=E8=AF=81=E4=BE=A7=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=E8=80=81=E5=B8=88=E6=A0=B7=E6=9C=AC=EF=BC=8C=E5=B1=9E=E9=9C=80?= =?UTF-8?q?=E6=8B=8D=E6=9D=BF=E7=9A=84=E5=AE=89=E5=85=A8=E5=86=B3=E5=AE=9A?= =?UTF-8?q?=EF=BC=89=E3=80=81APG=20=E7=AB=AF=E7=82=B9+=E4=B8=AD=E7=82=B9?= =?UTF-8?q?=20hinge=20=E4=BD=BF=E7=A2=B0=E6=92=9E=E9=A1=B9=E7=BA=A6=20?= =?UTF-8?q?=C3=972=20=E8=80=8C=20w=5Fcol=20=E6=9C=AA=E9=87=8D=E6=A0=87?= =?UTF-8?q?=E4=B8=94=20plans=2060=E2=86=92150=20=E5=8D=95=E6=AD=A5?= =?UTF-8?q?=E4=BB=A3=E4=BB=B7=E4=B8=8A=E7=95=8C=20~4=C3=97=20=E8=80=8C=20?= =?UTF-8?q?=C2=A78=20=E4=BC=B0=E6=97=B6=E6=9C=AA=E6=94=B9=E3=80=81check=5F?= =?UTF-8?q?r2=20=E7=A9=BA=E5=8C=B9=E9=85=8D=E5=8F=96=20quantile=20?= =?UTF-8?q?=E4=BC=9A=E6=8A=9B=E4=B8=94=E9=BB=98=E8=AE=A4=2020=E4=B8=87?= =?UTF-8?q?=C3=972=E4=B8=87=20=E6=B1=A0=E5=B3=B0=E5=80=BC=202=E2=80=933=20?= =?UTF-8?q?GB=20=E6=98=BE=E5=AD=98=E3=80=81gate=20R7=20=E5=B7=A6=E5=8F=B3?= =?UTF-8?q?=E6=AF=94=E4=BE=8B=E4=BB=A5=E5=88=B0=E8=BE=BE=E4=B8=BA=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E4=BC=9A=E6=BC=8F=E6=8A=A5=E5=A4=9A=E6=A8=A1=E6=80=81?= =?UTF-8?q?=E8=A2=AB=E5=8E=8B=E7=BC=A9=E3=80=81r8=20=E9=9B=86=E5=90=88?= =?UTF-8?q?=E8=B5=B7=E7=82=B9=E6=9C=AA=E6=9F=A5=E8=B4=B4=E6=9F=B1=E3=80=8C?= =?UTF-8?q?=E4=B8=A4=E4=BE=A7=E9=83=BD=E8=A6=81=E7=BB=95=E8=BF=9C=E3=80=8D?= =?UTF-8?q?=E5=90=8D=E4=B8=8D=E5=89=AF=E5=AE=9E=E3=80=81=C2=A72=E3=80=8C?= =?UTF-8?q?=E5=AE=9E=E6=B5=8B=207.6=20s=E3=80=8D=E6=98=AF=20300=20?= =?UTF-8?q?=E6=9D=A1=E5=8F=A3=E5=BE=84=E8=80=8C=E6=B5=81=E7=A8=8B=E8=B7=91?= =?UTF-8?q?=202000=20=E6=9D=A1=E3=80=81R4=20wasm=20batch=3D8=20P99=20?= =?UTF-8?q?=E8=87=B3=E4=BB=8A=E6=B2=A1=E6=B5=8B=EF=BC=9B=E7=BB=93=E8=AE=BA?= =?UTF-8?q?=EF=BC=9A1=E2=80=936=20=E6=AD=A5=E5=8F=AF=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E3=80=817=E2=80=9313=20=E6=AD=A5=E9=9B=B6=E8=AF=81=E6=8D=AE?= =?UTF-8?q?=EF=BC=8C=E7=AC=AC=207=20=E6=AD=A5=E5=89=8D=E5=85=88=E7=BB=93?= =?UTF-8?q?=20R4=20=E5=B9=B6=E5=8D=95=E7=8B=AC=E6=8B=8D=E6=9D=BF=20margin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ML运行手册审查.md | 86 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/docs/ML运行手册审查.md b/docs/ML运行手册审查.md index 570564c..00974aa 100644 --- a/docs/ML运行手册审查.md +++ b/docs/ML运行手册审查.md @@ -133,3 +133,89 @@ | 8 | §10 默认 fp32 + `__POLICY.latency()` 实测后才考虑 fp16(仅 WebGPU);loop.sh 池子只取本轮;文件地图补全;evaluate 空任务保护 | `ml/README.md` §10/文件地图、`ml/mining/loop.sh:20`、`ml/sim/closed_loop.py:161` | 未验证范围:第 7(m5)、8(apg)、9(mine)、10(export)、11(bench)步与浏览器 `?policy=1` 第 12 步都没跑过(`ml/node_modules` 未安装、`webapp/models/` 无模型、`onnxconverter_common` 未装)。这些通路只做过静态代码核对。 + +--- +--- + +# 第二轮:对修订版(提交 `d3b7c7b`)的可行性评估 + +评估对象:另一台机器按上述审查做的修订(18 文件、+493/−156)。方式:**只读代码 + 只读 diff,本轮没有跑任何东西**,第一轮的实测数字(6208 样本/s、keepRate 0.977、minGap p50 4.4 mm、1.56 s/条)继续沿用。上文第一轮的正文按 0218d7f 时的代码写,路径与章节号(`ml/runs/base`、12 步)在修订后已变,不逐条订正,以本节为准。 + +## 一、第一轮 13 条的处置 + +| 第一轮条目 | 状态 | 落点 | +|---|---|---| +| P0-1 R10 吞吐判据矛盾 | 已修 | 方案 §10.1 R10 改为"60000 步 ≤ 3.5 h,即 ≥5000 样本/s",缓解改成 `fk_caps` 96→48 / `steps`→40000(增大 batch 明确标注无效);`ml/train.py:101` 加 `eta_h` | +| P0-2 共识分支缺期望数字 | 已修 | README §4 加两张表(不共识实测 / 共识估算 + 异常动作);`ml/gen/stats.cjs:20` 加 `consensusDrop`、分位数加 p10;`ml/pipeline.sh` gen 阶段按实测"样本/任务"自动补量到 `TARGET_SAMPLES=1700000`(最多 2 次) | +| P0-3 WTA 回退覆盖 MeanFlow 产物 | 已修 | `pipeline.sh`:输出 `ml/runs/$TAG`、`ml/runs/bench_$TAG`;m5 通过后写 `ml/runs/selected_ckpt`,apg/export/accept 经 `ckpt()` 取;`ml/train.py:58` 与 `apg_finetune.py:51` 日志改为新训覆盖、续训追加 | +| P0-4 `python3` 在 Windows 断第 5 步 | 已修 | `run_prep.sh:8` 与各脚本统一 `${PYTHON:-python}`;README §1 加"Windows 原生 + Git Bash 实测可跑",并写明 Windows 不要用 `python3` | +| 口径-1 仿真安全层 ≠ 运行时 | 已修(说明层) | m5 同跑 `--safety` 一遍,产出 `m5_gate_.json` 的 `policy_only` / `with_sim_safety` 两块;README §7 明写"三口径互不替代,部署只看第 11 步" | +| 口径-2 门禁题假时长 | 已修 | `ml/mining/tasks.py:54` `exec_s/travel` 置 None;`ml/sim/closed_loop.py:24` `NOREF_SEC=6.0`,`time_ok_1p3`/`travel_ratio` 只在有老师参考的题上统计,新增 `n_ref`、`time_budget` 字段 | +| 口径-3 APG 定长 3.6 s + 只查端点 | 已修(但引入新问题,见下 B-2) | `apg_finetune.py:70` 展开长度随批取 `exec_s p90 × 1.2`,夹在 60–150 次推理;`:102` 铰链改端点 + 中点 | +| 口径-4 5 mm 余量压老师间隙分布 | 已改,方向不认同 | `configs/apg.json` 与 `webapp/js/ik-policy.js:174` 一起降到 3 mm;方案决策表"训练余量 5 mm"改为 3 mm,R3 回退改"提高到 4–6 mm" | +| 缺项-1 §9 验收表无执行点 | 已补 | 新增 `ml/eval/acceptance.py`(第 12 步 `accept`):held-out 到达率 ≥98%、D 类停靠 ≤老师+5 mm、起步失败=0,并汇总 R2/R7/R8/R10/M5/部署形态 | +| 缺项-2 挖错池累积 | 已修 | `ml/mining/loop.sh:21` 改为 `--pool $D/pool.jsonl` 只用本轮 | +| 缺项-3 fp16 部署 | 已修 | `pipeline.sh` export 去掉 `--fp16`,README §10 改默认 fp32,只在 `&ep=webgpu` 实测受益才另出 fp16 对比 | +| 缺项-4 `--n` 混控两集合 | 已修 | 拆成 `--nc-n` / `--route-n` / `--r8-n`,positional 过滤改用白名单 `VALOPT` | +| 缺项-5 val 为空崩 | 已修 | `closed_loop.evaluate` 空任务返回 NaN 字典;`train.py:59` 无 val 任务时提示并自动 `--no-eval` | +| 缺项-6 文件地图缺 4 文件 | 已修 | README 文件地图补 cert.cjs / pathdev.cjs / npy.cjs / toy_bimodal.py | +| 缺项-7 R2 无执行点 | 已补 | 新增 `ml/eval/check_r2.py`,prep 末尾自动跑 | +| 附带 | 新增 | R7(左右比例 + 行程)进 `ml/mining/gate.py:47-53`;R8 对抗集 + `brakeRate` 进 `tests/policy_bench.cjs`;出题与间隙计算分块防 OOM(`tasks.py:9` `min_gap_chunked`) | + +## 二、修订新引入的问题(按严重度) + +### B-1(最高)3 mm 是拿真机护栏迁就数据分布 + +依据是本轮实测"老师最小间隙 p50 4.4 mm",但正解是在认证环节把 `cert.minGap < 3 mm` 的老师样本过滤掉(`stats.cjs` 已经算这个数,逐条记录里就有),而不是把**运行时投影余量**一起降下来。认证只保证扫掠间隙 > 0,`collide.json` 的 `margin_mm` 只有 0.3 mm,`project()` 是唯一主动把臂往外推的力量(`ik-policy.js:279`)。方案 R3 原文写的回退是"训练余量**提高到** 3–6 mm 以缓解认证过保守",修订把这个值定成 3 = 把回退方向当成了默认。贴柱真实距离从 ≥5 mm 变 ≥3 mm 是机械/安全决定,需要单独确认,不该由 ML 口径推出。 + +### B-2 APG 两处改动耦合且没重标定 + +- `apg_finetune.py:102-104`:端点与中点两个 hinge 直接 `view(2, B).sum(0)` 相加 → 碰撞项数值约为旧版 **2 倍**,而 `w_col=2.0` 未动。 +- `:70` + `plans_max=150`:展开最坏 60→150 次推理(2.5 倍),每步 `kin.gaps` 的位形数又 ×2(端点+中点)→ 单个 APG step 代价上界约 **4 倍**。 +- 同时 margin 5→3 让铰链激活的样本数下降。一增一减方向相反,幅度都没实测。 +- README §8 的"2–4 小时"沿用旧口径,没随改动更新。 + +后验表现无法预判:APG 之后若行程变长/贴柱反而更近,第一嫌疑是这个组合而不是学习率。 + +### B-3 新代码路径一次没跑,check_r2 自身可能成为闸门 + +- `check_r2.py:39`:`m.sum()==0` 时对空张量取 `torch.quantile(std, 0.9)` 直接报错(小样本摸底必撞;`label_std_mean` 也是 NaN)。 +- 默认 `--queries 20000 --pool 200000`,分块距离矩阵 1024×200000 ≈ 0.8 GB/块,`torch.where` 再复制一份 → 峰值 2–3 GB 显存;`Samples` 本身又把 X/Y/SG 全量上卡(约 1.5 GB)。CPU 兜底时 20000×200000 fp32 = 16 GB 内存,docstring 说"降到 50000"仍然不轻。 +- 它挂在第 5 步末尾,README 写"不通过先发我,不要直接训练"→ 一个自身可能 OOM/崩的硬门禁。 + +### B-4 R7 的左右比例被成功率污染,会漏报它想抓的东西 + +`gate.py:47` 的 `left(...)` 以"到达"为条件掩码。APG 把某一侧绕行全做失败时,剩余成功集里的左右比例可以纹丝不动 → 而 R7 的目标(方案:APG 压缩多模态)恰恰是这种情况。建议按全部题的首次 J1 方向统计,不筛到达。 + +### B-5 r8 集合没实现"两侧都要绕远" + +`policy_bench.cjs:47-64` 只约束终点贴立柱 + |ΔJ1|≥140° + 直线被挡,**起点没做 `nearColumn` 检查**。方案 §10.1 R8 的口径是"两侧都要绕远",现在起点对侧无约束 → 恢复率会比设计意图偏松(判据偏松是危险的偏)。 + +### B-6 估时里"实测"两字一处用错、两处仍是拍的 + +- §2 写"1 分钟(实测 7.6 s 对拍)"——7.6 s 是 `dump_parity 300` 的数,pipeline 跑 2000 条,不同口径。 +- §6 的"测速 6 分钟 / 正式 3 小时"由 6.2k 样本/s 换算,可信。 +- §7 的 10–20 分钟(1000 题 ×2 遍 × 定长 6 s)、§11 的"约 1 小时"(题数已从 1070 增到 1120,且 r8 采样每条最多 200 次 `collideDetail` 重试)、§8 的 2–4 小时(见 B-2)都无依据。 + +### B-7 方案自标的最大不确定项 R4 仍然是空的 + +策略推理在 wasm 多线程、batch=8 下的 P99 从未量过:`webapp/models/` 只有一个 README.md(至今没导出过任何模型),方案 §1.1 表里的 0.19 ms 是 2D 玩具沙箱(`ml/toy/toy_bimodal.py`)的数,不是这个 4.92 M 模型。而 60 ms 一次推理的部署节奏、`safetyMs:30` 预算、`certBudget:40` 全靠它。R4 不过就要改模型规模(d=128)或提交步数(3→2),是伤筋动骨的返工,却排在第 13 步才第一次被测。 + +### B-8 杂项 + +- `build_dataset.cjs:46` 噪声增广的接受地板仍是 `S.clearance(qn, 5) > 1`,与新的 3 mm 投影不同步(一松一紧,不是矛盾但没对齐)。 +- `acceptance.py:44` 用 `start_fail == 0` 硬判:held-out 约 2500 题里任何一题 0.5 s 内行程 <1° 就整项未过,判据脆。 +- `pipeline.sh` m5 不通过 `sys.exit(3)` → `all` 会中止(有意,但应写进"常见问题")。 +- `requirements.txt` 仍列 `onnxconverter-common`(fp16 已非默认,留着无害)。 +- `tasks.py:36` 的 `column_gap(kin, b)` 仍在 2048 行整批上算(`free_q`/`straight_blocked` 已分块),单卡可过但和"已分块防 OOM"的说法不完全一致。 + +## 三、可行性判断 + +1. **前段(第 1–6 步)可执行**:数据生成、打包、两种头、闭环仿真、对拍都在本机实测过,数字与手册自洽。修订把 R10、共识补量、目录覆盖、`python3` 这几个会真卡住人的点解决了,这部分我认可。 +2. **后段(第 7–13 步)逻辑闭合但无证据**:判据齐全、口径终于分开了,可"APG+挖错能不能把纯策略穿柱率压到 ≤2%"、"机时是不是 2–4 h"、"held-out 能不能 98%"一个都没跑过。别把 §8–§12 的估时当预算。 +3. **不建议按现值直接跑第 7 步之前**:B-1(3 mm)是需要你拍板的安全决定,B-2(w_col 没跟着重标)会让后段任何异常都无法归因。 + +## 四、第 7 步之前建议先做的两件事(都不需要训练) + +1. **结掉 R4**:用一个随机初始化的 4.92 M 模型导出 fp32 ONNX,走 `ml/serve.py` + `?policy=1`,在目标浏览器实测 `__POLICY.latency()` 的 batch=8 P99 与安全层 P99(方案要求 <15 ms)。不过就要改 `d`/`commit`,此时改配置的成本远低于训完 3 小时再改。 +2. **把 margin 决定单独拍板**:在"过滤老师数据保 5 mm"与"放宽护栏到 3 mm"之间选一个,再把 `w_col` 与 §8 估时按选择重算。这两条是本轮唯一拦住往下跑的理由。