NVIDIA Warp and MJWarp scale SO-101 simulation to 2,048 GPU worlds

Authors Johnny Nuñez Cano, Asier Arranz, Rishabh Chadha and Ben Oliveri describe a workflow to migrate MuJoCo robot scenes to GPU execution using NVIDIA Warp and MuJoCo Warp (MJWarp). The migration targets higher aggregate throughput by running hundreds or thousands of independent “worlds”—the article demonstrates scaling an SO-101 scene to as many as 2,048 parallel environments.

From MuJoCo CPU to MJWarp on GPU

The process preserves the same MJCF model and control-rate structure used on CPU. The recommended control loop in the walkthrough uses 50 Hz controller frames with 10 physics substeps per frame, i.e., a physics timestep of 0.002 s (frame_dt / sim_substeps). Ensuring identical mjm.opt.timestep on both CPU and device is required so parity checks and throughput measurements remain comparable.

Migration steps include calling mjw.put_model to upload a compatible model, allocating batched device state with mjw.make_data or seeding exactly with mjw.put_data, and using mjw.step(m, d) to advance every world in the batched d. The one-world validation path keeps the host in the loop, synchronizing device qpos/qvel back to the host for viewing and task checks; this path is explicitly a validation route, not a throughput benchmark.

Performance, buffers and validation

MJWarp targets aggregate throughput (world-steps per second) rather than minimizing single-world latency. Important tuning knobs highlighted by the authors include contact and constraint capacities (nworld, nconmax, naconmax, njmax) because memory and work scale with those limits. Exceeding buffer capacities can invalidate a rollout for verification or benchmarking even if execution continues with overflow warnings.

The article recommends CUDA graph capture for repeated mjw.step launches to reduce dispatch overhead (example: wp.ScopedCapture / wp.capture_launch). It also notes Warp features such as differentiable kernels and an opt-in deterministic execution mode introduced in Warp 1.15, while cautioning these are Warp capabilities and not automatic guarantees for an entire MJWarp rollout.

Validation details for the SO-101 pick-and-place task are precise: the red cube has 44 mm edges, so success thresholds are a horizontal center error xy_err ≤ 0.015 m and a vertical separation 0.035 m ≤ dz ≤ 0.055 m after settling. The authors provide companion notebooks and advise confirming pinned dependency and asset versions before publishing results.

To try the software locally the post lists installs such as pip install warp-lang (≥ 1.15 for GPU determinism) and pip install mujoco-warp, and mentions mjwarp-viewer for scene inspection.


Original source: Hugging Face Blog

Leave a Comment