8.1 KiB
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 部署口径(纯推理)已判通过;阻断本机跑 r4 / all 的三处见 A 组。
一、仍有效的实测数字(后续对照用)
| 项 | 数字 | 口径 |
|---|---|---|
| 对拍 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%。
真查看器同一会话(随机权重、?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. 会直接中断本机一键流程的三处(已定位、未修)
A-1 探针页复用 detached tensor(webapp/r4_probe.html:28、:30)
proxy=1 时 ORT 把输入 buffer transfer 给 Worker,而页面把 feat 建在循环外、run() 每次复用同一个 Float32Array → 第二次 run() 报 Tensor's size(83) does not match data length(0)。两种 proxy 配置全挂 → r4.json pass:null、r4_probe.py 非零退出、阶段 rc=1(all 因此会停)。
修法:把 feat 的分配移进 run()(每次新建,一行)。判据:bash ml/pipeline.sh r4 四种配置都出数、pass 非 null。
证据:改过一行的副本四种配置全部正常(上表 16 线程行即出自副本);查看器 Runner._plan 每次新建、不受影响(ik-policy.js:257-258)。
A-2 pipeline.sh 7 处 json.load(open(...)) 无 encoding='utf-8'(:90 :110 :118 :127 :136 :138 :144)
已复现::110 读 r4.json(r4_probe.py:113 以 ensure_ascii=False 写出、含中文)→ Windows GBK 报 UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7。后果不是"读不到就用默认",而是命令替换为空 → 上层分支走错。
其余 6 处同写法;stats.json 由 node JSON.stringify 写出(不转义非 ASCII),文件里一旦有中文就同样炸。统一补 encoding='utf-8' 即可。
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. 尚未实测(跑之前必须知道这些是空的)
- 第 6–13 步全部没跑过:train 只有 250 步吞吐冒烟;m5 / apg / mine / export / bench / accept 零实测;
all端到端从未完整跑通。一次完整流程机时下界约 15–28 h,其中 apg 2–4 h/轮、mine 6 轮都是估的。 - 3 mm 间隙过滤的真实剔除比例(
gapDrop)没测过:只测过沙箱 30 条(剔 9/29,不具代表性);上表 p50 4.4 mm 是未过滤口径。生成后看stats.json的gapDrop。 - R2 新判据(
label_std_norm)的池无关性:需在 1.7 M 样本上--pool 50000与--pool 200000两跑、差 <0.02 才成立;没做。默认R2_STRICT=0只警告,开着就是一道未校准的闸。 - R8 出题耗时:沙箱 2 题 9 分钟没出完;本机未测(
policy_bench.json会记requested/genS,不足额时看警告)。 - Windows 侧生命周期全部未实测:关控制台黑窗口训练是否继续(
CREATE_NO_WINDOW)、/proc/$$/winpid+taskkill /T能否结束整树、Git Bash 自带timeout能否把 TERM 送到 python / node。 - 断点续跑的沙箱自测未在本机复核:gen 截断续写(「续写:已有 N 条」)、train STOP 存档(rc 143、
last.pt第 N 步)、apg--resume、prep 二次运行「待打包 0 个」。
D. 小遗留
webapp/models/README.md 过时:还写"由 --fp16 生成"、指向"第 8 步"(现为第 10 步、默认 fp32)。
三、第六轮已复核正常(不在问题清单里)
- 锁:
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。
四、建议顺序
- A 组三条都是分钟级修复;修完立刻重跑
bash ml/pipeline.sh r4,验收pass非 null。 - 然后
FROM=gen TO=prep跑一次(数小时),拿gapDrop与 R2 两个口径的数——C-2 / C-3 随之消掉,B-2 的 Node 侧安全层数字可顺手从 m5 前的 bench 拿。 - B 组等上面的数字齐了再定;C-1 / C-5 / C-6 随第一次真跑逐项核对。