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’sws1 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
Thegr00t_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 The LIBERO checkpoint stores model files under
nvidia/Cosmos-Reason2-2B backbone metadata for tokenization and image preprocessing, so request access and authenticate before the first run:libero_10. Download the files consumed by PhyAI:2
Construct the processor
Use the same checkpoint directory for both. Set
--online in the bundled example allows the first run to fetch uncached Cosmos-Reason2 tokenizer and preprocessor files.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 The processor reads the required camera views, state fields, language key, and history lengths from the selected checkpoint. Keep
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: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
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:
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_sizeis fixed when the engine is built. CUDA Graph mode also requires every served batch shape to be represented incapture_profiles.- The engine returns normalized, padded actions. Use the matching processor and
raw_stateto recover the checkpoint’s physical action fields.

