《VLA 系列》GR00T N1 | 双系统 VLA | 数据金字塔 | N1.5/N1.6/N1.7 源码演进
机器人基础模型面临的核心矛盾不是模型不够大,而是数据被切成了许多互不连通的岛:单一机器人轨迹精确但昂贵,人类视频量大却没有机器人动作,仿真便宜却有域差异,互联网图文擅长语义却缺少控制信号。GR00T N1 的回答是同时改造数据和模型:用数据金字塔汇集四类监督,再用慢速视觉语言系统理解任务、快速扩散系统生成连续动作。
本文首先解读 2025 年论文中的 GR00T N1,随后单独分析官方 Isaac-GR00T 仓库的 N1.5、N1.6、N1.7 release。必须先划清边界:论文只描述 N1;后三者是后续 checkpoint 与代码演进,不能用 N1.7 的 40 步动作块、132 维接口或 RTC 反向解释论文实验。
- 模型:N1 总计 2.2B 参数,其中 Eagle-2 VLM 为 1.34B,DiT 通过 Flow Matching 生成 16 步动作块。
- 数据:预训练数据合计 592.9M frames、8375.7 小时,覆盖真实机器人、仿真、神经生成轨迹、人类视频与网页数据。
- 效果:仿真平均成功率 45.0%;真机完整数据平均 76.8%,10% 数据下仍有 42.6%。
- 工程演进:N1.5 加入 Eagle 2.5 与 FLARE,N1.6 换内部 Cosmos-Reason/Eagle 变体并将 DiT 扩到 32 层,N1.7 换 Qwen3-VL 架构的 Cosmos-Reason2-2B,并强化部署能力。
论文:https://arxiv.org/abs/2503.14734
官方仓库:https://github.com/NVIDIA/Isaac-GR00T
模型集合:https://huggingface.co/collections/nvidia/gr00t-n17
1、数据岛问题:为什么只收真机演示不够
一种机器人、一套传感器和一组任务往往形成封闭数据集。直接把不同本体的关节位置与动作拼在一起,会遇到维度、量纲、视角和控制语义均不一致的问题;只训练每台机器人自己的策略,又无法从其他平台和人类行为中获益。
GR00T N1 将数据组织成金字塔。越靠上,数据越接近目标机器人、质量越高但规模越小;越靠下,数据规模越大、语义越丰富,但与真实控制的距离更远。

论文报告的总量为 592.9M frames、8375.7 小时,其中机器人数据 3288.8 小时、人类视频 2517.0 小时、仿真 1742.6 小时、神经生成数据 827.3 小时。真实数据仍是最直接的动作监督,但不再承担全部规模扩张压力。
2、N1 网络结构:慢思考与快控制

N1 借用双系统概念:System 2 负责较慢的语义理解,System 1 负责高频动作生成。二者不是两个独立策略,而是条件表示与连续控制的上下游关系。
图 2 给出数据流的第一层视角:图像与语言先进入 System 2,VLM 输出与机器人状态、带噪动作共同进入 System 1,经过迭代去噪得到 motor action。进一步展开 DiT 内部,可以看到本体专属投影与注意力的具体连接:

