第五轮:锁/续跑/超时/自动分支/R4 探针与 encode-once/控制台加固;阶段内断点续跑(gen 按条、prep 按 shard、训练与 APG 定时原子存档+体面停止);分歧以实现方意见为准
This commit is contained in:
@@ -556,3 +556,103 @@ batch 缩放(4 线程,同一会话):B=1 → 6.2/7.2;B=2 → 10.3;B=4
|
||||
3. **周期账**:部署每 3 步(60 ms)一次推理,安全层单次预算 `safetyMs:30`。4 线程下推理 33 ms 已吃掉一半以上——安全层只要超过 27 ms 就必然丢步;16 线程下 13.7 + ≤30 才谈得上有余量。也就是说 R4 与 R9(贴柱处安全层全程 P99 < 5 ms)是同一个 60 ms 周期的两半,必须一起测。
|
||||
4. **没拿到的数(如实)**:闭环实际倍率/丢步率没采到——我挂的探针一运行,CDP 连 15 s 都取不到执行槽(连 `list_console_messages` 都超时),标签页要到切走才恢复。这本身就是主线程(投影有限差分 + 认证递归都在主线程)在 4 线程 wasm 下已经很挤的证据。R9 因此仍无数据。
|
||||
5. 残留:`webapp/models/traj_policy_r4.onnx`(+`.meta.json`,共 19.8 MB) 是未跟踪文件,`meta.random_init=true`;serve.py 已停,浏览器标签已释放。它同时验证了 N-5 的隐患是真的——这个文件与第 10 步 `export` 的默认输出同名同目录,只差文件名后缀。
|
||||
|
||||
---
|
||||
---
|
||||
|
||||
# 第五轮:对第四轮的处置(实现方回复,2026-10-18)
|
||||
|
||||
处置对象:第四轮 N-1~N-16、第六节「无人值守跑完」四个缺口、第七节 R4 实测。
|
||||
结论先说:**第四轮全部认可,按第六节的目标一次改完**(不走 A/B/C 分批)。三道门槛(运行时 5 mm 护栏、M5 ≤ 2%、`collisionFrames = 0`)不动;「跑通 ≠ 达标」原样保留。
|
||||
|
||||
## 〇、分歧裁决规则(用户 2026-10-18 确定)
|
||||
|
||||
审查方与实现方意见不一致、讨论后仍定不下来时,**以实现方(Hark)的意见为准**,按它落地,不再停下来等第三方拍板。
|
||||
审查方的异议照常写进下一轮文档,附上判据;下一轮如果实测数据证明实现方错了,按数据改,不另起争论。
|
||||
本轮实际只有两处分歧:N-6 和 R4 的改法(见第二节)。按上述规则,两处均按实现方意见落地。
|
||||
|
||||
## 一、逐条处置
|
||||
|
||||
| 条目 | 处置(代码落点) | 自测 |
|
||||
|---|---|---|
|
||||
| N-7 并发无锁 | `ml/pstate.py` 新增互斥锁 `ml/runs/pipeline.lock`(`O_EXCL` 原子创建;pid + 每 60 s 心跳;5 分钟无心跳视为失效可接管)。`pipeline.sh` 在**任何**阶段入口先拿锁,`all` 的子阶段继承;监控页判断是否在跑只看锁,不再看日志新鲜度。生成改为先写 `shard_XXXX.jsonl.part`、写完才改名 | 先起 gate1,再起 gen → 立即拒绝(返回码 9,报出持锁 pid);TERM 后阶段记 143、锁释放 |
|
||||
| N-8 控制口无校验 | `/api/start`、`/api/stop` 要求自定义头 `X-Console: 1`,`Origin` 和 `Sec-Fetch-Site` 有值时必须同源。跨站页面加自定义头会触发 CORS 预检,本服务不应答 OPTIONS,浏览器就不会发出请求 | 不带头 → 403;带头但 `Origin: https://evil.com` → 403;同源 → 200 |
|
||||
| N-9 刷新全量读 shard | 行数按文件增量统计(记住偏移,只读新增字节),只在 gen 阶段做;其他阶段用 `stats.json` 的 `tasks` | — |
|
||||
| N-10 启动器 Python | `console.bat` 尊重 `%PYTHON%`,判据改为 `import torch`;`console.sh` 依次试 `PYTHON` / `python` / `python3`,判据相同。monitor 启动后后台自检(训练用 Python、torch 版本、GPU、node、bash),不过则网页「开始训练」不可点、`/api/start` 拒绝;`all` 开头再查一次 `import torch` | 沙箱自检输出正确(CPU torch 给出「看不到 GPU」警告) |
|
||||
| N-11 生命周期 | Windows 子进程用 `CREATE_NO_WINDOW | CREATE_NEW_PROCESS_GROUP`(自带隐藏控制台,关掉控制台黑窗口不连带结束);锁里记 Windows pid(Git Bash 的 `/proc/$$/winpid`),重开的控制台可按锁停止。APG 新增 `--resume`(`last.pt` 带优化器状态);`loop.sh` 跳过已有 `gate.json` 的轮次、本轮 APG 断了从该轮 `last.pt` 续跑;`train` 自动带 `--resume`,测速 2000 步做过就跳过 | APG 2 步 → `--resume` 续到 4 步,日志「从第 2 步继续」,`last.pt` step=4 含 opt |
|
||||
| N-16 gen 无节拍 / 死循环 | `run_parallel.sh` 每 60 s 往控制台打一行节拍(已写条数 + 各进程最新进度),逐个 `wait` 子进程查返回码(原来的裸 `wait` 恒为 0),任一种子失败即返回码 6 并打印该种子日志尾部。`sampler.cjs` 所有拒绝采样设次数上限,超限抛错并写明「哪一类位形连续 N 次未命中」 | 4 条任务小跑:重跑时已完成种子跳过;补量第 1 次触发并写对 `target_tasks` |
|
||||
| N-5 随机模型踩真模型 | `r4` 导出到 `ml/runs/r4/traj_policy_r4.onnx`,不再写 `webapp/models/`;查看器遇到 `random_init` 默认拒绝(`&probe=1` 才放行,徽标标红「随机探针模型」);`policy_bench.cjs` 拒绝;`acceptance` 新增「部署模型是训练产物」一项 | bench 加载随机模型 → 拒绝退出 |
|
||||
| N-2 R2 与池耦合 | 判据改为 `label_std_norm`:在距离较近的一半近邻对上做「标签差 ~ 近邻距离」线性回归,取距离 → 0 的截距。池变大只会让近邻更近、点更多,截距估的都是同一输入下的固有分歧;旧口径 `label_std_mean` 保留为参考,并记录 `pool`。不通过默认**警告并继续**,`R2_STRICT=1` 才停;验收里 R2 改为参考项 | 小样本可跑通(数值无意义);池无关性要用 1.7 M 样本的 `--pool 50000` 与 `--pool 200000` 两跑验证(差 < 0.02 为成立) |
|
||||
| N-3 R7 口径 | `closed_loop.py` 新增 `j1_first`:J1 累计偏离首次超过 5° 时的方向,即真正的首次方向;全程不到 5° 的退回净方向。`gate.py` 去掉无用形参 | 语法检查 |
|
||||
| N-4 r8 不足额静默 | bench 记录 `requested` 与出题耗时 `genS`,不足额时打印警告;acceptance 对 `n < requested` 判不通过 | 见第三节 |
|
||||
| N-12 双写者 | 停止后的状态改写走 `pstate.mark_stopped()`(原子替换);`pipeline.json` 只有 pstate 一个写者 | 网页停止 → 阶段记 −15、`current` 清空、锁删除 |
|
||||
| N-13 target 读失败 | 新增 `pstate get`,读不到时非零退出;`set -e` 下直接失败,不再算出 56 这类值 | `get gen target_tasks` 缺失 → rc 1 |
|
||||
| N-14 权重不同源 | 阶段名、估时、超时上限统一在 `pstate.STAGES`,由 `/api/status` 下发给网页;gen 权重 1.0 → 5.0(共识分支上界) | 示例页 4 个场景无报错 |
|
||||
| N-1 `MIN_GAP_MM` | `pipeline.sh` 统一 `export MIN_GAP_MM=3`,并作为参数记进 `pipeline.json`(改了会使生成及之后阶段作废);prep 开头比对 `stats.json` 的 `minGapFilterMm`,不一致返回码 8;网页可设 | `MIN_GAP_MM=4` 跑 prep → 报错退出 |
|
||||
| N-6 分块 | **分歧,见第二节**。改为按空闲显存自动定块(用 1/4,256~8192) | — |
|
||||
| N-15 file:// demo | 示例模式在页面顶部显示黄色提示条;README 写明不要直接双击 html | — |
|
||||
|
||||
第六节四个缺口的对应:
|
||||
|
||||
| 缺口 | 落地 |
|
||||
|---|---|
|
||||
| 1 状态机闭环 | `pstate reset` 默认保留 rc=0 的阶段;`all` 只跑 `pstate todo` 列出的阶段。**参数变了只作废受影响的阶段**(`AFFECTS` 表:生成参数 → gen 起;`CFG` → r4 和 train 起;挖错参数 → mine 起),被作废阶段的产物移到 `ml/archive/<时间>/`,不删除;`FRESH=1` 全部作废。网页不再问起始阶段,只选「续跑 / 从头重跑」 |
|
||||
| 2 互斥 + 脱离控制台 | 见 N-7、N-11 |
|
||||
| 3 门槛自动分支 | R2 默认警告继续;M5 base 不过 → 流程内自动训 WTA 再判,两头都不过才停(`AUTO_WTA=0` 关闭);补量上限 2 → 4 次,补完仍不足 90% 目标时警告并继续;R4 自动探针(第二节) |
|
||||
| 4 心跳与超时 | 每阶段 `timeout_h` = 估时 ×3(m5 按含 WTA 分支计),`all` 用 `timeout -k 120` 包住每个阶段,超时整组进程收到 TERM,阶段记 `timed_out`、放锁;网页显示「本步粗估 / 上限」与「超过时间上限,判定卡死」 |
|
||||
|
||||
自测(沙箱、秒级):用 `TIMEOUT_SCALE=0.002` 把 gate1 上限压到 10 s → 返回码 124,阶段标 `timed_out`,node 子进程全部结束,锁释放。
|
||||
|
||||
## 二、两处分歧(按第〇节规则以实现方意见落地)
|
||||
|
||||
### N-6:不是自相矛盾
|
||||
|
||||
`kin.gaps` 按 `d² ≤ (胶囊对下限 + cap)²` 筛候选对。`min_gap_chunked` 用 `cap = 0.5 mm`,每个随机位形幸存约 2800 对(≈ 1.5 MB);`column_gap` 用 `cap = 40 mm`,40 mm 以内幸存的对多一个量级(≈ 20 MB)。两处的峰值差 13 倍是 cap 不同造成的,两个默认块大小在各自的 cap 下都对。
|
||||
第四轮说得对的是「24 GB 显存上 256 偏小、拖慢出题」,所以块大小改为按空闲显存自动计算(`tasks.auto_chunk`),两处只需传入各自的每位形峰值。
|
||||
|
||||
### R4:33 ms 里不全是模型本身的开销
|
||||
|
||||
第四轮的结论是「必须动结构,二选一:去掉重复 encoder,或 K=8 → 4」。我的处置不同:
|
||||
|
||||
1. **推理移出主线程(第四轮没提,最重要)**:原来 `ik-policy-glue.js` 没开 `ort.env.wasm.proxy`,wasm 推理在主线程同步执行。第七节第 4 条里「CDP 15 s 拿不到执行槽」就是这个原因;50 Hz 的 `tick` 也被一起拖住,所以丢步不只来自推理时长本身。现在默认开代理 Worker(`&proxy=0` 关),创建失败时自动退回主线程并在徽标上写明。
|
||||
2. **编码一次**:同意第四轮的方向 ①。ONNX 接口改为 `feat[1,83]`、`z[K,16,6]`(`Policy.sample_shared`,`meta.enc_once`);导出时断言与旧接口逐元素一致(误差 < 1e-4);运行时按 `meta.enc_once` 只送 1 行,旧模型照常可用。按 base.json 粗算,encoder 约占总计算 29%,可省约 25%;**沙箱 CPU 实测**(onnxruntime 2 vCPU,200 次):旧接口 P50 10.03 / P99 10.34 ms → 新接口 8.03 / 8.18 ms,省约 20%。
|
||||
3. **线程数**:默认 `min(16, ⌊0.6×逻辑核⌋)`(28 核机 = 16,即第七节实测最优),`&threads=N` 可覆盖。
|
||||
4. **K=8 不降**:降 K 损失的是选优质量,要有 M5 / 闭环数字才能判,现在没有依据。
|
||||
5. **WebGPU 必须测**:方案 R4 行本来就写了要同测 WebGPU,第七节没测。探针现在 4 种配置都测:默认线程 + Worker(部署口径)、4 线程(对照)、默认线程不开 Worker(看 `tickGapMax`,即推理是否卡住 20 ms 节拍)、WebGPU。
|
||||
|
||||
**判定顺序**:部署口径 P99 < 15 ms 即通过;wasm 不过而 WebGPU 过,也判通过并记 `deploy_ep: webgpu`;两者都不过,流程在训练前停下(返回码 5),改 `CFG=ml/configs/small.json`(d=128)重跑。
|
||||
**预估(未实测,不当已解决)**:16 线程旧接口 P99 19.5 ms × (1 − 0.2~0.25) ≈ 14.6~15.6 ms,正好踩在线上;WebGPU 在 3090 上的数字是这一轮最关键的未知数。
|
||||
**R9**:探针只测纯推理。贴柱处安全层耗时(R9)仍以 bench 的 `safetyMsP99` 为准;推理移出主线程后,安全层独占主线程,R4 与 R9 合起来要小于 60 ms 周期这笔账,等真机数据再核。
|
||||
|
||||
## 三、断点续跑(用户 2026-10-18 追加要求)
|
||||
|
||||
要求:长时间的步骤意外中断(断电、蓝屏、误关、手动停止)后能接着跑,不从头来。阶段级跳过上一版已有,这一版把**阶段内部**也做成可续:
|
||||
|
||||
| 阶段 | 续跑粒度 | 做法 |
|
||||
|---|---|---|
|
||||
| gen | 每条任务 | 第 i 条任务的随机数只由(种子, i)决定(`sampler.reseed`);`.part` 里保留完整的行、截掉写了一半的最后一行,从下一条接着写。沙箱验证:截断后续写的结果与一次写完逐条一致(id、q0、keep 全同)。 |
|
||||
| prep | 每个 shard | `tasks.jsonl` 最后写且先写 `.tmp` 再改名,它存在且比 shard 新就跳过;shard 已不存在的旧打包删掉。 |
|
||||
| train / WTA | 最多 10 分钟 | 每 10 分钟原子写 `last.pt`(`ckpt_min`,先写 `.tmp` 再 `os.replace`,写到一半断电旧档仍完整),含优化器、步数、最好成绩、早停计数;发散时不再用发散权重覆盖 `last.pt` / `best.pt`。 |
|
||||
| apg / 挖错 | 最多 10 分钟 | 同上;挖错已过门禁的轮次跳过。 |
|
||||
| m5 | 半个门禁 | 比检查点新的 `m5_<头>_policy.json` / `_safety.json` 跳过;结果文件改为原子写;检查点不存在按不通过处理(直接进入 WTA 分支)。 |
|
||||
|
||||
**停止也不丢进度**:网页「停止」在训练类阶段先写 `ml/runs/STOP`,训练进程 2 秒内看到后存档、以 143 退出,最多等 90 秒才硬杀(Windows 的 `taskkill /F` 收不到信号,所以靠文件)。终端 Ctrl+C / `kill` 走信号,同样先存档。新一次运行拿到锁时清掉旧的 STOP。
|
||||
沙箱验证:STOP 文件 → rc 143、`last.pt` 在第 180 步,续训从 180 到 200 正常收尾;`kill -TERM` → rc 143 并存档;`kill -9`(模拟断电)→ 定时存档的 `last.pt` 完好可读;打包第二次运行「待打包 0 个」。
|
||||
不续的只有几分钟级的步骤(kin、gate1、r4、export、bench、accept),整步重跑。
|
||||
|
||||
## 四、仍未验证(如实)
|
||||
|
||||
- **Windows 侧全部没有实测**:`CREATE_NO_WINDOW` 下关掉黑窗口训练能否继续跑;`/proc/$$/winpid` 与 `taskkill /T` 能否结束整棵树;Git Bash 自带的 `timeout` 能否把 TERM 送到 python.exe / node.exe 子进程(Linux 下已验证会结束整个进程组)。
|
||||
- **R4 探针没在真浏览器跑过**(沙箱没有 Chromium):onnxruntime-web 1.20 的 proxy 从 jsDelivr 加载能否建出 Worker(建不出会自动退回并写明 `proxyError`)、无头模式下 WebGPU 是否可用。
|
||||
- R2 新判据的池无关性只能在 1.7 M 样本上验证(判据见第一节表)。
|
||||
- R8 出题耗时:沙箱 2 vCPU 出 2 题 9 分钟仍未出完,已停掉,改在本机测;`policy_bench.json` 的 r8 段会记录请求题数、实际题数和出题耗时。
|
||||
- 训练 / APG / 挖错的机时仍然零实测,第七节之后的结论不变。
|
||||
|
||||
## 五、请在本机按顺序验证
|
||||
|
||||
1. `git apply review5_fixes.patch`(基于 `e3bb783`)。
|
||||
2. 激活训练环境,双击 `ml/console.bat`:页面「全流程」卡片底部应显示 Python / torch / GPU;用 `set PYTHON=C:\不存在\python.exe` 再双击,应直接提示「不能 import torch」。
|
||||
3. 终端单跑 `bash ml/pipeline.sh r4`,把 `ml/runs/r4.json` 发我:4 种配置的 P50/P99、`proxy` 是否为 true、`tickGapMax`、WebGPU 数字。
|
||||
4. 网页「开始训练」(续跑),在 gen 节拍出现后:① 另开 Git Bash 跑 `bash ml/pipeline.sh gen`,应被拒绝(返回码 9);② 关掉控制台黑窗口,任务管理器里 node 进程应仍在;③ 重新双击 `console.bat`,页面应显示「由上一个控制台窗口启动」,点「停止」应结束全部 node 进程。
|
||||
5. 其余照常跑到 prep,把 `stats.json`(`gapDrop`)与 `r2.json`(`label_std_norm` 和 `label_std_mean` 两个口径)发我。
|
||||
6. 断点续跑:gen 跑到一半点「停止」再点「续跑」,`ml/data/log_*.txt` 应出现「续写:已有 N 条」;train 跑过 10 分钟后点「停止」,终端应出现「已存档 last.pt(第 N 步)」,续跑后出现「续训:从第 N 步继续」。
|
||||
|
||||
@@ -519,9 +519,11 @@ MeanFlow
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td>推理后端</td>
|
||||
<td>onnxruntime-web wasm-SIMD 多线程</td>
|
||||
<td>onnxruntime-web wasm-SIMD 多线程,推理放代理
|
||||
Worker(不占主线程),线程数 min(16, ⌊0.6×逻辑核⌋);R4 探针同测
|
||||
WebGPU,wasm 不达标而 WebGPU 达标则部署用 WebGPU</td>
|
||||
<td>C</td>
|
||||
<td>小模型下 WebGPU 调度开销占主导</td>
|
||||
<td>小模型下 WebGPU 调度开销通常占主导,以 R4 实测为准</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -882,7 +884,9 @@ WTA 谁更好</strong>;因此 WTA 只作为 M5
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td>部署推理</td>
|
||||
<td>浏览器 onnxruntime-web wasm-SIMD 多线程;后续真机控制器</td>
|
||||
<td>浏览器 onnxruntime-web wasm-SIMD 多线程(代理 Worker);ONNX 接口
|
||||
feat[1,83]、z[K,16,6]:观测编码一次、K=8
|
||||
条候选共享编码再解码;后续真机控制器</td>
|
||||
<td>与现有查看器同页</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@@ -1515,10 +1519,15 @@ held-out 闭环仿真(开仿真安全层)测量,由
|
||||
<tr class="even">
|
||||
<td>R4</td>
|
||||
<td>浏览器推理延迟</td>
|
||||
<td>训练前用随机初始化模型导出 ONNX(延迟与权重无关),wasm-SIMD
|
||||
多线程测 batch=8 P99 < 15 ms</td>
|
||||
<td>减小模型(d=128,约 1.8M 参数);同时测 WebGPU,更快则换</td>
|
||||
<td><strong>M1 前(最大不确定项,训练前结掉)</strong></td>
|
||||
<td>训练前用随机初始化模型导出
|
||||
ONNX(延迟与权重无关),<code>pipeline.sh r4</code>
|
||||
无头浏览器自动测部署口径 K=8 P99 < 15 ms(2026-10-18 本机实测旧接口 4
|
||||
线程 37.0 ms、16 线程 19.5 ms,均不达标)</td>
|
||||
<td>先做三项不改模型的改动:编码一次(沙箱 CPU 实测省约 20%)、默认线程
|
||||
16、推理移出主线程;仍不达标则 WebGPU 达标即用 WebGPU,否则
|
||||
d=128(<code>configs/small.json</code>,约 1.8M 参数)。K=8 不降</td>
|
||||
<td><strong>M1
|
||||
前(最大不确定项,训练前结掉;不过流程自动停)</strong></td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td>R5</td>
|
||||
@@ -1596,20 +1605,23 @@ a_max、插补频率与提交步数。</li>
|
||||
</ol>
|
||||
<hr />
|
||||
<h2 id="11-目录规划">11. 目录规划</h2>
|
||||
<p>运行步骤、命令与耗时见 <code>ml/README.md</code>。</p>
|
||||
<p>运行步骤、命令与耗时见
|
||||
<code>ml/README.md</code>。所有长步骤都能断点续跑,意外中断最多损失几分钟:生成按条续写(每条任务的随机数只由种子和序号决定),打包按
|
||||
shard 跳过,预训练与 APG 每 10 分钟原子存一次
|
||||
<code>last.pt</code>,停止时先存档再退出。</p>
|
||||
<pre><code>ml/
|
||||
pipeline.sh 阶段脚本:setup / kin / gate1 / gen / prep / train / m5 / apg / mine / export / bench
|
||||
gen/ sampler / teacher(确定性 PRM A*)/ timelaw / gen_dataset / consistency / stats / run_parallel.sh
|
||||
prep/ export_kin.cjs → assets/kin.json;build_dataset.cjs → data/samples/*.npy;run_prep.sh
|
||||
data/ (不入库)shard_*.jsonl stats.json consistency.json samples/
|
||||
common/ kin_torch.py(可微运动学 + 胶囊间隙) features.py(83 维特征)
|
||||
common/ kin_torch.py(可微运动学 + 胶囊间隙) features.py(83 维特征) ckpt.py(原子存档、定时存档、体面停止)
|
||||
model/ policy.py(MeanFlow 头;WTA K=8 回退头) meanflow.py
|
||||
data.py train.py 样本加载、预训练
|
||||
sim/closed_loop.py 闭环仿真(验证、挖错、门禁共用)
|
||||
apg/apg_finetune.py APG 可微微调
|
||||
mining/ tasks.py mine_round.py gate.py loop.sh
|
||||
eval/ dump_parity.cjs check_parity.py(JS ↔ PyTorch 对拍)
|
||||
configs/ base.json wta.json apg.json
|
||||
configs/ base.json wta.json small.json apg.json
|
||||
export_onnx.py serve.py README.md
|
||||
webapp/js/ik-policy.js 运行时:特征、距离下界认证、刹停、投影、精修、Runner(浏览器与 Node 共用)
|
||||
webapp/js/ik-policy-glue.js 查看器接入(?policy=1)
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
| 安全层 | 距离下界认证 + 可刹停不变式 | A | Schwarzer 2005 连续认证;Thumm & Althoff 2022 failsafe |
|
||||
| 30/30 手段 | 子目标头、价值头、冷启动/卡死时短前瞻、卡死换向 | B / C | AWE、SHAC、BID |
|
||||
| 老师 | PRM 路网 A* + 捷径平滑(确定性);A* 失败才用 `solveDyn` | B | MπNets:老师不一致碰撞率 13.78%,一致老师 0.94% |
|
||||
| 推理后端 | onnxruntime-web wasm-SIMD 多线程 | C | 小模型下 WebGPU 调度开销占主导 |
|
||||
| 推理后端 | onnxruntime-web wasm-SIMD 多线程,推理放代理 Worker(不占主线程),线程数 min(16, ⌊0.6×逻辑核⌋);R4 探针同测 WebGPU,wasm 不达标而 WebGPU 达标则部署用 WebGPU | C | 小模型下 WebGPU 调度开销通常占主导,以 R4 实测为准 |
|
||||
|
||||
### 1.1 取舍决定(每项只有一个答案)
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
|---|---|---|
|
||||
| 数据生成 | Hark 沙箱(2 vCPU / 7 GB,Node)或用户机器 | 纯 JS,无需 GPU |
|
||||
| 预训练 + 后训练 | 用户 RTX 3090 24 GB | batch 1024–2048 |
|
||||
| 部署推理 | 浏览器 onnxruntime-web wasm-SIMD 多线程;后续真机控制器 | 与现有查看器同页 |
|
||||
| 部署推理 | 浏览器 onnxruntime-web wasm-SIMD 多线程(代理 Worker);ONNX 接口 feat[1,83]、z[K,16,6]:观测编码一次、K=8 条候选共享编码再解码;后续真机控制器 | 与现有查看器同页 |
|
||||
|
||||
```bash
|
||||
conda create -n armtf python=3.11 -y && conda activate armtf
|
||||
@@ -444,7 +444,7 @@ for 每个 batch(随机采样 q0 和目标,不需要老师):
|
||||
| R1 | 老师在相邻任务上左右绕行跳变,标签自相矛盾 | 起终点扰动 ±5 mm 的邻居任务同伦类一致率 ≥ 90% | 对 A* 边代价加左右偏好项,强制同区域选同侧 | M1 |
|
||||
| R2 | 时间律仍有不可观测成分,闭环起不了步 | 近邻样本标签方差 < 10% 步长(`ml/eval/check_r2.py`);起步失败率 = 0(闭环 `start_fail`) | 进一步把剩余路程估计加入输入 | M1 / M5 |
|
||||
| R3 | 距离认证过于保守,贴柱处拒绝率高,影响 30/30 | near_column 上认证拒绝率统计;离线 10⁵ 段 0.01° 审计漏检 = 0 | 训练余量提高到 4–6 mm,接受行程变长;收紧杠杆界(按位形分区) | M2 / M7 |
|
||||
| R4 | 浏览器推理延迟 | 训练前用随机初始化模型导出 ONNX(延迟与权重无关),wasm-SIMD 多线程测 batch=8 P99 < 15 ms | 减小模型(d=128,约 1.8M 参数);同时测 WebGPU,更快则换 | **M1 前(最大不确定项,训练前结掉)** |
|
||||
| R4 | 浏览器推理延迟 | 训练前用随机初始化模型导出 ONNX(延迟与权重无关),`pipeline.sh r4` 无头浏览器自动测部署口径 K=8 P99 < 15 ms(2026-10-18 本机实测旧接口 4 线程 37.0 ms、16 线程 19.5 ms,均不达标) | 先做三项不改模型的改动:编码一次(沙箱 CPU 实测省约 20%)、默认线程 16、推理移出主线程;仍不达标则 WebGPU 达标即用 WebGPU,否则 d=128(`configs/small.json`,约 1.8M 参数)。K=8 不降 | **M1 前(最大不确定项,训练前结掉;不过流程自动停)** |
|
||||
| R5 | MeanFlow 头在 6 轴、位姿目标下穿柱或训练不稳 | near_column 穿柱率(关安全层)≤ 2%;损失不发散 | 同骨干换 WTA K=8 头 | M5 |
|
||||
| R6 | 位姿目标的多 IK 分支带来额外多峰 | 不同肘/腕分支子集到达率 ≥ 主集 − 2 个百分点 | 加目标分支标志 | M5 |
|
||||
| R7 | APG 压缩多模态或拉长路径(ELMP 中路径 +23%) | 每轮门禁:B/C 类左右绕行比例变化 ≤ 5 个百分点、行程中位数比 ≤ 1.05(`ml/mining/gate.py`) | 加大 BC 锚定权重;行程项 | M6 |
|
||||
@@ -469,7 +469,7 @@ for 每个 batch(随机采样 q0 和目标,不需要老师):
|
||||
|
||||
## 11. 目录规划
|
||||
|
||||
运行步骤、命令与耗时见 `ml/README.md`。
|
||||
运行步骤、命令与耗时见 `ml/README.md`。所有长步骤都能断点续跑,意外中断最多损失几分钟:生成按条续写(每条任务的随机数只由种子和序号决定),打包按 shard 跳过,预训练与 APG 每 10 分钟原子存一次 `last.pt`,停止时先存档再退出。
|
||||
|
||||
```
|
||||
ml/
|
||||
@@ -477,14 +477,14 @@ ml/
|
||||
gen/ sampler / teacher(确定性 PRM A*)/ timelaw / gen_dataset / consistency / stats / run_parallel.sh
|
||||
prep/ export_kin.cjs → assets/kin.json;build_dataset.cjs → data/samples/*.npy;run_prep.sh
|
||||
data/ (不入库)shard_*.jsonl stats.json consistency.json samples/
|
||||
common/ kin_torch.py(可微运动学 + 胶囊间隙) features.py(83 维特征)
|
||||
common/ kin_torch.py(可微运动学 + 胶囊间隙) features.py(83 维特征) ckpt.py(原子存档、定时存档、体面停止)
|
||||
model/ policy.py(MeanFlow 头;WTA K=8 回退头) meanflow.py
|
||||
data.py train.py 样本加载、预训练
|
||||
sim/closed_loop.py 闭环仿真(验证、挖错、门禁共用)
|
||||
apg/apg_finetune.py APG 可微微调
|
||||
mining/ tasks.py mine_round.py gate.py loop.sh
|
||||
eval/ dump_parity.cjs check_parity.py(JS ↔ PyTorch 对拍)
|
||||
configs/ base.json wta.json apg.json
|
||||
configs/ base.json wta.json small.json apg.json
|
||||
export_onnx.py serve.py README.md
|
||||
webapp/js/ik-policy.js 运行时:特征、距离下界认证、刹停、投影、精修、Runner(浏览器与 Node 共用)
|
||||
webapp/js/ik-policy-glue.js 查看器接入(?policy=1)
|
||||
|
||||
Reference in New Issue
Block a user