mcpField
I
isaac-sim-headless-deployment

isaac-sim-headless-deployment

github.com/isaac-simCloud & DevOps4.4k52 installsUpdated 5d ago
Repository

About isaac-sim-headless-deployment

A skill for running Isaac Sim without a window, aimed at batch simulation, automated data generation, and server workloads. It covers CLI and SimulationApp patterns, including separate rendering and physics-only modes.

Key features

  1. 01Headless launch modes
  2. 02Batch simulation script
  3. 03Physics-only nightly runner
  4. 04Kit and Python launch patterns

Use cases

  1. 01Run repeated simulation episodes
  2. 02Generate data without a UI
  3. 03Run physics-only nightly checks

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/isaac-sim/isaacsim --skill isaac-sim-headless-deployment

After installing, type/isaac-sim-headless-deploymentin Claude Code to confirm it loaded.

Bundled filesscripts/batch_simulation.pyscripts/ci_physics_nightly.sh

Details

From the project README

Isaac Sim Headless Usage (--no-window)

Purpose

Launch Isaac Sim without a window for batch simulation, automated data generation, and server workloads using supported CLI flags and SimulationApp patterns.

Prerequisites

  • Built Isaac Sim ($ISAAC_SIM_DIR or _build/linux-x86_64/release).
  • NVIDIA GPU with a current driver (nvidia-smi).
  • Shell env contract from isaac-sim-orchestrator: $ISAAC_SIM_DIR, $ISAAC_LAB_DIR, $WORKSPACE_DIR.

Limitations

  • Targets Isaac Sim 6 / Kit 110 unless a section states otherwise.
  • Does not replace official NVIDIA documentation for unsupported edge cases.

Troubleshooting

Error / symptomCauseSolution
Extension or import not foundWrong $ISAAC_SIM_DIR or stale buildPoint env vars at _build/linux-x86_64/release or rebuild
Black or empty framesMissing lights or non-RTX render modeAdd dome/key light; confirm RTX / PathTracing settings
Hang on stage load or first renderMDL compile or oversized stageFollow isolation steps in isaac-sim-troubleshooting

This skill covers headless usage of a built or installed Isaac Sim. It does not cover Docker images, container orchestration, or CI/CD wiring — those live with the deployment infrastructure that wraps Isaac Sim, not in this skill.

Available Scripts

ScriptPurposeArguments
scripts/batch_simulation.pyHeadless batch simulation loop for Isaac Sim (Kit 110)see script --help
scripts/ci_physics_nightly.shCI physics-only nightly runner via python.sh or Kit CLI<test_script.py> [args...]

Running scripts

From agent runtimes that expose skill execution helpers, invoke helpers with run_script():

run_script("scripts/batch_simulation.py", args=["--help"])

