Repository navigation
End-to-end RL training benchmark: Newton vs PhysX in Isaac Lab (Go2 locomotion), with throughput scaling, per-process VRAM, and a dynamics-equivalence probe #3331
yusufdxb
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Hi all - I ran a controlled comparison of the Newton (MuJoCo-Warp) and PhysX backends in Isaac Lab 3.0 on the stock
Isaac-Velocity-Flat-Unitree-Go2-v0task, end-to-end through RL training, on a consumer Blackwell-architecture NVIDIA GPU. I'm sharing it because the public numbers I could find are solver-level (the asv suite, the MJX comparisons, one dexterous-manipulation PhysX datapoint), and I couldn't find an end-to-end training comparison, VRAM data, or consumer-GPU coverage anywhere. This seems relevant to #2946 (benchmark coverage) and the RL-iteration discussion in #3257.Full methodology, scripts, and raw artifacts: https://github.com/yusufdxb/physx-newton-bench (tagged
newton-physics). Every number below traces to an on-disk artifact there.Setup
a4a7602f), Newton 1.0.0, Warp 1.12.0, mujoco-warp 3.5.0.2, rsl-rl 5.0.1, torch 2.10.0+cu128, driver 570.211.01 / CUDA 12.8 (fullpip freeze+ env capture in the repo)Isaac-Velocity-Flat-Unitree-Go2-v0(manager-based, rsl_rl PPO, stock config, 300 iterations)presets=physx/presets=newtontoken; the resolved per-run config is dumped to disk and diffed: only the physics-manager block differsMJWarpSolverCfg(njmax=65, nconmax=35, cone="pyramidal", integrator="implicitfast"), 1 substep): deliberately NOT retuned; this is a stock-vs-stock comparison1. Throughput scaling (pure stepping, zero-action, warmup excluded)
10 independently timed repeats per point, mean ± std env-steps/s, VRAM measured per-PID (
nvidia-smi --query-compute-apps), not whole-GPU:Methodology notes that matter for reading the table:
nconmaxsaturation), not a collapsed one.sim.dt=0.005(Newtonnum_substeps: 1; PhysX has no substep multiplier in this config): the resolved per-run configs are committed in the repo, and the twoagent.yamlare identical up torun_name.Two things stood out:
gpu_max_rigid_patch_count = 10·2¹⁵) while stock Newton sizes tight per-env buffers (njmax=65, nconmax=35). It is what a stock-config user experiences on this task; a tuned-buffer comparison would narrow it.2. Learning behavior (n=10 seeds per backend, identical stock config)
Honest split, because the two views disagree:
3. Open-loop dynamics-equivalence probe (the part I found most interesting)
Same asset, num_envs=1, all randomization off, identical initial state, identical open-loop action tape, 6 s horizon, recorded under both backends (twice each):
FL_hip, FR_hip, RL_hip, …; Newton leg-major:FL_hip, FL_thigh, FL_calf, …). Feeding one backend's action vector to the other without remapping silently commands different physical joints. Worth knowing about when doing sim2sim by hand, alongside Isaac Lab'snewton_to_physx_go2.yamltooling.DCMotorCfg(stiffness=25, damping=0.5)(explicit Python-side PD applied as effort), the PhysX data path reports physics-level joint stiffness/damping 0/0 while Newton reports 25/0.5. I traced this through Isaac Lab and MJWarp source and confirmed empirically on the live model (mjw_model.nu == 0, all 12 jointsJointTargetMode.EFFORT): MJWarp builds zero PD actuators, so the echoed gains are never consumed, and the comparison above is a true single-PD-vs-single-PD comparison on both backends. The write-order issue in Isaac Lab's Newton articulation path that causes the misleading echo (and that becomes genuine double-PD for assets with nonzero USD drive gains) turned out to be already reported as [Bug Report] Newton backend re-enables joint target stiffness/damping for explicit actuators, causing different rest pose from PhysX isaac-sim/IsaacLab#5806; I've added the full trace and the livenu==0measurement there.Consequence for RL users: the reward gap in section 2 is expected given measurably different contact dynamics: cross-backend transfer of a trained policy can't be assumed without re-validation.
Caveats
Single task (Go2 flat velocity), single robot, single GPU. Stock solver settings on both sides: no per-backend tuning attempted. Pure-step probe uses zero actions. One action tape / one dt in the dynamics probe; late-time divergence mixes the systematic difference with deterministic sensitive-dependence amplification through contact (the clean signal is the 0.118 rad settle-phase number). The Newton backend in Isaac Lab 3.0 is experimental, so these numbers will move. No sim-to-real claims.
Happy to run additional configs if useful for #2946, and glad to be corrected on any of the methodology.
All reactions