NVIDIA vừa phát hành GR00T N1.6 — phiên bản nâng cấp đáng kể của foundation model cho robot tổng quát. Với kiến trúc dual-system kết hợp Cosmos Reason 2 làm "bộ não" suy luận và Diffusion Transformer 32 lớp sinh hành động, N1.6 đạt hiệu suất vượt trội trên nhiều benchmark thực tế. Bài viết này sẽ hướng dẫn bạn từ A đến Z: hiểu kiến trúc, chuẩn bị dữ liệu, fine-tune, và chạy inference.
GR00T N1.6 là gì?
GR00T (Generalist Robot 00 Technology) N1.6 là Vision-Language-Action (VLA) model mã nguồn mở với 3 tỷ tham số. Model nhận đầu vào đa phương thức — hình ảnh RGB từ camera, câu lệnh ngôn ngữ tự nhiên, và trạng thái proprioception của robot — rồi xuất ra chuỗi hành động liên tục để điều khiển robot.
Paper gốc: GR00T N1: An Open Foundation Model for Generalist Humanoid Robots — Johan Bjorck et al., NVIDIA GEAR Lab, 2025.
Điểm đặc biệt của N1.6 so với phiên bản trước (N1.5):
- DiT lớn gấp đôi: 32 lớp thay vì 16 lớp
- VLM backbone mới: Cosmos Reason 2B thay thế Eagle + SmolLM
- Relative actions: xuất hành động tương đối thay vì tuyệt đối, giúp chuyển động mượt hơn
- Hội tụ nhanh hơn khi fine-tune trên embodiment mới
Kiến trúc Dual-System
GR00T N1.6 lấy cảm hứng từ lý thuyết nhận thức con người với hai hệ thống:
System 2 — Cosmos Reason (Suy luận)
Đây là phần "bộ não" của model, dựa trên Cosmos Reason 2B — một Vision-Language Model được NVIDIA phát triển riêng cho physical AI:
- Vision Encoder: SigLip2 (pretrained ViT) xử lý ảnh RGB ở mọi độ phân giải
- Language Encoder: T5 transformer mã hoá câu lệnh ngôn ngữ
- 4 lớp VLM trên cùng được unfreeze trong quá trình pretraining, cho phép model tinh chỉnh biểu diễn vision-language
Cosmos Reason 2 còn có phiên bản 8B tham số lớn hơn (Hugging Face) phục vụ cho planning và suy luận phức tạp hơn, nhưng trong GR00T N1.6 dùng bản 2B để đảm bảo tốc độ inference thời gian thực.
System 1 — Diffusion Transformer (Hành động)
Phần sinh hành động sử dụng DiT 32 lớp với:
- Adaptive LayerNorm (AdaLN) cho diffusion step conditioning
- Self-attention trên proprioception/actions xen kẽ với cross-attention tới vision-language embeddings
- 4-step denoising để sinh chuỗi hành động
- Flow matching kết hợp world-modeling objectives trong training
- Xuất state-relative action chunks (hành động tương đối so với trạng thái hiện tại)
Proprioception Encoder
MLP đơn giản nhưng được index theo embodiment ID, cho phép model tổng quát hoá qua nhiều loại robot khác nhau — từ cánh tay SO-100 đến humanoid Unitree G1.
Yêu cầu phần cứng
| Mục đích | GPU tối thiểu | Khuyến nghị |
|---|---|---|
| Fine-tuning | 48GB VRAM (RTX A6000, L40) | H100 80GB |
| Inference | RTX 4090 24GB | Jetson AGX Thor |
Hỗ trợ kiến trúc GPU: Ampere, Hopper, Lovelace, Blackwell, và Jetson.
Hiệu năng inference (1 camera, 4 bước denoising):
| Thiết bị | Độ trễ E2E | Tần suất |
|---|---|---|
| RTX 5090 + torch.compile | 37ms | 27.3 Hz |
| H100 + torch.compile | 38ms | 26.3 Hz |
| RTX 4090 + torch.compile | 44ms | 22.8 Hz |
| Jetson AGX Thor | 105ms | 9.5 Hz |
Cài đặt môi trường
Bước 1: Clone repo và cài dependencies
git clone --recurse-submodules https://github.com/NVIDIA/Isaac-GR00T
cd Isaac-GR00T
bash scripts/deployment/dgpu/install_deps.sh
source .venv/bin/activate
Script cài đặt tự tạo virtual environment và cài PyTorch, transformers, diffusers, cùng các dependency cần thiết.
Bước 2: Tải model pretrained
# Model sẽ tự tải từ Hugging Face khi chạy lần đầu
# Hoặc tải trước:
huggingface-cli download nvidia/GR00T-N1.6-3B --local-dir ./models/GR00T-N1.6-3B
Model phát hành dưới NVIDIA OneWay Noncommercial License (base model) và Apache 2.0 (codebase).
Chuẩn bị dữ liệu
GR00T N1.6 sử dụng format GR00T-flavored LeRobot v2 — bộ ba (video, state, action) lưu dưới dạng Parquet episode files.
Cấu trúc thư mục
dataset/
├── data/
│ ├── chunk-000/
│ │ ├── episode_000000.parquet
│ │ ├── episode_000001.parquet
│ │ └── ...
│ └── ...
├── videos/
│ ├── chunk-000/
│ │ ├── front/
│ │ │ ├── episode_000000.mp4
│ │ │ └── ...
│ │ └── wrist/
│ │ └── ...
│ └── ...
├── meta/
│ ├── modality.json
│ ├── stats.json
│ ├── relative_stats.json
│ ├── episodes.jsonl
│ └── info.json
└── README.md
Cấu hình Modality
File modality.json định nghĩa mapping giữa dữ liệu thô và đầu vào model. Ví dụ cho cánh tay SO-100:
from gr00t.configs.data.embodiment_configs import register_modality_config
from gr00t.data.types import ModalityConfig, ActionConfig
from gr00t.data.types import ActionRepresentation, ActionType, ActionFormat
from gr00t.data.types import EmbodimentTag
so100_config = {
"video": ModalityConfig(
delta_indices=[0],
modality_keys=["front", "wrist"]
),
"state": ModalityConfig(
delta_indices=[0],
modality_keys=["single_arm", "gripper"]
),
"action": ModalityConfig(
delta_indices=list(range(0, 16)),
modality_keys=["single_arm", "gripper"],
action_configs=[
ActionConfig(
rep=ActionRepresentation.RELATIVE,
type=ActionType.NON_EEF,
format=ActionFormat.DEFAULT
),
ActionConfig(
rep=ActionRepresentation.ABSOLUTE,
type=ActionType.NON_EEF,
format=ActionFormat.DEFAULT
),
],
),
"language": ModalityConfig(
delta_indices=[0],
modality_keys=["annotation.human.action.task_description"]
),
}
register_modality_config(so100_config, embodiment_tag=EmbodimentTag.NEW_EMBODIMENT)
Giải thích các trường quan trọng:
- delta_indices: Chỉ số thời gian.
[0]nghĩa là frame hiện tại,list(range(0, 16))nghĩa là dự đoán 16 bước hành động tiếp theo - modality_keys: Tên các kênh dữ liệu (camera names, joint groups)
- ActionRepresentation.RELATIVE: N1.6 ưu tiên relative actions — chuyển động so với vị trí hiện tại, không phải tọa độ tuyệt đối
- EmbodimentTag.NEW_EMBODIMENT: Tag cho robot mới, model sẽ tự học adapter phù hợp
Chuyển đổi từ LeRobot dataset
Nếu bạn đã có dataset ở format LeRobot chuẩn, dùng script chuyển đổi:
uv run python scripts/data/convert_lerobot_to_groot.py \
--input-path <LEROBOT_DATASET> \
--output-path <GROOT_DATASET> \
--embodiment-tag NEW_EMBODIMENT
Fine-Tuning
Lệnh fine-tune cơ bản
export NUM_GPUS=1
CUDA_VISIBLE_DEVICES=0 uv run python \
gr00t/experiment/launch_finetune.py \
--base-model-path nvidia/GR00T-N1.6-3B \
--dataset-path ./my_robot_data \
--embodiment-tag NEW_EMBODIMENT \
--modality-config-path ./configs/so100_modality.json \
--num-gpus $NUM_GPUS \
--output-dir ./checkpoints/groot-so100 \
--save-total-limit 5 \
--save-steps 2000 \
--max-steps 10000 \
--use-wandb \
--global-batch-size 32 \
--color-jitter-params brightness 0.3 contrast 0.4 saturation 0.5 hue 0.08 \
--dataloader-num-workers 4
Giải thích tham số
| Tham số | Mô tả | Giá trị khuyến nghị |
|---|---|---|
--max-steps |
Tổng số bước training | 2,000–30,000 tuỳ dataset |
--global-batch-size |
Batch size tổng (chia đều qua GPUs) | 32–64 |
--save-steps |
Lưu checkpoint mỗi N bước | 2,000 |
--save-total-limit |
Giữ tối đa N checkpoints | 5 |
--color-jitter-params |
Data augmentation cho ảnh | Tuỳ điều kiện ánh sáng |
--use-wandb |
Log metrics lên Weights & Biases | Nên bật |
Tips fine-tune hiệu quả
-
Bắt đầu ít bước: 2,000 bước thường đủ để thấy kết quả ban đầu. Tăng dần nếu loss chưa hội tụ.
-
Kết hợp dữ liệu thật + synthetic: NVIDIA báo cáo 40% cải thiện khi kết hợp synthetic data từ Isaac Sim với real data. Dùng GR00T-Dreams blueprint để sinh trajectory giả lập.
-
Relative actions là mặc định: N1.6 hoạt động tốt nhất với relative actions. Chỉ dùng absolute nếu task yêu cầu (vd: đặt vật ở vị trí cố định).
-
Freeze VLM khi data ít: Nếu dataset dưới 100 episodes, cân nhắc chỉ fine-tune DiT phần hành động, giữ VLM frozen.
Fine-tune qua LeRobot (API đơn giản hơn)
Nếu quen thuộc với Hugging Face LeRobot, bạn có thể fine-tune GR00T N1.6 qua API tích hợp:
lerobot-train \
--policy.type=groot \
--dataset.repo_id=<HF_DATASET> \
--batch_size=32 \
--steps=20000 \
--policy.tune_diffusion_model=false \
--output_dir=./outputs/groot-finetune
Tham số --policy.tune_diffusion_model=false giữ DiT frozen, chỉ fine-tune adapter — tiết kiệm VRAM và phù hợp cho dataset nhỏ.
Inference
Khởi động policy server
uv run python gr00t/eval/run_gr00t_server.py \
--embodiment-tag NEW_EMBODIMENT \
--model-path ./checkpoints/groot-so100/checkpoint-10000
Client code điều khiển robot
from gr00t.policy.server_client import PolicyClient
# Kết nối tới server
policy = PolicyClient(host="localhost", port=5555)
# Vòng lặp điều khiển
obs, info = env.reset()
while not done:
action, info = policy.get_action(obs)
obs, reward, done, info = env.step(action)
Standalone inference (test nhanh)
uv run python scripts/deployment/standalone_inference_script.py \
--model-path nvidia/GR00T-N1.6-3B \
--dataset-path demo_data/gr1.PickNPlace \
--embodiment-tag GR1 \
--traj-ids 0 1 2 \
--inference-mode pytorch \
--action-horizon 8
Tham số --action-horizon 8 nghĩa là model dự đoán 8 bước hành động mỗi lần inference. Giá trị lớn hơn (16) cho chuyển động mượt hơn nhưng phản ứng chậm hơn với thay đổi môi trường.
Kết quả Benchmark
Simulation (100 demos mỗi task)
| Benchmark | Tỷ lệ thành công |
|---|---|
| RoboCasa | 32.1% |
| DexMG | 66.5% |
| GR-1 | 50.0% |
| Trung bình | 45.0% |
Thực tế (robot GR-1, full data)
| Task | Tỷ lệ thành công |
|---|---|
| Pick-and-Place | 82.0% |
| Articulated (mở tủ, ngăn kéo) | 70.9% |
| Industrial (lắp ráp) | 70.0% |
| Coordination (phối hợp 2 tay) | 82.5% |
| Trung bình | 76.8% |
LIBERO Benchmark (qua LeRobot)
| Benchmark | GR00T LeRobot | GR00T gốc |
|---|---|---|
| LIBERO-Spatial | 82.0% | 92.0% |
| LIBERO-Object | 99.0% | 92.0% |
| LIBERO-Long | 82.0% | 76.0% |
| Trung bình | 87.0% | 76.0% |
Đặc biệt ấn tượng là kết quả LIBERO-Object đạt 99% — gần như hoàn hảo trong nhận dạng và thao tác với các vật thể khác nhau.
Cosmos Reason 2 — Bộ não suy luận
Ngoài phiên bản 2B tích hợp trong GR00T, NVIDIA phát hành Cosmos Reason 2 (8B) như model suy luận độc lập:
import transformers
import torch
model_name = "nvidia/Cosmos-Reason2-8B"
model = transformers.Qwen3VLForConditionalGeneration.from_pretrained(
model_name,
dtype=torch.float16,
device_map="auto",
attn_implementation="sdpa"
)
processor = transformers.AutoProcessor.from_pretrained(model_name)
messages = [
{
"role": "user",
"content": [
{"type": "video", "video": "file:///path/to/robot_task.mp4", "fps": 4},
{"type": "text", "text": "Robot cần làm gì tiếp theo?"}
]
}
]
inputs = processor.apply_chat_template(
messages, tokenize=True,
add_generation_prompt=True,
return_dict=True, return_tensors="pt", fps=4
)
output = model.generate(**inputs.to(model.device), max_new_tokens=4096)
Cosmos Reason 2 hỗ trợ chain-of-thought reasoning với format <think>...</think><answer>...</answer>, cho phép model giải thích quá trình suy luận trước khi đưa ra câu trả lời. Model có khả năng:
- Hiểu video dài với độ chính xác timestamp
- Phát hiện vật thể và định vị 2D/3D
- Suy luận vật lý (vật thể di chuyển, tương tác như thế nào)
- Phân tách task phức tạp thành các bước nhỏ
Embodiments được hỗ trợ
GR00T N1.6 đã được pretrain và fine-tune cho nhiều loại robot:
| Robot | Loại | Checkpoint |
|---|---|---|
| WidowX (Bridge) | Cánh tay | GR00T-N1.6-bridge |
| Google Robot (Fractal) | Mobile manipulator | Có sẵn |
| Galaxea R1 Pro | Dual-arm | GR00T-N1.6-BEHAVIOR1k |
| Unitree G1 | Humanoid | Có sẵn |
| SO-100 | Cánh tay giá rẻ | Có sẵn |
| DROID | Multi-embodiment | Có sẵn |
Bạn có thể dùng các checkpoint này làm điểm khởi đầu cho fine-tuning thay vì base model, nếu robot của bạn tương tự.
Tổng kết
GR00T N1.6 với Cosmos Reason 2 đánh dấu bước tiến quan trọng trong foundation models cho robotics:
- 3B tham số — đủ mạnh để xử lý đa task nhưng đủ nhỏ để chạy real-time trên edge
- Dual-system — kết hợp suy luận ngôn ngữ (System 2) với sinh hành động nhanh (System 1)
- Cross-embodiment — một model cho nhiều loại robot
- Mã nguồn mở — cộng đồng có thể fine-tune và đóng góp
Nếu bạn đang làm việc với robot arm hay humanoid, GR00T N1.6 là lựa chọn mạnh mẽ để bắt đầu xây dựng hệ thống điều khiển dựa trên VLA. Với chỉ 100 demonstrations và vài giờ fine-tune trên 1 GPU, bạn đã có thể đạt kết quả ấn tượng.
Tài nguyên:
Bài viết liên quan
- VLA Models — Khi robot hiểu ngôn ngữ và hành động — Tổng quan các kiến trúc Vision-Language-Action
- Fine-Tune GR00T N1 trong Isaac Lab — Hướng dẫn phiên bản N1 trước đó
- LeRobot Hands-On — Thực hành VLA với framework mã nguồn mở — Làm quen LeRobot ecosystem