2.1、System 2:Eagle-2 视觉语言模型
Eagle-2 由 SigLIP-2 视觉编码器与 SmolLM2 语言模型组成。输入图像缩放到 224 × 224 224\times224 224×224,经过 pixel shuffle 后每帧得到 64 个视觉 token;论文使用 VLM 第 12 层的中间表示,而不是只拿最终文本输出。预训练 N1 时,语言部分冻结,视觉编码器、DiT 与本体模块参与训练。
VLM 的任务是把图像和指令变成具备物体、关系和任务语义的上下文。论文将它称为约 10 Hz 的 System 2,而动作侧控制可达到约 120 Hz。这里的频率是系统职责划分,不代表每个控制周期都重新完整运行一次语言生成。
2.2、System 1:跨本体 DiT 动作专家
机器人状态 q t q_t qt 先经过本体专属 state encoder;带噪动作块经过本体专属 action encoder。二者与 VLM token 进入交替的 cross-attention 和 self-attention DiT block,最后由本体专属 action decoder 还原到该机器人的控制维度。
本体专属小模块解决接口差异,共享 DiT 学习跨本体的运动规律。这样既不要求不同机器人拥有相同关节,也避免为每种本体复制整个大模型。
3、Flow Matching:4 次积分生成 16 步动作
N1 不直接回归单步动作,而是生成长度 H = 16 H=16 H=16 的动作块。设真实动作块为 a a a,高斯噪声为 ϵ ∼ N ( 0 , I ) \epsilon\sim\mathcal N(0,I) ϵ∼N(0,I),流时间为 τ ∈ [ 0 , 1 ] \tau\in[0,1] τ∈[0,1],线性插值得到:
a τ = ( 1 − τ ) ϵ + τ a a_\tau=(1-\tau)\epsilon+\tau a aτ=(1−τ)ϵ+τa
目标速度为从噪声指向数据的 a − ϵ a-\epsilon a−ϵ,条件速度场记为 v θ v_\theta vθ:
L F M = E a , ϵ , τ ∥ v θ ( a τ , τ , c ) − ( a − ϵ ) ∥ 2 2 \mathcal L_{\mathrm{FM}}=\mathbb E_{a,\epsilon,\tau}\left\|v_\theta(a_\tau,\tau,c)-(a-\epsilon)\right\|_2^2 LFM=Ea,ϵ,τ∥vθ(aτ,τ,c)−(a−ϵ)∥22
c c c 包含视觉、语言、机器人状态和本体信息。推理从随机噪声出发,用 4 步 Euler 积分沿预测速度场更新。论文报告 L40、bf16 下生成一个 16 步动作块耗时 63.9 ms。
以将苹果放到底层架子为例:相机图像与指令先形成视觉语言 token,当前双臂关节状态由对应 state encoder 编码;action encoder 接收一个 16 步噪声块。DiT 在 cross-attention 中读取任务条件,在 self-attention 中协调动作块内部的时间关系,经过 4 次更新后,由该机器人 action decoder 输出 16 个连续控制量。控制器执行其中一段后重新观测并滚动规划,因此动作块不是一次性开环完成整项任务。
4、无动作视频如何进入训练
4.1、Latent action 是训练标签,不是机器人控制动作

人类视频只有画面,没有机器人关节动作。论文先训练 VQ-VAE,从当前帧与未来帧之间的变化抽取离散 latent action,再把量化前 embedding 作为 LAPA 本体的动作标签。模型由此学习视觉变化与语言任务的关系。
这类 latent action 不能直接发送给机器人控制器,也不等价于末端位姿。它只是为 action-less video 构造的代理监督,目的是让大规模视频进入同一训练接口。
4.2、IDM 为神经轨迹补全伪动作
论文还训练每个本体的 Inverse Dynamics Model。IDM 以相邻图像为条件,使用 SigLIP-2 和 DiT,通过 Flow Matching 预测导致画面变化的动作。每个本体训练 30K 或 60K steps,然后给神经生成轨迹补上伪动作。
真实遥操作的约 88 小时种子数据由此扩增出 827.3 小时神经轨迹。仿真侧则在 11 小时内生成 78 万条轨迹、约 6500 小时数据。神经轨迹是离线生成视频再经 IDM 标注的训练数据,不是部署时在线预测未来的世界模型。

5、预训练与后训练
预训练混合不同本体和不同监督来源。论文用 embodiment tag 区分机器人接口,并用专属 encoder/decoder 适配状态与动作。VLM 的 language component 保持冻结,训练视觉编码器、DiT 和本体模块,总代价约 5 万 H100 GPU hours。

图 6 补充了真实动作数据的来源:Manus 手套、Vive tracker、Apple Vision Pro 或 Leap Motion 捕获手腕位姿与手部骨架,随后经 robot action retargeting 转成机器人动作,并在真实或仿真环境执行。它解释了数据金字塔顶层为什么仍需要本体相关的数据处理,而不是把人手运动直接当作机器人关节指令。
后训练面向目标本体、任务和环境继续训练。这里的关键不是从零学习视觉语义,而是将共享先验收窄到具体相机、动作空间和任务分布。论文同时评估完整数据与 10% 真机数据,检验预训练能否降低下游演示需求。
6、N1.5、N1.6、N1.7 到底改了什么

