From ff160f576e99e993b5dd20a5c34a2436d6fa879b Mon Sep 17 00:00:00 2001 From: cbb <2625274797@qq.com> Date: Tue, 20 Oct 2026 07:56:58 +0800 Subject: [PATCH] =?UTF-8?q?exp(dagger-deploy):=20=E8=BD=AE=E6=AC=A119?= =?UTF-8?q?=E2=80=94=E2=80=94APG=20=E4=BF=AE=E5=A4=8D=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E6=97=A2=E6=9C=89=20bug=EF=BC=88=5Fcat=5Fgaps=20in-place?= =?UTF-8?q?=E3=80=81=E6=AE=B5=E8=BE=B9=E7=95=8C=20queue.detach=20=E6=97=A0?= =?UTF-8?q?=E6=A2=AF=E5=BA=A6=EF=BC=89=E5=90=8E=E5=8F=AF=E8=B7=91=EF=BC=8C?= =?UTF-8?q?=E4=BD=86=E7=A2=B0=E6=92=9E=E9=93=B0=E9=93=BE=E5=B0=BA=E5=BA=A6?= =?UTF-8?q?=E5=A4=B1=E6=8E=A7=EF=BC=8840=E4=B8=87=EF=BC=89=E4=B8=94?= =?UTF-8?q?=E4=B8=8E=E9=83=A8=E7=BD=B2=E5=BD=A2=E6=80=81=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4=EF=BC=8C=E6=9A=82=E4=B8=8D=E9=87=87=E7=94=A8=EF=BC=9B?= =?UTF-8?q?=E8=BD=AC=E5=8F=8D=E9=A6=88=E8=92=B8=E9=A6=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/探索日志.md | 12 ++++++++++++ ml/apg/apg_finetune.py | 5 ++++- ml/common/kin_torch.py | 3 ++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/探索日志.md b/docs/探索日志.md index c47bd5c..8d2fae1 100644 --- a/docs/探索日志.md +++ b/docs/探索日志.md @@ -300,6 +300,18 @@ - 相对 §9.2:到达 42.2% vs ≥98%(差距大);碰撞 2.9% vs 0(接近策略单独 <3% 线);用时 ≤老师×1.3 为 29.1%;推理+认证 P99 未测(桌面均值 12.58 ms,预算 20 ms)。 - 未进入大规模训练(需用户确认 §9.2 锚点)。 +## 轮次 19:APG 闭环策略梯度试跑(exp: `exp/dagger-deploy`,管线修复但暂不采用) + +- **假设**:用闭环目标/碰撞损失直接微调策略(把"朝目标走"内化),减少对执行层反馈的依赖。 +- **判据**:纯策略闭环 success 上升、碰撞铰链下降;部署口径(+反馈/安全层)不降。 +- **配方**:`ml.apg.apg_finetune --init base_dag2_dag1/best.pt --steps 2`(先冒烟;原计划 500 步)。 +- **修复的两个既有 bug**(APG 此前从未实测): + 1. `kin_torch._cat_gaps` 的 `p['b'] += s` 是 in-place,而 `b` 被 autograd 索引反向图引用 → backward 报 version 错;改为 `p['b'] = p['b'] + s`。 + 2. APG 段边界 `queue.detach()` 让下一段执行的动作无梯度;改为只 detach 状态并重置队列(下一 plan 走 r=0 重新提交)。 +- **指标(2 步冒烟)**:EVAL0(纯策略)success 0 / 碰撞 31.8%;第 0 步 col(碰撞铰链均值)**409508**、gnorm 473119(被裁剪)、tgt 206.6、smooth 645;EVAL@2 success 0 / 碰撞 26.0%。 +- **结论**:管线已能跑,但**损失尺度失控**(碰撞铰链均值 40 万,远大于 margin 3mm 的合理量级);且 APG 展开是纯策略口径(无反馈/安全层/每步规划),与当前部署形态不一致。**暂不采用**,转「反馈蒸馏」。 +- **下一步**:反馈蒸馏——用最终部署配置收集 (特征, 复合动作=模型输出+目标反馈) 样本,微调模型把反馈内化。 + ## 分支清理(2026-10-20) - `feat/fb-mix`(8e5431c):反馈混合方案的中间分支,**已验证是 `exp/dagger-deploy` 的祖先**(所有提交都在后者历史里),本地/远端分支删除,内容保留在 exp/dagger-deploy。 diff --git a/ml/apg/apg_finetune.py b/ml/apg/apg_finetune.py index fcacee7..5af5560 100644 --- a/ml/apg/apg_finetune.py +++ b/ml/apg/apg_finetune.py @@ -139,7 +139,10 @@ def main(): stats['tgt'] += lt.mean().item() (seg_loss / nseg).backward() seg_loss = torch.zeros((), device=dev) - q, qp, queue, prev_d = q.detach(), qp.detach(), queue.detach(), prev_d.detach() + # 只 detach 状态并重置队列:段边界下一 plan 走 r=0 重新提交(新图有梯度); + # 沿用旧 queue 会跨过已 backward 的图(二次 backward 报错),也避免整段无梯度 + q, qp, prev_d = q.detach(), qp.detach(), prev_d.detach() + queue = torch.zeros(B, 0, 6, device=dev) # BC 锚定 X, Y, V, SG = data.batch(C['batch'] * 4) with torch.autocast('cuda', dtype=torch.bfloat16, enabled=amp): diff --git a/ml/common/kin_torch.py b/ml/common/kin_torch.py index 9096a06..ce911a7 100644 --- a/ml/common/kin_torch.py +++ b/ml/common/kin_torch.py @@ -131,7 +131,8 @@ class Kin: def _cat_gaps(parts, starts): out = {'gm': torch.cat([p.pop('gm') for p in parts], 0)} if 'b' in parts[0]: - for p, s in zip(parts, starts): p['b'] += s + # 非 in-place:b 会被 autograd 的索引反向图引用(APG 的碰撞铰链梯度路径),+= 会让 backward 报 version 错 + for p, s in zip(parts, starts): p['b'] = p['b'] + s for k in ('b', 'i', 'j', 'gap'): out[k] = torch.cat([p.pop(k) for p in parts]) # 逐键拼、拼完即释放 return out