Skip to main content

Overview

GR00T-N1.7 is a vision-language-action (VLA) model. Its Cosmos-Reason2-2B backbone, based on the Qwen3-VL architecture, encodes camera images and the language instruction. A flow-matching action head then denoises an action chunk using those features and the robot state. The embodiment ID is an explicit routing input rather than a sequence token passed to the action transformer. PhyAI uses it to select embodiment-specific state and action encoders and the action decoder. The action transformer receives the resulting encoded features, so the embodiment affects its inputs indirectly, but the raw ID is not appended to the token sequence. PhyAI’s ws1 path runs the backbone and action head on one GPU. The engine receives model-ready tensors and returns a normalized action chunk. GR00TProcessor handles image transforms, tokenization, state normalization, embodiment metadata, and action decoding outside the engine.
The examples on this page were validated with the official nvidia/GR00T-N1.7-LIBERO weights and its libero_10 checkpoint directory. Use model and processor files from the same compatible checkpoint bundle so the model geometry, modality definitions, normalization statistics, and embodiment routing stay aligned.

Architecture

The gr00t_n17 plugin follows PhyAI’s :
phyai/src/phyai/models/gr00t_n17
main_gr00t_n17.py
scheduler_ws1_gr00t_n17.py
model_runner_gr00t_n17.py
modeling_gr00t_n17.py
qwen3_vl_adapter.py
configuration_gr00t_n17.py
phyai-utils-tools/src/phyai_utils_tools/models/gr00t
processor_gr00t.py
ops_gr00t.py
The request path is:

Running GR00T-N1.7

1

Prepare the checkpoint

Choose a compatible checkpoint from NVIDIA’s GR00T-N1.7 collection. GR00T-N1.7 uses the gated nvidia/Cosmos-Reason2-2B backbone metadata for tokenization and image preprocessing, so request access and authenticate before the first run:
The LIBERO checkpoint stores model files under libero_10. Download the files consumed by PhyAI:
2

Construct the processor

Use the same checkpoint directory for both. --online in the bundled example allows the first run to fetch uncached Cosmos-Reason2 tokenizer and preprocessor files.
Set local_files_only=True after the Cosmos-Reason2 tokenizer and preprocessor files are present in the local Hugging Face cache.
3

Prepare a request and construct the engine

Build GR00TObservation with the camera, state, and language keys listed in the checkpoint’s modality config. The processor validates these keys and their history lengths before inference.After constructing observation from this contract, continue with:
The processor reads the required camera views, state fields, language key, and history lengths from the selected checkpoint. Keep prepared.raw_state for checkpoints that use relative actions; the decoder needs it to reconstruct actions in the robot’s reference frame.With CUDA graphs enabled, capture_profiles are stabilized and captured while the engine is constructed. Profiles with the same complete Backbone and Action Head Graph structure are deduplicated before warmup, their outputs are discarded, and matching runtime requests only replay those graphs. The Action Head reuses the Backbone sequence bucket, so prompts in the same bucket share both graphs when their remaining Graph-key fields also match. Pass prepared requests covering every input structure this engine will serve; the fixed LIBERO example needs only the profile shown above. Add profiles if the same engine serves other sequence-length buckets, image-grid or camera layouts, batch shapes, embodiment categories, action shapes, or mask structures. An unlisted graph-compatible structure raises an error instead of capturing or replacing graphs at runtime. Fixed Graph mode spans both runners: if either runner does not support capture, such as an Action Head configured with FlashInfer attention, the scheduler disables CUDA Graphs for both and runs the complete request eagerly.max_batch_size is the scheduler’s upper bound. In CUDA Graph mode, every runtime batch shape must also match a setup profile; a smaller but uncaptured batch does not reuse a larger-batch graph. Rebuild the engine with the required profiles if the served batch shapes change.GR00TN17Request.noise is optional. Leave it unset to sample Gaussian noise, or provide a fixed tensor for deterministic regression checks.
4

Close the engine

This releases the runner-owned CUDA graph registries and model references.

End-to-end example

examples/gr00t/run_gr00t.py builds a checkpoint-shaped synthetic observation, runs it through the processor and engine, and decodes the result. To run it:
The script prints engine.step() latency statistics (mean / median / std / min / max over 3 untimed runs + 30 timed runs). CUDA Graph capture happens during engine construction; the untimed steps only stabilize the latency measurement. Observation preprocessing, input transfer to the GPU, and action decoding are outside the timed loop. The synthetic inputs only test the execution path; their predicted actions have no task-level meaning. The command assumes the Cosmos-Reason2 tokenizer and preprocessor are already cached. Add --online to the first run only if those files are missing, then omit it for later runs. To use a specific local tokenizer/preprocessor snapshot, pass --processor-model-name-or-path <path>; this option does not override the engine’s Backbone config or weights. The built-in Cosmos-Reason2 processor does not require remote code. Only pass --trust-remote-code when using a custom processor repository whose code you trust.

Current limitations

  • The scheduler supports one GPU. Tensor parallelism, continuous batching, preemption, and a network policy server are outside this path.
  • max_batch_size is fixed when the engine is built. CUDA Graph mode also requires every served batch shape to be represented in capture_profiles.
  • The engine returns normalized, padded actions. Use the matching processor and raw_state to recover the checkpoint’s physical action fields.

Full example