Skip to article

Robot learning · Systems

Explaining RLinf—and how it plugs into Isaac Lab

Isaac Lab supplies the world; RLinf supplies the distributed post-training runtime.

10 minute read

The shortest useful explanation of the integration is this: Isaac Lab owns the robotics problem; RLinf owns the learning system around it. Isaac Lab simulates the robot and its sensors, defines observations and actions, computes rewards, and decides when an episode ends. RLinf coordinates model inference, experience collection, distributed policy updates, weight synchronization, and checkpoints.

That boundary is easy to miss because both projects use the language of reinforcement learning. They solve different layers of the same loop.

The mental model

Isaac Lab supplies the world. RLinf supplies the distributed post-training runtime. The integration is the adapter that keeps observations and actions meaningful as they cross between them.

Why a VLA needs more machinery than a classic policy

A conventional Isaac Lab run can keep simulation, a compact policy, and optimization in a relatively tight process. A vision-language-action model changes the shape of the workload. Camera rendering and physics want one resource profile; large-model inference wants another; backpropagation through a VLA may require sharding across several GPUs.

RLinf is designed for that heterogeneous case. Its system model separates the readable RL workflow from the way that workflow executes. A Runner controls the order of operations; WorkerGroups own simulation, generation, and learning; Channels move data directly between workers; and component_placement maps those logical groups to hardware. RLinf’s broader macro-to-micro machinery can turn the same graph into collocated, disaggregated, or hybrid execution.

The architecture is easier to understand when control flow, training data, and placement are shown separately:

RLinf × Isaac Lab · reference architecture

Control and data move on separate paths

RLinf worker Isaac Lab Integration seam
Control plane

EmbodiedRunner

Invokes WorkerGroup methods, waits at synchronization barriers, and triggers actor checkpoints. Training tensors do not pass through it.

  1. 01Sync weights when due
  2. 02Generate rollouts
  3. 03Compute GAE
  4. 04Train actor
Configuration plane · translation seam · not a worker Extension + YAML contract Env side: task registration and camera/state selection · Rollout side: GR00T key mapping, model configuration, and action padding
01 · World

EnvWorker

EnvGroup
Isaac Lab task ManagerBasedRLEnv physics · sensors · observations · rewards · termination

IsaacLabGenericEnv wraps simulator output into RLinf's canonical observation fields and applies returned actions.

02 · Act + collect

MultiStepRolloutWorker

RolloutGroup
Reference policy GR00T · Hugging Face observation converter · VLA inference · action converter

Generates action chunks and assembles rollout-horizon trajectory batches with rewards, dones, old log-probs, values, and model inputs.

03 · Learn

EmbodiedFSDPActor

ActorGroup
advantages + returns actor–critic objective FSDP update

Owns the trainable policy state; the Runner periodically saves it and synchronizes fresh weights back to rollout.

  1. ActEnvWorker sends mapped observations to RolloutWorker; action chunks return.
  2. LearnRolloutWorker sends trajectory batches to the actor for advantage computation and training.
  3. RefreshAt a configured boundary, ActorWorker sends its full state dict; RolloutWorker loads it and records a model ID.
The Runner controls the workflow, but Channels carry the data directly between workers. The extension and YAML configure the simulator/model boundary; they are not a fourth runtime worker.

This diagram follows the rlinf==0.2.0dev2 dependency currently documented by Isaac Lab. RLinf’s main branch has since moved some trajectory assembly into EnvWorker, but the durable architectural idea is unchanged: the simulator, inference engine, and trainer are independent worker groups connected by explicit data paths.

That decomposition is the reason the integration matters. The task stays an Isaac Lab task, while the expensive VLA post-training loop uses RLinf’s control, communication, and placement machinery.

Execution view · same logical graph

Three ways to place the workers on hardware

Placement changes · channels remain
01 · Reference

Collocated

time-share one pool
Same GPU set
Env Rollout Actor
collecttrain
actor,env,rollout: all

The Isaac Lab reference maps every WorkerGroup to all available GPUs. Stages run in turn on the shared devices.

02 · Separate

Disaggregated

dedicate each pool
GPU group AEnv
GPU group BRollout
GPU group CActor
Env ↔ Rollout → Actor

Separate pools make overlap possible and remove GPU swapping, but introduce pipeline balance and transfer costs.

03 · Mixed

Hybrid

