exp: 轮次39(续)——行程超出2.4倍的成因是换向抖动(23.5%步换向、净位移只占44.5%);len_w=0.1 罚不动量级不匹配
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"config": {
|
||||
"ckpt": "ml/runs/base_dag2_dag1/best.pt",
|
||||
"samples": "ml/data/samples",
|
||||
"tasks": null,
|
||||
"split": "val",
|
||||
"n": 256,
|
||||
"K": 8,
|
||||
"commit": 2,
|
||||
"fb": 2.2,
|
||||
"ki": 0.0,
|
||||
"fb_scale": 0.0,
|
||||
"fb_near": 0.2,
|
||||
"fb_fallback": 0.0,
|
||||
"kdecay": 0.9,
|
||||
"kimax": 0.5,
|
||||
"fb_every": 1,
|
||||
"safety_try": 0,
|
||||
"sel_w": 0.1,
|
||||
"dls_safety": 1,
|
||||
"fb_clear": 0.0,
|
||||
"fb_cmin": 0.3,
|
||||
"sub_refresh": 0,
|
||||
"fb_block_gain": 0.5,
|
||||
"dump": null,
|
||||
"out": "docs/experiment_round39_lenw0.1.json",
|
||||
"trace": null,
|
||||
"select": "ep_len",
|
||||
"replan": "empty",
|
||||
"safety": 1,
|
||||
"partial": 1,
|
||||
"inc_cap": 1,
|
||||
"gap_margin": 0.0,
|
||||
"cert_batch": 0,
|
||||
"steps": 1,
|
||||
"z_scale": 1.0,
|
||||
"len_w": 0.1,
|
||||
"backoff": 0,
|
||||
"max_sec": null,
|
||||
"seed": 0,
|
||||
"dls": "analytic",
|
||||
"device": "cuda"
|
||||
},
|
||||
"batch_size": 256,
|
||||
"batch_seed_rule": "same seed per batch",
|
||||
"checkpoint_sha256": "f7f686fd8ee92fb6948fbcc4ee954636065ad87bb54f661c4f8f575bc16c2ce1",
|
||||
"tasks_sha256": "249bd93457825cda98c59e64d9a096d3473c69aeb3553de1dea6d9e56be71772",
|
||||
"kin_fp": "2ebcbf17",
|
||||
"act_scale": 1.0,
|
||||
"metrics": {
|
||||
"n": 256,
|
||||
"n_ref": 256,
|
||||
"success": 0.51171875,
|
||||
"collision_free_success": 0.51171875,
|
||||
"time_ok_1p3": 0.26953125,
|
||||
"collision_rate": 0.0,
|
||||
"collision_steps_mean": 0.0,
|
||||
"travel_ratio_median": 2.621551036834717,
|
||||
"time_mean_s": 2.4761831760406494,
|
||||
"brakes_mean": 19.48828125,
|
||||
"start_fail": 0.0,
|
||||
"goal_ratio_2s": 0.2874715030193329,
|
||||
"err_fail_med": 208.0048065185547,
|
||||
"err_success_med": 0.24376358091831207,
|
||||
"dls_share": 0.6171875,
|
||||
"time_budget": "teacher×2(≥3 s)",
|
||||
"speed_ratio_p50": 1.0000016689300537,
|
||||
"speed_ratio_p95": 1.0000101327896118,
|
||||
"speed_ratio_max": 1.0000101327896118,
|
||||
"over_vmax_rate": 0.0,
|
||||
"accel_ratio_p95": 1.0000016689300537,
|
||||
"accel_ratio_max": 1.0000101327896118
|
||||
},
|
||||
"simulation_wall_s": 333.6044210000109
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"n": 256,
|
||||
"travel_ratio_median": 2.425084623442128,
|
||||
"travel_ratio_population": "arrived & 有老师参考(与 eval 的 okr 同口径)",
|
||||
"reverse_rate": {
|
||||
"p25": 0.15732546150684357,
|
||||
"p50": 0.23536035418510437,
|
||||
"p75": 0.3025793731212616
|
||||
},
|
||||
"net_over_travel_p50": 0.4447892699092449,
|
||||
"excursion_over_travel_p50": 0.5067885044066773,
|
||||
"still_rate_p50": 0.028846153989434242,
|
||||
"by_group": {
|
||||
"arrived": {
|
||||
"n": 147,
|
||||
"reverse_p50": 0.26143792271614075,
|
||||
"net_over_travel_p50": 0.47818613856136644,
|
||||
"excursion_p50": 0.5500977881151917
|
||||
},
|
||||
"failed": {
|
||||
"n": 109,
|
||||
"reverse_p50": 0.14653243124485016,
|
||||
"net_over_travel_p50": 0.3515762667187255,
|
||||
"excursion_p50": 0.39037085057225707
|
||||
}
|
||||
},
|
||||
"note": "net/行程 越接近 1 越\"单向\";越小越来回抖。excursion/行程 = 各轴走过最大幅度的和 / 总行程,绕远时它接近 1、抖动时明显小于 1"
|
||||
}
|
||||
+8
-1
@@ -52,6 +52,14 @@
|
||||
1. 新加的 `backoff` 指标一度在产物里根本没有——`ml/eval/eval_cl.py:run()` 的 `out` 是**自己显式列键**的,不是从 `rollout` 返回的字典通抄,所以我往 `res` 加的 `backoff_mean` 被无声丢掉。已改成从逐题 `per['backoff']` 汇总(`backoff_mean` + `reject_all_mean = backoff+brakes`,后者才是与"原来全拒次数"可比的量)。**教训:加指标要顺着输出链路走到底,别只改生产端。**
|
||||
2. 停后台 GPU 作业时,`TaskStop` 之后 `bash` 脚本链会活下来并继续拉起下一个 python;而 `nvidia-smi --query-compute-apps` 在这台机器上列不出这些 python(只列 ShellHost/wallpaper32 之类),据此判断"卡已空"会误判。我第一次按 PID 杀子进程后,链条 30 秒后又起了一个新的 eval。第二次我按进程树杀,但**把父子关系读反了**(Windows 的 PPID 在父进程已死时是陈旧值),结果误杀了新链的第一臂。正确做法:重启前用命令行正则列出全量候选、数 python 个数确认单租户,重启后再数一次;杀之前先按 `StartTime` 判新旧。backoff 那一臂因此要补跑。
|
||||
|
||||
## 行程超出的成因分解(轮次 39 续,纯 CPU 读轮次 33 base 转储)
|
||||
|
||||
- 口径先对齐:只在"有老师参考且到达"的题上算,自测 **2.425** 与 eval 报的 2.445 同量级(差别在我按 `t_done/DT` 取窗端,eval 逐步累加),后面的数都在这个口径上。
|
||||
- **超出主要是同一根轴来回抖,不是绕远路**:净位移/总行程中位 **0.445**(完美单调应为 1.0)、各轴最大 excursion/行程 0.507、**换向步占比中位 23.5%**(p25 15.7%、p75 30.3%)。分组看**到达组抖得更厉害**(换向 26.1% vs 未到达组 14.7%)——未到达组的问题是冻住,不是抖。
|
||||
- **对得上训练侧的事实**:预训练本来就有 `w_smooth=0.05` 的二阶差分正则,但闭环仍 23% 换向 ⇒ 训练期的平滑项没管住执行期的抖动。
|
||||
- **第一条 A/B 读数(`len_w=0.1`,256 题、`--inc_cap 1`)**:到达 0.5117(对照 0.5234,−1.2 pp)、时限内 0.2695(+0.4 pp)、**行程比 2.6216 几乎没动**(对照 2.6158)、成功题末态误差 0.2438(对照 0.2175,变差)。
|
||||
原因是量级不匹配,不是方向错:`0.1 × 累计归一行程`(16 步满速在 3 条轴上约 48)只当量 ~5 mm,而早段末态误差是几百 mm ⇒ 罚不动。等 `len_w=0.3/1.0` 两臂看行程比是否真的开始下降;若仍压不住,惩罚对象应从"总行程"换成**换向/二阶差分**(直接打这个 23.5%)。
|
||||
|
||||
## 执行余量与前缀完整性审计(轮次 39 续,纯 CPU 读轮次 33 转储)
|
||||
|
||||
- 256 题 × 195 次同步规划、commit_n=2 ⇒ 169,216 个**真正被执行过的**检查点(每步的端点+中点,间隙在 0.5 mm 截顶)。
|
||||
@@ -882,7 +890,6 @@
|
||||
|
||||
## 分支清理(2026-10-20)
|
||||
|
||||
|
||||
- `feat/fb-mix`(8e5431c):反馈混合方案的中间分支,**已验证是 `exp/dagger-deploy` 的祖先**(所有提交都在后者历史里),本地/远端分支删除,内容保留在 exp/dagger-deploy。
|
||||
- `feat/abs-target`(217a70b):绝对目标参数化负结论分支(轮次 3);打 tag `archive/abs-target` 保留可复现实体后,删除远端分支(本地此前已删)。
|
||||
- `backup/pre-deep-squash`、`backup/pre-squash`:历史备份分支,非实验方案,保留未动。
|
||||
|
||||
Reference in New Issue
Block a user