You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
我们近期研究了 NablaEngine(一个面向 Unitree G1 的融合 CUDA 可微物理引擎,∇Mimic 的底层仿真器),并与 MuJoCo C 的批量仿真能力(mjbatch)做了对比,目的是理解可微仿真的设计空间。以下是我们验证过的事实总结,性能数据来自 NablaEngine 自己发布的 benchmark(
docs/results/paper_rtx6000/paper_bench.md),可能对 UniLab 用户选择物理后端有参考价值。NablaEngine 是什么
NablaEngine 不是 MuJoCo 的封装——它把 MuJoCo 的物理语义(Newton 求解器、implicitfast 积分器、约束模型、碰撞原语)用手写的融合 CUDA kernel 重新实现了一遍,专门面向一个机器人(mjlab G1)。它以 JAX 或 PyTorch 的可微算子形式接入上层框架。
核心架构选择:
与 MuJoCo 的关系
collision_primitive_core.pycollision_adjoint.py,adjoint_util.py_adj_quat_integrateNablaEngine 自己的
THIRD_PARTY_NOTICES.md明确写道其伴随 "follows that adjoint's conventions"(遵循 PR #1535 的约定)。数学覆盖范围比 PR #1535 更窄;贡献主要是工程性能(融合核、共享内存、编译时特化)。梯度来自哪里:手写的解析公式,不是自动微分
梯度来自手推 VJP 公式直接写成 CUDA 设备函数——不经过 NVIDIA Warp、不经过任何自动微分工具、不经过有限差分。
jax.custom_vjp/torch.autograd.Function只负责把写好的 backward kernel 暴露给上层框架。与有限差分(
mjd_transitionFD)的本质算法区别:这不是工程效率差距,而是算法复杂度差距:FD 对每个输入独立探测(O(n));反向模式通过链式法则组合局部导数,从输出端自动扇出到所有输入(O(1))。
实测性能(NablaEngine benchmark,RTX PRO 6000)
重要说明:MuJoCo C 没有解析伴随。2750 ms 是有限差分的结果(每步 99 次正向仿真)。如果有人为 CPU MuJoCo 手写解析伴随,预期代价约为正向的 1–2 倍(合计约 35–70 ms),但目前没有人实现和测量过。
1000× 差距在 ∇Mimic 场景中的意义(4096 envs × 64 步 BPTT)
根本原因:∇Mimic 每次 update 需要 4096 × 64 = 262K 个精确梯度。FD 每步需要 99 次探测 → 每次 update 1.04 亿次 mj_step 调用 → 每次 update 在 CPU 上需要数分钟。CPU 线程池优化无法弥补 99× 的算法差距。
能否在 CPU MuJoCo 上手写解析伴随?
可以,而且大部分数学推导已经存在:
CPU C 实现需要:
估计工作量:约 4000–5000 行 C,1–2 个月。预期性能:16 CPU 线程上 4096-world vjp 约 70 ms(比 GPU 慢约 40×,但比 CPU FD 快约 39×)。这将填补一个真实的空白:通用的、float64 的、CPU 上的可微 MuJoCo。
手写解析梯度的局限性
对后端选择的启示
对 UniLab 的讨论点
UniLab 的
SimBackend接口是否应该包含统一的梯度 API(例如step_with_vjp(cotangents) -> gradients)?目前各后端的梯度能力根本不同:MJX 仅有前向模式;NablaEngine 有反向模式;MuJoCo C 仅有有限差分;MuJoCo Warp 原生无梯度。是否有兴趣发起社区项目,为 CPU MuJoCo C 手写解析伴随? 数学已经发表(PR test(superdex): integrated rollout, checkpoint sim2sim and support evidence (#1533) #1535、MJX);工程上可行(约 4000–5000 行 C)。
对于"超越 GPU 主导"的范式:FD vs 解析的差距(每步 99×)意味着 CPU 在正向吞吐上可以竞争(mjbatch 的线程扩展很好),但在梯度吞吐上没有解析伴随就无法竞争。异构架构可能需要明确承认这个不对称性。
所有 NablaEngine 性能数据来自其公开的
docs/results/paper_rtx6000/paper_bench.md(RTX PRO 6000, nvcc 12.8, 4096 worlds, 10 Newton iterations, 4×5 ms substeps)。CPU FD 数据来自其 MuJoCo C 3.17 adapter(16 线程,float64, mjd_transitionFD)。交叉引用:NablaEngine · ∇Mimic · mjbatch · MuJoCo Warp PR #1535
All reactions