Files
Robot_Arm/docs/ML运行手册审查.md
T
cbb b6141d237c fix: R4 探针页 tensor 复用(proxy 下 buffer 被 detach)+ pipeline.sh 7 处 GBK 读取 + r4 分支返回码;r4 端到端 rc=0
- webapp/r4_probe.html:feat 移进 run() 每次新建。proxy=1 时 ORT 把输入 transfer 给 Worker,旧写法第二次 run 报 Tensor size(83) vs data length(0),两种 proxy 配置全挂、r4.json pass=null。
- ml/pipeline.sh:7 处 json.load(open(...)) 补 encoding='utf-8'(:90 :110 :118 :127 :136 :138 :144)。r4.json 以 ensure_ascii=False 写出,Windows GBK 下 :110 实测 UnicodeDecodeError,命令替换为空会让上层分支走错。
- ml/pipeline.sh r4:末行 `[ "$r" = null ] && echo` 在 r=pass 时整体返回 1,set -e + EXIT trap 把通过的 r4 记成 rc=1(all 会因此停)→ 改 if/fi。
- 实测复跑两次:pass=true,部署口径(16 线程+proxy+enc_once)P99 10.22 / 11.25 ms,4 线程 13.58/13.64,无 proxy 9.28/10.92,webgpu 仍 backend not found。
- 文档同步:A 组两处标记已修,仅留 A-3(ortLocal+proxy 离线路径)交实现方。
2026-10-18 06:40:25 +08:00