split, then reunite
GPU 0–3Env
GPU 4–7Rollout
GPU 0–7 · after collectionActor
Env ↔ rollout overlaptrain

The official embodied example pipelines simulation and generation on separate subsets, then lets training use their union.

Placement is a hardware decision, not a rewrite of the algorithm. The reference trocar configuration is the collocated case; the other two cards show execution modes exposed by RLinf.

The integration seam

The Isaac Lab-specific extension lives in isaaclab_contrib, Isaac Lab’s incubator for community-maintained features. The wider path also uses Isaac Lab’s unified backend dispatcher and a task-specific YAML configuration. From the user’s side, RLinf appears as another backend behind the unified train and play entry points. Underneath, the launcher tells RLinf to load the extension module and points it at the active Hydra configuration.

The extension performs three jobs at startup:

  1. It registers the train and evaluation task IDs from the YAML file in RLinf’s Isaac Lab environment registry. The task can remain in Isaac Lab; no fork of RLinf is required.
  2. It registers observation and action converters for the VLA—in the reference path, GR00T.
  3. When a robot uses a custom embodiment, it wires in the embodiment tag and model data configuration needed to interpret that robot’s state and action layout.

The YAML file is therefore more than a bag of hyperparameters. It is the semantic contract between the simulator and the model.

Integration view · reference trocar task

One boundary, three different data paths

Meaning matters more than shape
01

Policy inputs

Isaac Lab → GR00T

Isaac Lab fields
  • front_camera
  • left/right_wrist_camera
  • robot_joint_state[15:29]
  • robot_dex3_joint_state
  • task description
YAML configures two owners
  • EnvWorker wrapper: select and stack views; concatenate the 28D state
  • RolloutWorker converter: add T=1; map video, state, and language keys
GR00T model inputs
  • video.room_view
  • video.*_wrist_view
  • four 7D arm/hand states
  • language annotation
02

Robot actions

GR00T → Isaac Lab

GR00T action dictionary
  • action.left_arm · 7D
  • action.right_arm · 7D
  • action.left_hand · 7D
  • action.right_hand · 7D
Rollout-side action path
  • Model wrapper: reverse modality transforms
  • Registered converter: select K=1 and concatenate four 7D groups into [B,1,28]
  • Registered converter: prefix 15 zeros to emit [B,1,43]
Isaac Lab action 43D ordered joint targets 15 zero-padded body targets + 28 VLA-controlled arm and hand targets. EnvWorker converts numpy to torch, then applies the chunk.
03

Learning signals

Isaac Lab → ActorGroup

Transition result
  • reward
  • terminated / truncated
RolloutWorker packs
  • actions and model inputs
  • old log-probs and values
  • rewards and episode signals
Actor Channel Trajectory shards rollout-horizon batches, not necessarily completed episodes
Contract invariantA valid tensor shape is not proof of valid semantics: verify camera order, joint order, slice bounds, time axes, and action coordinates.
† Source-version checkThe extension currently emits annotation.human.action.task_description, while the reference data config declares annotation.human.task_description. Verify the language key in the exact pinned sources you install.
The extension installs the task and converter types; it does not relay tensors at runtime. Environment wrapping happens on the EnvWorker side, while the registered GR00T converters and trajectory packing run in MultiStepRolloutWorker for the pinned reference.

The reference trocar assembly task makes the contract concrete. It maps a front camera and two wrist cameras into GR00T video keys, selects the relevant proprioceptive state slices, carries a language task description, and pads the model’s output so it lines up with the full Isaac Lab joint-action vector. A new task may use different values, but it must answer the same questions: which pixels, which state dimensions, which language instruction, and which action coordinates does the model mean?

One step through the loop

One training iteration contains a fast simulator/inference loop inside a slower optimization loop:

Sequence view · rlinf==0.2.0dev2

One iteration advances through explicit barriers

Runner controls · Channels carry data
Control plane EmbodiedRunner