官方三个 release 中的 media/model-architecture.png 文件内容相同,只能说明总体仍是 VLM 加扩散动作头。下表来自对应 release tag 的 README、配置和实现,才是版本差异依据。
| 项目 | N1.5 release | N1.6 release | N1.7 release |
|---|---|---|---|
| VLM backbone | Eagle 2.5 | NVIDIA Cosmos-Reason-2B 内部 Eagle 变体;代码默认 Eagle-Block2A-2B-v2 | Cosmos-Reason2-2B,Qwen3-VL 架构 |
| VLM 可训练性 | README 称预训练与微调均冻结;加载默认不调 LLM,但可调 vision/projector | 预训练解冻顶层 4 个 LLM layer | 默认 VLM/vision 冻结,tune_top_llm_layers=0 |
| VLM 后适配器 | post-VLM 4 层 transformer adapter | 移除 4 层 adapter | 延续简化路径 |
| DiT | 16 层;FlowmatchingActionHead | 32 层;AlternateVLDiT | 16 层;AlternateVLDiT |
| 动作 horizon | 16 | 16 | 40 |
| 最大 state/action 维度 | 由 checkpoint 的 action_head_cfg 指定 | 29 / 29 | 132 / 132 |
| 图像处理 | Eagle 2.5 固定管线 | 原生宽高比、灵活分辨率 | Qwen3-VL 原生宽高比、灵活分辨率 |
| 动作表示 | 多本体连续动作 | release 声明多数本体改为 state-relative chunk | 连续动作,percentile normalization 默认开启 |
| 辅助目标 | FLARE future latent alignment | 不再以 N1.5 的 FLARE adapter 为核心 | 20K 小时 EgoScale 人类视频预训练,含较强 state dropout 配置 |
| 部署能力 | Gr00tPolicy 与 policy server | 更简化的数据处理,README 预告 RTC/异步封装 | 全流水线 ONNX/TensorRT;代码支持 RTC |
| release 状态 | 正式后续版本 | 正式后续版本 | Early Access,完整 benchmark 与稳定性承诺待 GA |
表中 action horizon 与最大维度是接口容量,不表示每台机器人一定使用全部维度。N1.6 的 state-relative 也是多数本体的 release 策略,基础 dataclass 的 use_relative_action 默认仍可为 false,实际取决于 processor 与本体配置。
6.1、N1.5:冻结 VLM、FLARE 与多本体 MLP
N1.5 的主类为 GR00T_N1_5,视觉语言侧由 EagleBackbone 提供,动作侧为 FlowmatchingActionHead。MultiEmbodimentActionEncoder 与 CategorySpecificMLP 根据 embodiment id 选择本体分支,最终仍用 Euler 求解 Flow Matching。
FLARE 让动作侧的 future token 对齐未来视觉 latent,使人类第一视角视频能提供未来表示监督。但需要注意,release 的 action forward 中明确设置 return_all_hidden_states=False 并注释当前不使用 FLARE。因此,FLARE 是 N1.5 预训练设计与能力来源,不能据此断言普通下游微调每一步仍显式计算 FLARE loss。
6.2、N1.6:更大的 DiT,减少 VLM 后置适配
N1.6 将 backbone embedding 设为 2048,选择第 16 层特征;动作头 hidden size 为 1024、32 层、32 个 attention heads,每头 48 维。AlternateVLDiT 分开处理 image 与 text,并在不同 block 注入条件。
最关键的结构变化是 DiT 从 16 层增至 32 层,同时删除 N1.5 的 post-VLM 4 层 transformer adapter,预训练改为解冻 VLM 顶层 4 层。它不是单纯放大动作头,而是改变视觉语言表示适应机器人数据的方式。
6.3、N1.7:Qwen3-VL 主干与部署优先
N1.7 的 Qwen3Backbone 使用 Qwen3VLForConditionalGeneration,选择第 12 层特征。Gr00tN1d7ActionHead 仍使用 AlternateVLDiT,但动作 horizon 增至 40、最大 state/action 维度增至 132,DiT 回到 16 层。
N1.7 加入 ONNX/TensorRT 全流水线导出,并提供 Receding-horizon Temporal Coherence:复用上一动作块的重叠部分,通过 frozen steps 与 ramp strength 约束新动作块。RTC 是 N1.7 release 代码能力,不属于 N1 论文。模型默认 state_dropout_prob=0.8,微调 CLI 默认可为 0.2,benchmark 还能覆盖为 0.2、0.5 或 0.8,使用时应以实际配置为准。
7、源码结构与论文模块映射
下文源码版本基线为 N1.5 4af2b622、N1.6 ead52833、N1.7 23ace64f,仓库 main 对应 376ba890。不同 tag 的文件名会变化,阅读旧版本时不能只在 main 上搜索旧类名。
Isaac-GR00T/
├── gr00t/model/
│ ├── gr00t_n1_5.py / backbone.py
│ ├── action_head/
│ │ ├── flow_matching_action_head.py
│ │ └── alternate_vl_dit.py
│ └── gr00t_n1d6.py / gr00t_n1d7.py
├── gr00t/policy/gr00t_policy.py
├── gr00t/data/
│ ├── processing_gr00t_n1d6.py
│ └── processing_gr00t_n1d7.py
├── scripts/launch_finetune.py
├── scripts/inference_service.py
└── examples/
| 论文/工程概念 | N1.5 | N1.6 | N1.7 |
|---|---|---|---|
| 视觉语言条件 | EagleBackbone | Eagle/Cosmos 内部变体 | Qwen3Backbone |
| 状态动作适配 | MultiEmbodimentActionEncoder、CategorySpecificMLP | processor + embodiment 配置 | 132D pad、percentile processor |
| 动作速度场 | FlowmatchingActionHead | N1.6 action head | Gr00tN1d7ActionHead |
| 条件 DiT | flow matching transformer | AlternateVLDiT 32 层 | AlternateVLDiT 16 层 |
| 采样 | 4 步 Euler | 4 步 Euler | 4 步 Euler,可叠加 RTC |
| 策略接口 | Gr00tPolicy | Gr00tPolicy | Gr00tPolicy 与导出部署 |
7.1、多本体编码不是概念标签,而是独立参数分支
N1.5 的 gr00t/model/action_head/flow_matching_action_head.py::FlowmatchingActionHead.__init__ 直接实例化三类本体相关模块:
self.model = DiT(**config.diffusion_model_cfg)
self.action_horizon = config.action_horizon
self.num_inference_timesteps = config.num_inference_timesteps
self.state_encoder = CategorySpecificMLP(
num_categories=config.max_num_embodiments,
input_dim=config.max_state_dim,
hidden_dim=self.hidden_size,
output_dim=self.input_embedding_dim,
)
self.action_encoder = MultiEmbodimentActionEncoder(
action_dim=config.action_dim,
hidden_size=self.input_embedding_dim,
num_embodiments=config.max_num_embodiments,
)
self.action_decoder = CategorySpecificMLP(
num_categories=config.max_num_embodiments,
input_dim=self.hidden_size,
hidden_dim=self.hidden_size,
output_dim=config.action_dim,
)
state_encoder 把各本体不同维度的状态投影到共享 token 空间,action_encoder 同时编码带噪动作与扩散时间,action_decoder 再按 embodiment_id 选择参数分支并还原动作维度。共享 DiT 位于中间,因此跨本体共享的是动作生成主干,不是机器人原始关节定义。
7.2、Flow Matching 的插值、目标和 mask 如何实现
同一文件的训练 forward 把真实动作与噪声线性插值,并以 actions - noise 作为速度目标:
actions = action_input.action
noise = torch.randn(actions.shape, device=actions.device, dtype=actions.dtype)
t = self.sample_time(actions.shape[0], device=actions.device, dtype=actions.dtype)
t = t[:, None, None]
noisy_trajectory = (1 - t) * noise + t * actions
velocity = actions - noise
t_discretized = (t[:, 0, 0] * self.num_timestep_buckets).long()
action_features = self.action_encoder(
noisy_trajectory, t_discretized, embodiment_id
)
sa_embs = torch.cat((state_features, future_tokens, action_features), dim=1)
model_output = self.model(
hidden_states=sa_embs,
encoder_hidden_states=vl_embs,
timestep=t_discretized,
return_all_hidden_states=False, # not using FLARE in this forward
)
pred_actions = self.action_decoder(model_output, embodiment_id)[:, -actions.shape[1]:]
loss = F.mse_loss(pred_actions, velocity, reduction="none") * action_input.action_mask
loss = loss.sum() / action_input.action_mask.sum()
这里 actions 的形状是
[
B
,
H
,
D
a
]
[B,H,D_a]
[B,H,Da],
t
t
t 扩展为
[
B
,
1
,
1
]
[B,1,1]
[B,1,1] 后对整个动作块广播;action_mask 排除 padding 维度和无效时间步。代码也解释了 FLARE 的边界:虽然 action head 创建了 future_tokens,当前这条下游前向把 return_all_hidden_states 设为 false,因此 loss 只对动作速度做 masked MSE,没有在此处计算 future latent alignment。
7.3、N1.6 和 N1.7 的结构差异来自配置与构造函数
N1.6 的 gr00t/configs/model/gr00t_n1d6.py::Gr00tN1d6Config 将关键结构参数集中在配置中:
model_name = "nvidia/Eagle-Block2A-2B-v2"
tune_top_llm_layers = 4
select_layer = 16
max_state_dim = 29
max_action_dim = 29
action_horizon = 16
use_alternate_vl_dit = True
diffusion_model_cfg = {
"num_layers": 32,
"num_attention_heads": 32,
"attention_head_dim": 48,
"interleave_self_attention": True,
}
num_inference_timesteps = 4
gr00t_n1d6.py::Gr00tN1d6ActionHead.__init__ 根据 use_alternate_vl_dit 实例化 AlternateVLDiT,并把 backbone_embedding_dim 与 attend_text_every_n_blocks 传入动作主干。这证明 32 层不是 README 中的孤立描述,而是真正控制 transformer block 数量的构造参数。
N1.7 在 gr00t/configs/model/gr00t_n1d7.py 中把主干和动作容量同时改写:
model_name = "nvidia/Cosmos-Reason2-2B"
backbone_model_type = "qwen"
tune_top_llm_layers = 0
select_layer = 12
use_percentiles = True
max_state_dim = 132
max_action_dim = 132
action_horizon = 40
diffusion_model_cfg = {
"num_layers": 16,
"num_attention_heads": 32,
"attention_head_dim": 48,
}
num_inference_timesteps = 4
state_dropout_prob = 0.8
对应的 qwen3_backbone.py::Qwen3Backbone 通过 Qwen3VLForConditionalGeneration.from_pretrained 加载主干;当 tune_llm=False、tune_visual=False 时,set_trainable_parameters 分别冻结 language model 和 visual tower。由此可以区分模型类型、抽取层和可训练性,而不需要从通用架构图推断。
7.4、Euler 采样与 N1.7 RTC 在哪里进入循环
N1.5 的 get_action 从形状为
[
B
,
H
,
D
a
]
[B,H,D_a]
[B,H,Da] 的高斯噪声开始,循环次数来自 num_inference_timesteps:
actions = torch.randn(
size=(batch_size, self.config.action_horizon, self.config.action_dim),
dtype=vl_embs.dtype,
device=device,
)
dt = 1.0 / self.num_inference_timesteps
for t in range(self.num_inference_timesteps):
action_features = self.action_encoder(actions, timesteps_tensor, embodiment_id)
sa_embs = torch.cat((state_features, future_tokens, action_features), dim=1)
model_output = self.model(
hidden_states=sa_embs,
encoder_hidden_states=vl_embs,
timestep=timesteps_tensor,
)
pred_velocity = self.action_decoder(model_output, embodiment_id)[:, -self.action_horizon:]
actions = actions + dt * pred_velocity
这段代码对应公式中的 Euler 更新。N1.7 在相同更新位置额外乘 vel_strength:RTC 先把上一动作块的重叠区写入新块,再把 frozen 区的 vel_strength 设为 0,过渡区按指数 ramp 从 0 增至 1,最终执行 actions = actions + dt * pred_velocity * vel_strength。因此 RTC 改变的是每个时间位置在重采样时允许更新的强度,并没有替换 Flow Matching 速度场。
8、训练、推理与部署入口
典型流程是先把 (video, state, action) 演示转换为 GR00T/LeRobot 数据格式,再选择与 release 匹配的 modality config 微调。以下命令展示当前仓库的入口形态,具体参数应以目标 tag 的 README 为准:
git clone https://github.com/NVIDIA/Isaac-GR00T.git
cd Isaac-GR00T
git checkout n1.7-release
python scripts/launch_finetune.py \
--base-model-path nvidia/GR00T-N1.7-3B \
--dataset-path /path/to/lerobot_dataset \
--output-dir ./checkpoints/my_robot
推理侧由 Gr00tPolicy 完成观测预处理、模型调用和动作反归一化。真机部署通常把 GPU policy server 与机器人进程分开,客户端发送图像、状态和语言指令,服务端返回动作块。调用成功不等于可直接上真机:还需核对关节顺序、单位、动作语义、时间戳、归一化统计、控制频率和急停边界。
9、论文实验结果
9.1、仿真:每任务 100 条演示

