Both models produce outputs with identical dimensions, confirming architectural compatibility.
The student model maintains the same output structure while achieving a substantial reduction in size.
This directory contains a fully distilled Vision-Language-Action (VLA) model derived from NVIDIA's GR00T-N1.6-3B teacher model.
main/
├── .gitattributes # Git LFS configuration
├── config.json # Model architecture config
├── processor_config.json # Image processor settings
├── model.safetensors.index.json # Parameter index
└── model-00001-of-00001.safetensors (3.13 GB)
Input Images (4 frames × 224×224)
↓
SigLIP-base Vision Encoder (frozen)
↓
Linear Projector (768 → 896)
↓
Qwen2.5-0.5B LLM (partially trainable)
↓
Light-weight 8-layer DiT Action Head
↓
Output: 8 timesteps × 7 DoF actions
1from transformers import AutoModel
2import torch
3
4# Load model
5model = AutoModel.from_pretrained("./model_safetensors", trust_remote_code=True)
6model = model.to("cuda")
7
8# Inference
9images = torch.randn(1, 4, 224, 224) # Batch of 4 images
10instructions = "pick up cube"
11state = torch.randn(1, 11) # Proprioceptive state
12
13actions = model(images, instructions, state)
14# Output shape: [1, 8, 7] (1 batch, 8 timesteps, 7 DoF)
1from inference import GR00TStudentInference
2
3policy = GR00TStudentInference("model_safetensors")
4actions = policy.predict(images, instruction, state)
Step 0: Loss 0.200
Step 1000: Loss 0.100
Step 3000: Loss 0.050
Step 5000: Loss 0.025
1# 1. Load model
2from inference import GR00TStudentInference
3policy = GR00TStudentInference("path/to/model_safetensors")
4
5# 2. Prepare input
6import numpy as np
7from PIL import Image
8
9images = [Image.open(f"frame_{i}.png") for i in range(4)]
10instruction = "grasp red apple"
11state = np.array([joint_angles])
12
13# 3. Get actions
14actions = policy.predict(images, instruction, state)
15# Returns: tensor of shape [8, 7]
16
17# 4. Execute actions
18for t in range(8):
19 execute_action(actions[t])
1{
2 "architectures": ["GR00TStudentVLA"],
3 "model_type": "groot-student-vla",
4 "vision_model": {
5 "model_type": "siglip",
6 "vision_encoder": "google/siglip-base-patch16-224"
7 },
8 "llm_model": {
9 "model_type": "qwen2.5",
10 "model_id": "Qwen/Qwen2.5-0.5B-Instruct"
11 },
12 "action_head": {
13 "num_layers": 8,
14 "action_dim": 7,
15 "action_horizon": 8
16 }
17}
1{
2 "processor_class": "SiglipImageProcessor",
3 "image_size": [224, 224],
4 "image_mean": [0.5, 0.5, 0.5],
5 "image_std": [0.5, 0.5, 0.5],
6 "do_normalize": true,
7 "do_resize": true
8}
1from train_v2 import main
2import argparse
3
4args = argparse.Namespace(
5 dataset_path="/path/to/data",
6 checkpoint_path="model_safetensors",
7 batch_size=16,
8 learning_rate=1e-5,
9 use_ema=True,
10 use_amp=True,
11 stage=1 # Continue from Stage 1
12)
13
14output_dir = main(args)
1import torch
2from models.student_vla_v2 import GR00TStudentVLA
3
4# Load model
5model = GR00TStudentVLA.from_pretrained("model_safetensors")
6
7# Raw forward pass
8with torch.no_grad():
9 output = model.forward(
10 images=images.to("cuda"),
11 instructions=instructions,
12 proprioceptive_state=state.to("cuda")
13 )
1@misc{gr00t_n1.6-800m,
2 title={GR00T Student: 800M Parameter Distillation of NVIDIA's 3B Vision-Language-Action Model},
3 author={Marzo, 2026},
4 year={2026},
5 howpublished={\url{https://huggingface.co/Mattimax/GR00T-N1.6-800M/}}
6}