Starts remote WorkerGroup methods, keeps their handles, and waits before advancing the algorithm. It never becomes the tensor relay.

  1. 01
    when the interval fires

    Refresh rollout

    ActorGroup · θk RolloutGroup · θk

    The actor sends a full state dict directly. Rollout loads it and derives its local model ID.

    Weight-sync barrier
  2. 02
    repeat to rollout horizon

    Interact + collect

    1. EnvGroupwrap observation + signals
    2. Env Channelsend to RolloutGroup
    3. RolloutGroupconvert · infer · record
    4. Rollout Channelreturn action chunk
    5. Isaac Labstep physics and sensors

    RolloutWorker packs the horizon and sends trajectory shards through the Actor Channel.

    Rollout / data-ready barrier
  3. 03
    ActorGroup

    Estimate

    trajectory batchGAE + returns

    The pinned trocar recipe uses generalized advantage estimation before any optimizer step begins.

    Advantage barrier
  4. 04
    ActorGroup

    Optimize

    actor–critic lossFSDP · θk+1

    The Runner waits for training, then triggers validation or a checkpoint only when its configured interval is due.

    Optimization barrier
Next iteration

θk+1 reaches rollout at the next weight-sync boundary; validation causes an immediate refresh first.

During collection, EnvGroup and RolloutGroup run concurrently and exchange many observations and action chunks. Actor advantage computation starts only after trajectory receipt and rollout generation are complete.

The critical engineering work is inside the collect phase. A tensor can have a valid shape and still carry the wrong meaning. Camera order, joint order, slice boundaries, time dimensions, and action chunking all need to agree.

Running the reference path

On the current Isaac Lab develop documentation, the unified entry point looks like this after the RLinf extra and the documented pinned dependencies are installed:

uv run --extra rlinf isaaclab train --rl_library rlinf \
  --config_name isaaclab_ppo_gr00t_assemble_trocar \
  --model_path /path/to/base_model

Evaluation uses the same task contract. The base model describes the architecture; --checkpoint selects the RL-finetuned weights:

uv run --extra rlinf,video isaaclab play --rl_library rlinf \
  --config_name isaaclab_ppo_gr00t_assemble_trocar \
  --model_path /path/to/base_model \
  --checkpoint latest \
  --video

It is worth pinning commands to one Isaac Lab version when reproducing this workflow. Older beta documentation used a different checkpoint flag, while current develop uses --checkpoint. The integration is moving quickly enough that mixing snippets across versions is an avoidable source of confusion.

Adapting it to another task

The useful order of operations is:

  1. Make the Isaac Lab task correct first. Verify observations, actions, reward, reset behavior, and camera output without RLinf in the loop.
  2. Start from a pretrained VLA. The documented workflow is demonstration collection, supervised base-model training, then RL post-training—not training a VLA from random initialization.
  3. Write the YAML contract. Set the train and evaluation task IDs, camera keys, state slices, task description, GR00T mapping, action layout, and model configuration.
  4. Add an embodiment data config only when needed. A robot whose modalities or action expert differ from the reference needs a matching model-side description.
  5. Validate the boundary before scaling. Inspect one environment and one rollout. Confirm values and ordering, not only tensor shapes. Then increase parallel environments and worker placement.

That last point is deliberately unglamorous. Distributed training multiplies whatever is already true. It does not repair a camera mapped to the wrong key or an action shifted by one joint.

What is still sharp-edged

As of September 2026, the Isaac Lab integration is explicitly experimental and Linux-only. The reference route is concrete—GR00T on the trocar assembly task—even though the surrounding interfaces are intended to support more models and algorithms. Installation currently pins an RLinf development build, compatible Transformers and tokenizers versions, and an exact Isaac-GR00T commit; it also documents dependency-conflict, FlashAttention, and aarch64 workarounds. Multi-GPU is recommended, and each FSDP checkpoint can occupy several gigabytes.

There is also an important scope distinction. RLinf’s published throughput results demonstrate the flexibility of the system across embodied and reasoning workloads, but they are not Isaac Lab benchmark results. Likewise, the separate IsaacLab recipe in the RLinf repository is a different route with its own versions and commands. Treat the Isaac-Lab-first integration described here as one coherent stack rather than mixing the two recipes.

For a small MLP policy, one of Isaac Lab’s established RL backends will usually be the simpler tool. RLinf becomes compelling when the policy is a foundation model and the simulator, inference engine, and trainer need to be treated as separate systems.

Takeaway

The integration is not a rewrite of Isaac Lab inside RLinf. It is a narrow bridge:

  • Isaac Lab continues to define what the robot sees, does, and earns.
  • A YAML contract and extension translate that task into VLA semantics.
  • RLinf turns the resulting interaction loop into distributed rollout and post-training workers.

That separation is the design win. Robotics researchers can keep task logic close to the simulator while changing how a large policy is placed, trained, and scaled around it.

Sources and further reading