仿真评测并非单一场景重复试验。图 8 上排是 RoboCasa 厨房任务,中排是 DexMimicGen 任务,下排是贴近真机设置的 GR-1 桌面操作,覆盖抓放、开关设备、装配、搬运、倾倒与容器间移动。

| 方法 | RoboCasa | DexMG | GR-1 | 平均 |
|---|---|---|---|---|
| BC Transformer | 26.3% | 53.9% | 16.1% | 26.4% |
| Diffusion Policy | 25.6% | 56.1% | 32.7% | 33.4% |
| GR00T-N1-2B | 32.1% | 66.5% | 50.0% | 45.0% |
每个任务使用 100 次 rollout;论文每 500 steps 保存 checkpoint,并在最后 5 个 checkpoint 中取最大结果。这一选择有利于展示最佳后期模型,但不是单一预注册 checkpoint 的无偏估计。
9.2、真机:完整数据与 10% 数据

图 10 顶部展示预训练模型的左右手协同和新物体到新容器泛化,底部覆盖抓放、铰接物体、工业操作与双机器人协同。不同任务对抓取、受限空间放置、双臂交接和多智能体时序提出了不同要求,因此平均成功率需要结合任务分组理解。

GR00T N1 在完整数据下平均 76.8%,Diffusion Policy 为 46.4%;只使用 10% 数据时,二者分别为 42.6% 和 10.2%。分组结果中,N1 完整数据的 Pick-and-Place、Articulated、Industrial、Coordination 分别为 82.0%、70.9%、70.0%、82.5%;10% 数据对应 35.0%、62.0%、31.0%、50.0%。
真机通常每个任务评测 10 次,Machinery Packing 只有 5 次。样本量较小时,单次成功会显著改变百分比,因此这些数字能支持明显的相对优势,但不宜当作高精度总体成功率。
10、方法价值与局限
GR00T N1 最重要的贡献不是单独发明一种 DiT,而是把异构数据、本体适配、无动作视频标注和连续动作生成接成了统一训练体系。真实轨迹提供可靠控制监督,仿真扩充任务,人类视频贡献行为先验,latent action 与 IDM 则负责把缺失的动作接口补齐。
代价同样明显。5 万 H100 GPU hours 和数千小时私有数据使完整预训练难以复现;IDM 伪动作会把视觉歧义和模型误差带入神经轨迹;本体专属 encoder/decoder 仍需要准确的数据配置。论文实验主要比较整体系统,没有把每种数据源、latent action、IDM 与各注意力设计做完整等预算消融。
后续 release 的演进也说明结构尚未收敛:VLM 从 Eagle 2.5 到内部 Eagle/Cosmos,再到 Qwen3-VL;DiT 从 16 层增至 32 层又回到 16 层;动作接口从 16 步、较小维度扩到 40 步、132 维。选择版本时应从目标本体、显存、延迟、部署工具和 checkpoint 许可出发,而不是简单把版本号视为同一结构上的线性升级。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)