From a built Isaac Sim tree, run the same file with ./python.sh (Linux) or python.bat (Windows) from _build/*/release, or execute shell helpers directly when they do not require the simulator.

Launch modes

1. Headed (Default)
./isaac-sim.sh
# Launches isaacsim.exp.full.kit with full UI
2. Headless with Rendering

For headless GPU rendering (generates images without a window):

# Native headless — uses EGL/Vulkan offscreen
./isaac-sim.sh --no-window

# With explicit display (required on some systems)
DISPLAY=:0 ./isaac-sim.sh --no-window
3. Headless No Rendering

For physics-only simulation (no viewport, no rendering):

./isaac-sim.sh --no-window --/app/renderer/enabled=false
4. Python Standalone Scripts

Run simulation logic from a standalone Python script:

./python.sh my_simulation.py
# Uses Isaac Sim's Python environment with all extensions available

The script controls headless behavior via the SimulationApp config (see Batch simulation pattern below) — python.sh does not need a --no-window flag.

5. Kit CLI with Script Execution
# Default — full Isaac Sim experience with rendering enabled
./kit/kit apps/isaacsim.exp.full.kit --exec "my_script.py"

# Headless physics-only batch
./kit/kit apps/isaacsim.exp.full.kit \
    --no-window \
    --/app/renderer/enabled=false \
    --exec "physics_batch.py"

Key CLI Flags

FlagDescription
--no-windowDisable window creation (headless)
--/app/renderer/enabled=falseDisable rendering entirely
--/app/window/width=WSet viewport width
--/app/window/height=HSet viewport height
--/app/settings/fabricDefaultStageFrameHistoryCount=NFrame history for Fabric
--enable EXT_IDEnable specific extension
--ext-folder PATHAdd extension search path
--exec SCRIPTExecute script on startup
--no-ros-envSkip ROS 2 auto-sourcing

App Configurations

Config FileUse Case
isaacsim.exp.full.kitFull simulation (default)
isaacsim.exp.full.newton.kitNewton physics engine
isaacsim.exp.full.fabric.kitFabric scene delegate
isaacsim.exp.base.kitMinimal base (faster startup)
isaacsim.exp.base.python.kitPython-only base
isaacsim.exp.base.python.physics.headless.kitPhysics-only headless (CI nightly)
isaacsim.exp.base.zero_delay.kitZero-delay base

CI Physics-Only Nightly Runs

For physics-only nightly CI (no rendering, no window), use the dedicated kit file:

# Kit CLI mode — self-contained headless physics config
./kit/kit apps/isaacsim.exp.base.python.physics.headless.kit \
    --no-window \
    --/app/renderer/enabled=false \
    --exec "test_physics_batch.py"

For standalone Python scripts that bootstrap SimulationApp themselves, use python.sh with renderer-disable flags:

# python.sh mode — flags passed through to Carbonite/Kit settings
./python.sh test_physics_batch.py \
    --/renderer/enabled=false \
    --/app/window/enabled=false \
    --/app/livestream/enabled=false

The kit file (isaacsim.exp.base.python.physics.headless.kit) bakes in:

  • renderer.enabled = false — no GPU rendering subsystem
  • app.window.enabled = false — no window creation
  • app.livestream.enabled = false — no streaming
  • All UI/viewport/manipulator extensions disabled
  • All rendering extensions disabled (omni.hydra.rtx, omni.rtx.*, omni.syntheticdata, omni.replicator.core)
  • Physics-optimal loop settings (rateLimitEnabled = false, manualModeEnabled = true, useFixedTimeStepping = true)

The wrapper script scripts/ci_physics_nightly.sh encapsulates both modes. Set CI_KIT_MODE=1 for Kit CLI, or leave unset for python.sh (default).

Batch Simulation Pattern

The canonical headless bootstrap pattern lives in:

  • source/standalone_examples/api/isaacsim.simulation_app/hello_world.py (minimal)
  • source/standalone_examples/api/isaacsim.simulation_app/load_stage.py (stage open + step loop with --test mode)

For an N-episode batch driver, wrap that bootstrap in a Python for episode in range(N) loop. Use the current APIs:

  • isaacsim.core.experimental.utils.stage for stage open / waiting on load
  • isaacsim.core.simulation_manager.SimulationManager.setup_simulation(dt=..., device=...) to configure physics
  • isaacsim.core.experimental.utils.app (enable_extension, play, stop, update_app) to drive the loop

Skeleton (paraphrased from load_stage.py, adapted for batch):

run_batch_simulation(scene_path, num_episodes, steps_per_episode, dt, device) — headless SimulationApp loop that opens a USD, waits for load, sets up physics, steps, and stops each episode.

See scripts/batch_simulation.py.

Avoid the legacy isaacsim.core.api.World / isaacsim.core.utils.stage paths — they are deprecated in Kit 110.

Migration: see Renaming Extensions for the omni.isaac.* → isaacsim.* map covering omni.isaac.core, omni.isaac.utils, and friends.

Performance Tuning for Batch/Headless

Physics-Only (Fastest)
config = {"headless": True, "renderer": None}
# In step loop:
world.step(render=False)

Throughput: 10-50x real-time depending on scene complexity.

Memory Management
  • Clear stage between episodes: world.clear() + garbage collect
  • Use instanceable assets: make_instanceable: true in config.yaml
  • Monitor GPU memory: nvidia-smi — Kit leaks if stages aren't properly cleared
  • GB10 (Jetson): Max ~35K prims, 16GB shared memory — reduce scene complexity

Known Issues (Kit 110)

  • DISPLAY=:0 required for headless viewport on Kit 110 with complex stages on some GPU configurations
  • Viewport never initializes without DISPLAY on some configurations — use --no-window + offscreen rendering
  • CUDA OOM: Monitor with nvidia-smi, keep under 90% GPU VRAM utilization
  • Startup time: ~30-60s cold start; use persistent processes for interactive batch
  • Newton physics + torch conflict: Never import torch before physics settle

Comments

Markdown supported