85 lines
7.9 KiB
Markdown
Raw 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.
# ML 运行手册审查(ml/README.md)· 精简版
六轮历史(`0218d7f` → `a5e779c`):第一轮 13 条、第二轮可行性、第三~五轮处置、第六轮本机实跑。**已解决的条目按用户要求删去,完整原文在 git 历史里**。本文件只剩三部分:仍有效的实测数字 / 仍未解决的问题 / 已复核正常的项,供实现方下一轮处置。
环境:本机 CBB-003(RTX 3090、28 核、Python 3.12 + torch 2.10 + onnxruntime 1.22、Edge + onnxruntime-web 1.20.1)。
当前结论:第 1–6 步已实测可跑;**第 7–13 步零证据**;R4 部署口径(纯推理)已判通过,`bash ml/pipeline.sh r4` 端到端 rc=0(2026-10-18 本机修复后复跑)。A 组原三处中两处已修,只剩离线部署 A-3。
---
## 一、仍有效的实测数字(后续对照用)
| 项 | 数字 | 口径 |
|---|---|---|
| 对拍 300 条 | PASS(fk 3.4e-13 mm、特征 6e-8、间隙梯度 1.4e-6),7.6 s | 第 2 步 |
| 生成 | 1.56 s/条(80 条 122 s) | 第 4 步 |
| 统计 | keepRate 0.977、samplesPerTask 36.5、projected 178.4 万、exec_s p50 2.3 / p90 3.0 / max 3.7 s、cert.minGap p50 4.4 / p90 5.9 mm | 88 条,**未加 3 mm 过滤** |
| 预训练 | 4.92 M 参数、6208 样本/s(batch=1024)→ 60k 步 ≈ 2.8 h | 250 步冒烟 |
R4(随机初始化模型;延迟只取决于结构,与是否训练无关):
| 接口 | 线程 | proxy | P50 | P95 | P99 |
|---|---|---|---|---|---|
| **enc_once(部署口径)** | 16 | 开 | 7.36 | 9.48 | **11.07** |
| enc_once | 4 | 开 | 10.22 | 11.69 | 12.92 |
| enc_once | 16 | 关 | 7.43 | 9.21 | 10.79 |
| 旧接口(对照) | 16 | 开 | 9.53 | 11.29 | 16.47 |
| 旧接口 | 4 | 开 | 13.88 | 16.35 | 17.19 |
tickGapMax 全部 ≈21.5 ms(20 ms 节拍没被卡住)。背景:第五轮前默认(4 线程、无 proxy、旧接口、真查看器)P99 37.0;线程扫描 8 线程 24.9 / 16 线程 19.5 / 24 线程 25.8 → 16 最优,超线程反而挤。**部署口径纯推理 P99 11.07 < 15,R4 判通过**;`enc_once` 相对旧接口省约 30–33%。
修复后由 `pipeline.sh r4` 自身复跑(两次):部署口径 P99 **10.22 / 11.25**(P50 7.34 / 7.10),4 线程 13.58 / 13.64,无 proxy 9.28 / 10.92;webgpu 仍报 `[webgpu] backend not found`。
真查看器同一会话(随机权重、`?policy=1&probe=1`):inferMs P50/P99/max = **30.36 / 61.64 / 68**,safetyMs = **63.52 / 248.76 / 320.6**;622 次 plan、brakes 4、locks 48、projected 283、lookahead 219。单变量对照:`__POLICY.stop()` 后纯 infer 7.5 / 9.7 ms → 差额是主线程排队,不是模型慢。
---
## 二、仍未解决的问题
### A. 会直接中断本机一键流程(原三处,两处已在本机修复)
**已修复(本机 2026-10-18,`bash ml/pipeline.sh r4` 连跑两次均 rc=0、`pass=true`)**
- 探针页复用 detached tensor:`feat` 的分配移进 `run()`(`webapp/r4_probe.html`)→ proxy=1 的两种配置均正常出数。
- `pipeline.sh` 7 处 `json.load(open(...))` 全部补 `encoding='utf-8'`(`:90 :110 :118 :127 :136 :138 :144`)。
- 附带发现并修掉:r4 分支末行 `[ "$r" = null ] && echo` 在 `r=pass` 时整体返回 1,`set -e` + EXIT trap 把**通过的 r4 记成 rc=1**(`all` 会因此停)。已改为 `if ... then ... fi`。
**A-3 仍未修:`&ortLocal=1` + 默认 proxy 必然失败。**
`ik-policy-glue.js` 把 `ort.env.wasm.wasmPaths` 设为相对前缀 `vendor/ort/`,ORT 对 `.mjs` 走 `import()` 需要绝对说明符 → `no available backend found. ERR: [wasm] TypeError: Failed to resolve module specifier 'vendor/ort/ort-wasm-simd-threaded.mjs'`。README 明确支持的离线部署路径在默认配置下不可用。(`ortLocal=1` + `proxy=0` 未测;`wasmPaths` 与 proxy 无关,大概率同样失败。)
### B. 待实现方判断(数据已摆在上面;分歧按第五轮第〇节规则,以实现方为准)
**B-1 R4 判据用哪个口径。** 纯推理 P99 11.07 判通过;但同一台机、同一会话,整周期 plan = infer 61.6 + safety 248.8(P99),随机权重下 1/3 的规划 >100 ms。如果 R4 的意义是"浏览器能不能按 60 ms 周期推一次",纯推理口径会放过实际丢步的配置。供下一轮的建议(不要求现在改):`r4.json` 记两个数 `infer_p99` 与 `plan_p99 = infer + safety`,后者另设一条线(如 <45 ms,给 60 ms 周期留余量)。
**B-2 `safetyMs` 两把尺。** bench 在 Node 里跑同一份 `ik-policy.js`(CPU EP),浏览器里同一段代码 p99 249 ms——互不可替代,与"仿真安全层 ≠ 部署运行时"是同一类问题换了个位置。判据:同一批贴柱题两边各测一次,差 >3× 就要解释。建议核对 `certBudget=40` 在贴柱位形下的实际查询次数与 `makeCert` 的 memo 命中率——249 ms 的量级不是"随机策略质量"能解释的;真模型是否不同未知。**R9 至今无有效数据**(探针只测纯推理;闭环丢步率因探针一运行 CDP 就拿不到执行槽而没采到——这本身是主线程拥挤的证据)。
**B-3 WebGPU 是判定顺序里的备用通过路径,但至今零数据。** 第五轮判定顺序写了"wasm 不过而 WebGPU 过,也判通过",本机 headless 报 `[webgpu] backend not found`,且 CDN 间歇不可达(jsdelivr 多次 000、unpkg 200)→ 需要一条真能测到 WebGPU 的路(非 headless,或 A-3 修好后本地放 ort)。
### C. 尚未实测(跑之前必须知道这些是空的)
1. **第 6–13 步全部没跑过**:train 只有 250 步吞吐冒烟;m5 / apg / mine / export / bench / accept 零实测;`all` 端到端从未完整跑通。一次完整流程机时下界约 15–28 h,其中 **apg 2–4 h/轮、mine 6 轮都是估的**。
2. **3 mm 间隙过滤的真实剔除比例(`gapDrop`)没测过**:只测过沙箱 30 条(剔 9/29,不具代表性);上表 p50 4.4 mm 是未过滤口径。生成后看 `stats.json` 的 `gapDrop`。
3. **R2 新判据(`label_std_norm`)的池无关性**:需在 1.7 M 样本上 `--pool 50000` 与 `--pool 200000` 两跑、差 <0.02 才成立;没做。默认 `R2_STRICT=0` 只警告,开着就是一道未校准的闸。
4. **R8 出题耗时**:沙箱 2 题 9 分钟没出完;本机未测(`policy_bench.json` 会记 `requested` / `genS`,不足额时看警告)。
5. **Windows 侧生命周期全部未实测**:关控制台黑窗口训练是否继续(`CREATE_NO_WINDOW`)、`/proc/$$/winpid` + `taskkill /T` 能否结束整树、Git Bash 自带 `timeout` 能否把 TERM 送到 python / node。
6. **断点续跑的沙箱自测未在本机复核**:gen 截断续写(「续写:已有 N 条」)、train STOP 存档(rc 143、`last.pt` 第 N 步)、apg `--resume`、prep 二次运行「待打包 0 个」。
### D. 小遗留
`webapp/models/README.md` 过时:还写"由 `--fp16` 生成"、指向"第 8 步"(现为第 10 步、默认 fp32)。
---
## 三、第六轮已复核正常(不在问题清单里)
- `bash ml/pipeline.sh r4` 端到端:修完 A 组两处后连跑两次 rc=0、`pass=true`。
- 锁:`r4` 阶段拿到 `ml/runs/pipeline.lock`,结束已删。
- N-5 三处防护在位:查看器拒绝 `random_init`(提示 `&probe=1`)、`policy_bench.cjs` 拒绝、`acceptance` 有"部署模型是训练产物"项。
- `enc_once` 运行时对接一致:只送 1 行特征(`ik-policy-glue.js:52` / `ik-policy.js:344`),旧模型回退 `[B,F]`。
- `r4` 导出:19.76 MB、`enc_once=true`、与 torch 对拍 2.2e-7。
## 四、建议顺序
1. ~~A 组修复并重跑 `r4`~~:已完成(本机 2026-10-18,rc=0、P99 11.25)。
2. 接着 `FROM=gen TO=prep` 跑一次(数小时),拿 `gapDrop` 与 R2 两个口径的数——C-2 / C-3 随之消掉,B-2 的 Node 侧安全层数字可顺手从 m5 前的 bench 拿。
3. B 组等上面的数字齐了再定;C-1 / C-5 / C-6 随第一次真跑逐项核对;A-3(离线 ort 加载)交给实现方。