perf+exp: 轮次34——复用cum_xf进库(22项指标逐位不变)、批量认证压最坏尾部(80→37ms)、FP16/BF16实测无收益
- 撤回一条自己的假收益:先前"合并几何查询→24.5ms"不成立。①第一版把 xf= 传给含5行的 gaps, 只有第0行走完宽相位,认证点全部退回截顶40.0(少干活);②真实顺序 特征→推理→候选→认证, 认证点依赖网络输出,故"特征间隙与认证点合并一次调用"实现上做不到 - 可实现并已落地:gm_groups(..., xf=) 复用 features 已算的 cum_xf,B=1 交错实测 P50 −3.4ms; 256题重跑 22 项指标与轮次33 base 逐项相同 - 新增 --cert_batch(默认0不变):K条候选并成1次 gaps 调用。合成夹具(B=2)断言选择/轨迹/证书逐位一致, 变异检查(换回错误索引)2项测试立即失败;256题重跑同样 22 项指标逐位相同 实测交换:典型 33.5→37.6ms,最坏(前面候选被拒)80.2→37.1ms,P99 64.7→48.3ms - FP16/BF16 实测不比 FP32 快(推理 7.68→8.31→8.58ms),整周期不变而 P99 更差,动作偏差 0.005°/0.038° → 小批量下不是算力受限,半精度不划算,推理保持 FP32 - 仍不达 20ms:下一刀是流水线复用(下次规划的特征间隙=本次已认证的末点),可整块省掉特征 ~13ms - 测试 32→34 项
This commit is contained in:
@@ -235,9 +235,10 @@ class Kin:
|
||||
if not pairs: return {'gm': gm.view(B, 49)}
|
||||
return {'gm': gm.view(B, 49), 'b': rep_b, 'i': pi, 'j': pj, 'gap': gap}
|
||||
|
||||
def gm_groups(self, q, gp, cap=40.0):
|
||||
def gm_groups(self, q, gp, cap=40.0, xf=None):
|
||||
"""只算指定组对 gp=[(a,b),...] 的最小间隙 [B,len(gp)](特征用,避免 49 组全量)。
|
||||
数值与 gaps(q,cap)['gm'][:, a*7+b] 一致;组对在碰撞粗对里不存在时返回 cap。"""
|
||||
数值与 gaps(q,cap)['gm'][:, a*7+b] 一致;组对在碰撞粗对里不存在时返回 cap。
|
||||
xf 可传入调用者已算好的 cum_xf(q),避免同一姿态重复算 FK(特征路径每周期省一次)。"""
|
||||
key = tuple(gp)
|
||||
if getattr(self, '_gp_key', None) != key:
|
||||
m = torch.full((49,), -1, dtype=torch.long, device=q.device)
|
||||
@@ -247,7 +248,7 @@ class Kin:
|
||||
sel = torch.isin(cg, torch.tensor([min(a, b) * 7 + max(a, b) for a, b in gp], device=q.device))
|
||||
self._gp = (m, sel, sel.nonzero(as_tuple=True)[0]); self._gp_key = key
|
||||
self._gp49, sel, idx = self._gp
|
||||
xf = self.cum_xf(q); Rs, Ts = xf; B = q.shape[0]
|
||||
xf = xf if xf is not None else self.cum_xf(q); Rs, Ts = xf; B = q.shape[0]
|
||||
with torch.no_grad():
|
||||
cc = torch.einsum('bkij,kj->bki', Rs[:, self.cl_g], self.cl_c.to(q.dtype)) + Ts[:, self.cl_g]
|
||||
d2 = (cc[:, self.cp_a[idx]] - cc[:, self.cp_b[idx]]).pow(2).sum(-1)
|
||||
|
||||
Reference in New Issue
Block a user