数据源:LeRobot 格式
统一的 HDF5/Parquet 格式存储机器人演示数据。每条样本包含:多视角图像序列、语言指令、动作 chunk、本体感觉状态。通过 YAML 声明式配置混合多个数据集。
基于 StarVLA 代码库,带你理解主流 Vision-Language-Action 模型的模块化设计
VLA = Vision-Language-Action 模型:一个神经网络,输入是相机图像(Vision) + 语言指令(Language),输出是机器人的动作(Action)。
[相机看到的画面] + "把红色杯子放到盘子上"
│
▼
┌──────────┐
│ VLA 模型 │
└──────────┘
│
▼
[机械臂未来几步怎么动: 往哪走、夹爪开还是合]
类比:ChatGPT 是"文字进、文字出";VLA 是"图像+文字进、机器人动作出"。它把大模型的理解能力接到了真实机器人身上。
| 老办法 | 问题 | VLA 的改进 |
|---|---|---|
| 传统运动规划 (先感知→建模→规划轨迹) | 每个任务要人工写规则,换任务/换物体就崩 | 从演示数据端到端学,换任务只需换数据 |
| 强化学习 (试错学习) | 真机试错慢又危险,奖励难设计 | 用人类演示直接模仿,不用试错 |
| 普通模仿学习 (无语言) | 一个模型只会一个任务,不懂指令 | 语言指令控制,一个模型做多任务 |
假设任务是 "pick up the red cup"(拿起红杯子)。全流程:
① 观测(Observation): 2 个相机拍照 + 读机械臂当前姿态
images = [主视角RGB, 腕部RGB] state = 当前末端位姿+夹爪开合
② 输入模型: images + "pick up the red cup" + state
→ VLM 把图像和文字编码成特征 (理解"红杯子在哪、要抓它")
③ Action Head 生成动作: 输出未来 16 步动作序列
action = [[Δx,Δy,Δz, Δroll,Δpitch,Δyaw, gripper], ... 共16行]
④ 执行(Receding Horizon): 只执行前 8 步 → 机械臂移动
→ 执行完重新拍照, 回到 ①, 循环
⑤ 直到杯子被拿起 → 任务成功
这就是一次完整的"感知→决策→执行→再感知"的闭环。VLA 模型负责的是 ②③ 两步。
最常见的机械臂动作是 7 维向量(每一步):
| 维度 | 含义 | 说明 |
|---|---|---|
| 1-3 | x, y, z 位移 | 末端(夹爪)在空间往哪移动 |
| 4-6 | roll, pitch, yaw 旋转 | 夹爪姿态怎么转 (也可能用 6D 旋转表示) |
| 7 | gripper 夹爪 | 开(0)还是合(1) |
VLA 主要靠 模仿学习 / 行为克隆 (Behavior Cloning, BC):给它看大量"专家怎么做"的演示,让它模仿。
人用手柄/VR/主从臂遥控机器人完成任务,全程记录"每一刻看到什么 + 人让它做什么动作"。一次完整任务录下来叫一条 episode / trajectory(轨迹)。
一条 episode = [
(图像_t0, 指令, 动作_t0),
(图像_t1, 指令, 动作_t1),
...直到任务完成
]
成千上万条 episode → 训练集 → 模型模仿
2022 Gato / VIMA 早期多任务, 通才尝试
2023 RT-1 → RT-2 Google, 首次把大 VLM 接到机器人
Diffusion Policy 用扩散模型生成动作 (多模态突破)
2024 OpenVLA 开源 7B VLA, 社区基线
Octo 开源通用策略
π0 Physical Intelligence, Flow Matching 动作专家
2025 π0.5 / GR00T-N1 开放世界泛化 / NVIDIA 人形
2026 StarVLA 开源"乐高"平台 (本页主角)
Qwen-VLA/RobotManip 阿里, OOD-first 评测
π0.7 / GigaBrain RL 自进化 / 世界模型
StarVLA 的定位:不是又一个新模型,而是把上面这些方法统一到一个可复现、可替换的代码库里,方便公平对比和快速原型。
| 术语 | 一句话解释 |
|---|---|
| backbone | 主干网络,这里指负责理解图像+语言的 VLM |
| action head | 动作头,接在 backbone 后面、负责输出动作的模块 |
| chunk | 动作块,一次预测的一串连续动作 (如16步) |
| horizon | 时间窗口。观测horizon=看几步历史; 预测horizon=预测几步; 执行horizon=执行几步 |
| rollout | 让模型在环境里实际跑一遍任务 (评测时用) |
| proprioception | 本体感觉,机器人自己的关节角/末端位姿等内部状态 |
| embodiment | 本体,指具体的机器人形态 (单臂/双臂/不同型号) |
| cross-embodiment | 跨本体,在一种机器人上训练、迁移到另一种 |
| teleoperation | 遥操作,人远程操控机器人来采集演示数据 |
| episode / trajectory | 一条完整任务的记录 (观测+动作序列) |
| BC (Behavior Cloning) | 行为克隆,模仿演示数据的学习方式 |
| OOD | Out-Of-Distribution,分布外,指测试时遇到训练没见过的情况 |
| checkpoint | 训练过程中保存的模型权重文件 |
| denoise / 去噪 | 扩散模型从噪声一步步生成动作的过程 |
| SFT | 监督微调,用标注数据训练模型 |
你在这里 ──► 🎓 新手入门 (建立全局观)
│
▼
整体架构 (Backbone + Action Head 分解)
│
▼
Backbone层 / Action Head层 (两大模块分别理解)
│
├──► 想懂动作头背后的扩散数学?
│ 去 → "DP·DiT·Flow Matching 三剑客" 页
│
▼
层与VLM深究 (VLM 的层、选层策略)
│
▼
数据集 (训什么、测什么、OOD)
│
▼
全部模型清单 / 方法对比 / OpenPI对比 (进阶横向)
│
▼
自测 (检验掌握)
VLA 系统被拆解为两个通过标准化隐状态契约连接的可替换模块。点击任意模块查看详情。
Backbone 负责将原始多模态输入编码为丰富的隐状态表示,供 Action Head 消费。
3B-4B 参数,36层 Transformer,hidden_dim=2048。支持动态分辨率,原生多图输入。StarVLA 大部分实验基于此。
Google 的 4B 视觉-语言模型。适合对比不同 VLM backbone 对动作预测的影响。
2.4B 参数,28层,hidden_dim=2304。国产高效 VLM,适合资源受限场景。
阿里万相 Text+Image→Video 模型。30层 DiT,hidden_dim=3072。用 UMT5 编码文本,VAE 编码图像。
NVIDIA Cosmos 系列预测模型。24层,hidden_dim=2048。面向物理世界预测。
| 维度 | VLM Backbone | World Model Backbone |
|---|---|---|
| 预训练目标 | 图文对齐 + 语言生成 | 未来帧预测(时空建模) |
| 输入处理 | Vision Encoder → Projector → LLM | VAE Encoder → DiT |
| 隐状态语义 | 高级语义(对象、关系、意图) | 动态物理(运动、接触、变形) |
| 优势场景 | 语言驱动、多任务泛化 | 接触丰富、需要物理预测 |
| 代表方法 | OpenVLA, π₀, GR00T | Cosmos Policy, UniSim |
Action Head 将 backbone 的隐状态转换为机器人可执行的动作序列。点击卡片查看内部结构。
原理:将连续动作 BPE 编码为离散 token,复用 LLM 的 next-token 预测。
代表:π₀-FAST, RT-2
参数量最小 | 推理慢(自回归)| 适合语言-动作联合
原理:从 hidden states 中提取特征,MLP 直接回归连续动作值(L1 Loss)。
代表:OpenVLA-OFT
最简单 | 推理最快 | 数据效率高 | 单峰假设
原理:Cross-DiT 做流匹配,所有 DiT 层共享 VLM 最后一层 hidden_state 作为 KV。
代表:GR00T N1.5, CogACT
多模态分布 | 推理需迭代 | DiT 深度自由 | 单一语义条件
原理:DiT 第 i 层 cross-attend 到 VLM 第 i 层,多尺度特征融合做流匹配。
代表:π₀
最强表达力 | 多尺度空间+语义 | DiT层数=VLM层数
不同 VLA 方法取 VLM 隐状态的方式截然不同,反映各自的设计假设:
| 方法 | 取哪些层 | 怎么用 | 设计假设 |
|---|---|---|---|
| GR00T | 仅最后一层hidden_states[-1] | 所有 DiT 层 cross-attn 共享同一 KV | 最终表示已充分融合视觉+语言,够用 |
| PI (π₀) | 最后 N 层hidden_states[-N:] | 第 i 层 DiT cross-attend 到第 i 层 VLM | 不同深度编码不同粒度,精确操作需要全部 |
| FAST | 不显式取 | 动作在 LLM 内部自回归生成,所有层天然参与 | 动作就是语言序列的延续 |
| OFT | 最后层中特定 token 位置 | MLP 从对应位置直接回归 | action token 位置已聚合足够信息 |
# GR00T (QwenGR00T.py) — 只取最后层
last_hidden = qwenvl_outputs.hidden_states[-1]
# PI (QwenPI.py) — 取最后 N 层,N = DiT 层数
expected_layers = len(self.action_model.model.transformer_blocks)
vl_embs_list = list(qwenvl_outputs.hidden_states[-expected_layers:])
实验启示:从 StarVLA 的 LIBERO 结果看,OFT(仅最后层)96.6% 略胜 PI(全层)95.7%,说明简单桌面任务上多尺度特征收益不明显。PI 的优势可能要在需要空间精度的精细接触操作中才能体现。
VLM 在不同 action head 中扮演的角色不完全相同:
| Action Head | VLM 的角色 | 类比 |
|---|---|---|
| GR00T / PI | 纯条件编码器。VLM 输出 hidden states,action DiT 通过 cross-attn 以此为条件生成动作 | Stable Diffusion 中 CLIP text encoder |
| OFT | 条件编码器 + 特征提取器。最后层特定 token 位置被 MLP 直接读取 | BERT + classification head |
| FAST | 不是条件编码器——VLM 本身就是动作生成器。动作 token 在 LLM 内部自回归生成 | GPT 生成文本,动作是文本的延续 |
VLM = 条件编码器,和文生图的 text encoder 完全类比。可以冻结 VLM 只训练 action head。
VLM 既是编码器也是生成器,不可分。因果注意力让图像/语言 token 自然 condition 动作 token。必须微调整个 VLM。
论文只重点讲 4 个代表性变体(FAST/OFT/PI/GR00T),但代码库 FRAMEWORK_REGISTRY 实际注册了 25 个 framework。下面是逐个核对源码后的完整清单。每个 = 1 个 Backbone + 1 个 Action Head 的具体组合。
| 注册名 | Backbone | Action Head | 范式 | 文件 |
|---|---|---|---|---|
| QwenFast | Qwen2.5/3-VL (+Action词表) | FAST tokenizer | 自回归离散token | VLM4A/QwenFast.py |
| QwenOFT | Qwen2.5/3-VL | MLP (action special token) | 并行回归 L1 | VLM4A/QwenOFT.py |
| QwenPI (=QwenFM) | Qwen2.5/3-VL | 层级 Cross-DiT | Flow Matching | VLM4A/QwenPI.py |
| QwenGR00T | Qwen2.5/3-VL | 单源 DiT | Flow Matching | VLM4A/QwenGR00T.py |
| 注册名 | Backbone | Action Head | 说明 |
|---|---|---|---|
| Gemma4PI | Gemma-4 (google/gemma-4-E2B-it) | 层级 Cross-DiT (FM) | QwenPI 移植到 Gemma4 |
| Gemma4GR00T | Gemma-4 | 单源 DiT (FM) | QwenGR00T 移植到 Gemma4 |
| MiniCPMPI | MiniCPM-V 4.6 | 层级 Cross-DiT (FM) | QwenPI 移植到 MiniCPM |
| MiniCPMGR00T | MiniCPM-V 4.6 | 单源 DiT (FM) | QwenGR00T 移植到 MiniCPM |
| CosmosGR00T | Cosmos-Reason2 (架构=Qwen3-VL) | 单源 DiT (FM) | QwenGR00T 用 Cosmos-Reason2 VLM |
这类变体证明了"Backbone 可插拔"——同一动作头换个 VLM 就是新 framework,几乎零改动。
| 注册名 | Backbone | Action Head | 创新点 |
|---|---|---|---|
| QwenPI_v3 | Qwen2.5/3-VL | 压缩层级 Cross-DiT | 每层 VLM 经 LayerNorm+Linear 投影降维(2560→1024),省~(vl/dit)²参数;离散化state注入语言。已放出SimplerEnv 69.8% ckpt |
| QwenDiscreteDiffusion | Qwen2.5-VL | MaskGIT 离散扩散头 | 层级 cross-attn 结构同 PI,但连续 FM 换成对动作分箱的离散扩散(预测logits),支持 RTC 实时分块 |
| QwenAdapter | Qwen-VL | VLA-Adapter 头 | 动作头来自 VLA-Adapter 论文 |
| QwenDual | Qwen2.5-VL + DINOv2 | 单源 DiT (FM) | 双视觉编码器:VLM + DINOv2 多视角空间特征融合 |
| 注册名 | Backbone (World Model) | Action Head |
|---|---|---|
| WanPI | Wan2.2-TI2V-5B (视频DiT) | 层级 Cross-DiT (FM) |
| WanGR00T | Wan2.2-TI2V-5B | 单源 DiT (FM) |
| WanOFT | Wan2.2-TI2V-5B | MLP 回归 (OFT) |
| CosmoPredict2PI | Cosmos-Predict2 DiT | 层级 Cross-DiT (FM) |
| CosmoPredict2GR00T | Cosmos-Predict2 DiT | 单源 DiT (FM) |
| CosmoPredict2OFT | Cosmos-Predict2 DiT | MLP 回归 (OFT) |
WM4A = "World Model for Action"。把感知 backbone 从 VLM 换成视频生成模型(Wan2.2 / Cosmos-Predict2),复用同样的 4 类动作头。2×3 = 6 个组合(PI/GR00T/OFT × Wan/Cosmos)。
| 注册名 | Backbone | Action Head | 特点 |
|---|---|---|---|
| InternVLA-M1 | Qwen2.5-VL + DINO 多视角 | 层级 QFormer 聚合 → DiT | StarVLA 的前身(codebase fork 自 InternVLA-M1),QFormer 聚合多层VLM隐状态 |
| LangForce | Qwen-VL | 单源 DiT (FM) + 语言力 | ICML2026;语言span一致性+硬token LLR+shortcut gate(贝叶斯分解) |
| ABot_M0 | Qwen3-VL 4B (ABot-M0预训练权重) | Flow Matching | 接入 ABot-M0 团队预训练权重(amap-cvlab) |
│ FAST │ OFT │ PI(层级DiT) │ GR00T(单源DiT) │ 其它头
──────────────┼──────┼─────┼─────────────┼────────────────┼──────────
Qwen-VL │ ✓ │ ✓ │ ✓ (+v3) │ ✓ │ Adapter/离散扩散/Dual
Gemma-4 │ │ │ ✓ │ ✓ │
MiniCPM-V │ │ │ ✓ │ ✓ │
Cosmos-Reason2│ │ │ │ ✓ │
Wan2.2(WM) │ │ ✓ │ ✓ │ ✓ │
Cosmos-Pred2 │ │ ✓ │ ✓ │ ✓ │
特殊集成 │ │ │ │ │ M1 / LangForce / ABot_M0
这一节回答一组常被混淆的问题:所谓"不同层"到底是什么?每层是不是一张 feature map?为什么 starVLA 选的层和原作者不同?用自回归的 VLA 还有"层"的概念吗?VLA 里的 VLM 和原生 VLM 有没有区别?
VLM 的语言主干是一个 Transformer decoder,由 N 个结构相同的 decoder block 堆叠而成(Qwen3-VL-4B 是 36 层,Gemma-4 约 34 层)。这里说的"层"就是每个 decoder block 的输出。
输入 tokens (图像patch token + 文本token) → embedding
│ 形状 [B, L, H] B=batch, L=token序列长, H=hidden_size(如2048)
▼
┌─ Block 0 ─→ hidden_states[1] [B, L, H] ← "第1层输出"
├─ Block 1 ─→ hidden_states[2] [B, L, H]
├─ ...
└─ Block 35 ─→ hidden_states[36] [B, L, H] ← "最后一层输出"
output_hidden_states=True 时, HF 返回 (N+1) 个张量:
hidden_states[0] = embedding 层输出(未过任何block)
hidden_states[1..N] = 每个 block 的输出
[B, L, H] 的张量——L 个 token、每个 token 一个 H 维向量。它更像"L 个 token 各自的语义向量序列",而不是 CNN 里那种 [C,H,W] 的空间特征图。图像在进 LLM 前已经被视觉编码器切成 patch token 拉平成序列了,所以 LLM 内部是"序列 × 向量",没有二维空间结构。不同深度的层编码不同抽象层级的信息(这是 Transformer 的普遍规律):
| 层深度 | 大致编码什么 | 类比 |
|---|---|---|
| 浅层 (0~1/3) | 低级/局部:token 表面、局部搭配、物体位置纹理 | "看到了什么、在哪" |
| 中层 (1/3~2/3) | 中级:短语组合、物体关系、场景布局 | "它们之间什么关系" |
| 深层 (2/3~最后) | 高级:任务语义、指令意图、下一步预测 | "要干什么" |
| Action Head | 用层策略 | 取的是什么 |
|---|---|---|
| FAST(自回归) | 不显式取任何隐藏层 | 直接用 LLM 的 logits/输出 token——动作是自回归生成序列的一部分 |
| OFT | 仅最后一层 hidden_states[-1] | 该层中 action token 位置的向量 → MLP 回归 |
| GR00T | 仅最后一层 hidden_states[-1] | 整层 [B,L,H] 作为 DiT 的 cross-attn KV |
| PI(层级) | 最后 N 层 hidden_states[-N:] | 第 i 层 DiT 对应吃第 i 层 VLM |
| PI_v3 | 最后 N 层 + 逐层投影降维 | 每层经 LayerNorm+Linear 压缩后再喂 DiT |
PI 的选层不是随便挑几层,而是让 DiT 的层数决定取多少层,从 VLM 顶部往下数:
# starVLA/model/framework/VLM4A/QwenPI.py
qwenvl_outputs = self.qwen_vl_interface(..., output_hidden_states=True)
expected_layers = len(self.action_model.model.transformer_blocks) # DiT 层数
vl_embs_list = list(qwenvl_outputs.hidden_states[-expected_layers:])
# ↑ 取"最后 expected_layers 层"
# DiT 有几层, 就取 VLM 最后几层, 第 i 层 DiT 吃第 i 层 VLM
而 QwenPI_v3 更进一步——每层先过一个专属投影器压维再喂 DiT:
# starVLA/model/framework/VLM4A/QwenPI_v3.py
vl_embs_list = list(qwenvl_outputs.hidden_states[-self.num_action_dit_layers:])
# 每层一个 LayerNorm+Linear 投影: VLM hidden(2560) -> DiT hidden(1024)
self.project_layers = nn.ModuleList([LayerNorm+Linear ...])
return [proj(vl_h) for proj, vl_h in zip(self.project_layers, vl_embs_list)]
世界模型(Wan2.2)则用 forward hook 抓中间 block 输出,层由 extract_layers 配置(默认 [-1],即只抓最后一层):
# starVLA/model/modules/world_model/Wan2.py
extract_layers = wm_cfg.get("extract_layers", [-1])
for layer_idx in self._extract_layers:
actual_idx = layer_idx if layer_idx >= 0 else num_blocks + layer_idx
block = self.transformer.blocks[actual_idx]
block.register_forward_hook(self._capture_hook) # 挂钩子抓该层输出
核心原因:starVLA 换了 backbone,原作者的"层号"不再适用,必须重新对齐。几个具体动因:
hidden_states[-N:]),自动适配任意 backbone。output_hidden_states 返回 N+1 个张量(含 embedding 层),有的原实现从 embedding 数起、有的从第一个 block 数起。starVLA 统一用负索引 [-N:] 从顶部数,规避这种 off-by-one 分歧。答案是:看这个 VLA 用哪种 action head,有的改了 VLM、有的没改。可分三档:
| 档位 | 代表 | VLM 本体是否改 | 改了什么 |
|---|---|---|---|
| A. 完全不改结构,只微调权重 | GR00T / PI / OFT | 结构不变 | VLM 当"特征编码器",前向照旧输出 hidden_states;只是训练时权重被微调(或冻结)。词表、架构、tokenizer 全不动 |
| B. 扩词表 + 微调 | FAST | 轻改:加 action token | 往 tokenizer/embedding 里新增一批动作 token(如 Qwen2.5-VL-3B-Action),embedding 和 lm_head 相应扩容。主干结构不变,但词表变大了 |
| C. 改造输入/注意力 | π₀ 双 Gemma | 较大改动 | 如 π₀ 把动作专家(小 Gemma)和 VLM(大 Gemma)拼进同一注意力空间、加 prefix-suffix 掩码——已不是原生 VLM 的标准前向 |
对照 starVLA 代码印证 A 档"不改结构":
# QwenGR00T / QwenPI: 直接调 HF 原生模型, 只多要 hidden_states
qwenvl_outputs = self.qwen_vl_interface(
**qwen_inputs, output_hidden_states=True, return_dict=True)
# ↑ 就是原生 Qwen-VL 的 forward, 没有任何结构修改
# 区别仅: (1)可能冻结/低LR微调 (2)读了中间层给 action head
# QwenFast: 用原生 generate, 但词表被扩过(含 action token)
generated_ids = self.qwen_vl_interface.model.generate(...)
mask = (generated_ids >= act_min) & (generated_ids <= act_max) # 抓动作token
# ↑ 结构没改, 但 tokenizer/embedding 扩了动作词表
原生 VLM (Qwen3-VL 36层 decoder)
每层输出 hidden_states[i]: [B, L, H]
(L个token各一个H维向量, 非空间feature map)
│
┌───────────────┬──────────┼───────────┬──────────────┐
▼ ▼ ▼ ▼ ▼
FAST OFT GR00T PI PI_v3
不取隐藏层 取[-1]层 取[-1]层 取[-N:]层 取[-N:]层+投影
用logits +action 整层做 第i层DiT 每层LN+Linear
自回归 token位置 cross-attn 吃第i层VLM 压维再喂
│ │ KV │ │
VLM扩词表 VLM不改 VLM不改 VLM不改 VLM不改
(轻改) (仅微调) (仅微调) (仅微调) (仅微调)
选层规则: 相对索引 [-N:] (N=DiT层数), 换backbone自动适配
→ 这就是 starVLA 和"原作者固定层号"不同的原因: 为可移植性
最常被问:"都说在仿真 benchmark 上测,是在 benchmark 数据上训练吗?" 是的——先厘清训练分几层:
| 阶段 | 用什么数据 | 产出 |
|---|---|---|
| ① VLM 预训练(继承,非自己做) | 互联网图文/VQA(无机器人动作) | Qwen-VL / PaliGemma 等通用骨干 |
| ② VLA 预训练(可选,基础模型才做) | 大规模跨本体机器人数据(OXE/DROID/RH20T…) | π0 / GR00T / Qwen-RobotManip 等机器人基础模型 |
| ③ VLA 后训练/微调(SFT)(几乎都做) | 目标 benchmark 自带的演示 split(如 LIBERO 每套件 500 条) | 在该 benchmark 刷分的模型 |
| 训练数据 | 评测 benchmark | |
|---|---|---|
| 目的 | 让模型学会动作 | 衡量模型好不好 |
| 规模 | 越大越好 (千小时级) | 够覆盖任务即可 |
| 代表 | Open X-Embodiment, DROID, BridgeData V2 | LIBERO, CALVIN, RoboCasa, SimplerEnv, RoboTwin |
| 形态 | 多为真机遥操作/合成 | 多为仿真 (可复现、免真机) |
| 数据集 | 规模 | 机器人 | 特色 / 谁在用 |
|---|---|---|---|
| Open X-Embodiment (OXE) | 1M+ episodes / 22 种机器人 | 多本体 | Google 主导的跨本体开源联盟,统一 RLDS 格式。OpenVLA/π0/GR00T/Qwen-VLA 预训练 |
| DROID | 76K+ episodes / 564 场景 | Franka (多实验室) | 分布式采集、多样性极高、多相机。被引最多(31篇) |
| BridgeData V2 | 60K+ episodes | WidowX 250 | 多场景桌面操作、语言标注丰富。SuSIE/OpenVLA 微调 |
| AgiBotWorld | 大规模 | 人形/双臂 | GR00T/Qwen-RobotManip 用 |
| RoboMIND | 大规模多任务 | 多种 | Qwen-RobotManip 用(但发现 UR 数据 81% 未通过质量检查) |
| 名称 | 任务 | 机器人 | 典型用途 |
|---|---|---|---|
| LIBERO | 130任务(Spatial/Object/Goal/Long各套) | Franka Panda | VLA 基础能力评测首选,几乎所有论文都报(被引29篇) |
| CALVIN | 34任务, ABCD 4环境 | Franka (PyBullet) | 长程语言条件操作;ABC→D 是天然 zero-shot OOD;引导类方法聚集地 |
| RoboCasa | 100任务(365版更大) | Franka / 移动臂 | 写实厨房场景,通用策略评测 |
| SimplerEnv | Google Robot + WidowX | 2 平台 | 仿真复现真机表现、与真机高相关,快速迭代 |
| RoboTwin 2.0 | 50 双臂任务 | 5 种本体 | 大规模双臂泛化评测 |
| 名称 | OOD 维度 | 核心发现 |
|---|---|---|
| LIBERO-Plus | 7维独立扰动(物体布局/相机视角/初态/语言/光照/背景/噪声) | 相机视角和初态最致命,性能 95%→30% |
| LIBERO-PRO | 物体替换/初态/指令/环境/任务(5维) | VLA 依赖记忆而非理解;π0.5 Object 98% → 加 Position 扰动 17% → 加 Task 扰动 1% |
| RoboTwin-C2R | 干净场景训练→随机化场景测试 | StarVLA 从 IID 85.7% 跌到 OOD 10.6% |
| RoboTwin-IF | 语言指令变体 | 测"语言是否真正控制动作",防 VLA→VA 退化 |
| RoboTwin-XE | 跨本体零样本迁移 | joint 控制几乎不能跨本体(<5%),需相机系 EEF 对齐 |
两者名字相近但是两个不同的 benchmark,都在原始 LIBERO 演示上训练、在扰动集上测(都是纯 OOD 评测),但侧重点不同。常被混淆,这里逐条对照。
| 维度 | LIBERO-Plus | LIBERO-PRO |
|---|---|---|
| 出处 | In-depth Robustness Analysis of VLA(sylvestf);ImageWAM 等用它 | arXiv:2510.03827;VLS 用它 |
| 规模 | 10,030 个任务 | 4 suite × 多种扰动 |
| 扰动维度 | 7 类:相机视角 / 机器人初态 / 语言改写 / 光照 / 背景纹理 / 传感器噪声 / 布局 | 5 类:Position(swap) / Object / Semantic(语言) / Task / Environment |
| 侧重 | 感知·物理层扰动更全 | 语义·任务层 OOD 更极端 |
| 标志性发现 | 对相机视角/初态极敏感(95%→<30%);模型"忽视语言",退化成 Vision-Action | 高分靠"死记场景";π0.5 Object 98% → 加 Position 掉到 17%、加 Task 掉到 1% |
| 最狠的扰动 | 相机视角 / 机器人初态(纯视觉物理偏移) | Task:同时换指令+目标+关注物体,几乎所有模型掉到 0–1% |
| 巧妙设计 | 7 维 × 5 级强度梯度,可测"扰动多大开始崩" | Position(swap):指令一字不改只对调两物体位置,纯测"死记坐标 vs 真找目标" |
光知道名字不够,下面拆开每个 benchmark:里面具体是什么任务、怎么分套件/难度、easy/hard 到底差在哪。
LIBERO 130 任务分成 4 个"套件(suite)",每套 10 个任务 × 50 条演示。StarVLA 用一个模型同时训 4 套,每套评 500 次(10任务×50次)。4 套不是难度分级,而是测不同能力维度:
| 套件 | 测什么泛化 | 任务举例 (示意) |
|---|---|---|
| LIBERO-Spatial | 空间关系理解:同样的物体,摆放位置/空间描述变化 | "把碗放在盘子左边/右边"——物体相同,考空间词 |
| LIBERO-Object | 物体泛化:不同物体,相同任务结构 | "拿起牛奶盒"、"拿起番茄酱"——换物体 |
| LIBERO-Goal | 目标泛化:相同物体布局,不同目标 | 同一场景,"打开抽屉" vs "把碗放炉子上"——换目标 |
| LIBERO-Long (LIBERO-10) | 长程组合:需要多个子步骤连续完成 | "把汤碗放炉子上再关抽屉"——长 horizon 多步 |
SimplerEnv 在仿真里复现真机策略表现。关键是两种评测协议(这才是它的"严格度"分级):
| 协议 | 含义 | 严格度 |
|---|---|---|
| Visual Matching (VM) | 仿真渲染刻意贴近真机图像(叠加真实背景纹理),让 sim 尽量对齐 real | 标准 |
| Variant Aggregation (VA) | 系统改变背景/光照/桌面/相机等多种变体后取平均,测鲁棒性 | 更难(近 OOD) |
| 平台 | 任务 |
|---|---|
| Google Robot | Pick Coke Can(抓可乐罐)、Move Near(把A移到B附近)、Open/Close Top/Middle/Bottom Drawer(开关抽屉)、Put in Drawer(放进抽屉) |
| WidowX (Bridge) | Put Carrot on Plate(胡萝卜放盘)、Put Spoon on Tablecloth(勺子放桌布)、Put Eggplant in Basket(茄子放篮)、Stack Green on Yellow Cube(叠方块) |
| Easy (demo_clean) | Hard (demo_randomized) | |
|---|---|---|
| 场景 | 干净、固定背景/光照/桌面 | 域随机化:杂乱物/光照/背景/桌面纹理/语言 5 轴随机 |
| 训练演示量 | 50 条/任务 | 500 条/任务 |
| 考验 | 基础任务学习 | 视觉鲁棒性 / sim2real 泛化 |
约 50 个双臂任务(源码中 49 个去重任务名),一个模型全部训。任务名(源码核对):adjust_bottle、beat_block_hammer、blocks_ranking、click_alarmclock/bell、handover_block/mic、hanging_mug、lift_pot、move_can_pot 等;括号内中文为字面直译(示意):调瓶子、锤子敲块、方块排序、按闹钟/铃、递方块/麦克风、挂杯子、抬锅、移罐子。每任务都有 Clean/ 和 Randomized/ 两个版本。
| 版本 | 本体 / 动作维度 | 任务类型 (源码核对) |
|---|---|---|
| RoboCasa (tabletop) | Fourier GR1 人形(7-DOF双臂+Fourier灵巧手+腰=29-D) | PnP 抓放:PnPBottleToCabinet、PnPCanToDrawer、PnPCupToDrawer、PnPMilkToMicrowave 等(物体→容器) |
| RoboCasa365 | 单臂 Franka PandaOmron(12-D: eef位姿6+夹爪1+底盘4+控制模式1) | 50 任务(18 原子+组合):OpenDrawer、CloseDoor、TurnOffStove、TurnOnMicrowave、TurnOnSinkFaucet、CoffeeSetupMug、NavigateKitchen 等 |
场景写实,3200+ 物体资产 (资产数来自外部文档,未在仓库核对)。GR1 版本(RoboCasa-GR1)用于人形评测。
CALVIN 有 34 个原子任务(开抽屉/推方块/开灯/移滑块/旋转等),核心玩法是连续完成一串任务(5-in-a-row),指标是平均连续完成长度(Avg. Length,满分5)。难度来自环境分割:
| 设置 | 含义 | 难度 |
|---|---|---|
| D→D (task_D_D) | 在 D 环境训、D 环境测 | 基础(同分布) |
| ABC→D | 在 A/B/C 环境训、没见过的 D 环境测 | 难(zero-shot 环境泛化,天然 OOD) |
CALVIN 是"推理时引导"类方法(SuSIE/DISCO/DynaGuide/VLS)的标准测试台。
不同 benchmark 的"分级"含义完全不同,别混淆:
| benchmark | 分级方式 | 分级的本质 |
|---|---|---|
| LIBERO | 4 套件(Spatial/Object/Goal/Long) | 测不同泛化维度,非难度递增 |
| RoboTwin | Easy / Hard | 场景随机化程度(clean vs domain-randomized) |
| SimplerEnv | Visual Matching / Variant Aggregation | 评测严格度(对齐真机 vs 多变体取平均) |
| CALVIN | D→D / ABC→D | 环境是否见过(同分布 vs zero-shot) |
| RoboCasa | tabletop / 365 / Composite-Unseen | 规模与组合泛化 |
| LIBERO-Plus | 7 维 × 5 级梯度 | 扰动强度逐级加大 |
核心观点(Qwen-RobotManip 2026):标准 benchmark 高分已不能证明真泛化。
| 模型 | ID 表现 | OOD 表现 | 说明 |
|---|---|---|---|
| StarVLA | RoboTwin Easy 85.7% | C2R OOD 10.6% | 标准高分 ≠ OOD 泛化 |
| π0.5 | ID 强 | OOD 明显优于无预训练模型 | 预训练在 OOD 体现价值 |
| Qwen-RobotManip | ID 强 | OOD 更强 | 对齐+规模化放大 OOD 能力 |
VLA 训练往往混合多种数据,各司其职、互补而非替代:
| 数据类型 | 教会模型什么 | 代表 |
|---|---|---|
| VLA / 机器人演示 | 核心:从观测到动作的控制映射 | OXE, DROID, Bridge |
| VQA / caption / grounding | 看懂物体/属性/关系/语言 (防 VLM 能力退化) | π0.5, Qwen-RobotManip 用 28M VL 样本 |
| Embodied VL / ECoT | 理解任务进度、下一步该做什么 | Qwen-RobotManip, π0.5 |
| 人类视频 / H2R | 补长尾行为、扩场景多样性 (机器人数据贵) | Qwen-RobotManip 24,808h 合成 |
| 仿真 / 合成 | 便宜扩规模、覆盖长尾、造 OOD | GR00T, LingBot |
| 世界模型 / rollout | 预测未来、虚拟训练、验证动作后果 | CosmosPolicy, World-VLA-Loop |
| 失败 / 偏好数据 | 知道什么是错、怎么选更优动作 | DWYS/SEAL, RECAP |
| 触觉 / 力 | 补视觉看不到的接触状态 (插入/滑移/过力) | ForceVLA, TactileAloha |
StarVLA 作为统一平台,接入了主流 benchmark 做公平对比(每个 benchmark 一个 examples/ 目录 + eval 接口):
训练数据格式: 统一用 LeRobot format
接入的 benchmark:
LIBERO / LIBERO-plus examples/LIBERO/, examples/LIBERO-plus/
SimplerEnv examples/SimplerEnv/
RoboTwin 2.0 examples/Robotwin/
RoboCasa (tabletop/365) examples/Robocasa_tabletop/, Robocasa_365/
CALVIN examples/calvin/
BEHAVIOR-1K examples/Behavior/
DOMINO examples/DOMINO/
VLA-Arena examples/VLA-Arena/
Franka (真机) examples/Franka/
预训练数据: Bridge + Fractal(RT-1) 等 OXE 子集 (见 model_zoo)
每个 benchmark 目录内含数据准备脚本、训练配置(yaml)、评测接口(model2*_interface.py),通过 server-client 架构解耦模型推理与环境评测(详见"训练数据流"tab)。
真机数据是 VLA 学"怎么动"的核心来源。下面是业界主流真机数据集:
| 数据集 | 开源? | 规模 | 机器人 / 特点 |
|---|---|---|---|
| Open X-Embodiment | 开源 | 200万+ 条 / ~9TB | 谷歌联合高校,22 种机器人,跨本体大联盟 |
| DROID | 开源 | 76K+ episodes / 564 场景 | Franka,多实验室分布式采集,多样性极高 |
| BridgeData V2 | 开源 | 60,096 条轨迹 / 24 环境 | UC-Berkeley,WidowX 低成本机器人,语言标注丰富 |
| UMI | 开源 | 2.5万+ 条 | Stanford,基于 UMI 手持夹爪,无需机器人即可采集,腕上眼 |
| RDT | 开源 | 6千+ 条 | 清华,类 ALOHA 双臂操作 |
| RH20T | 开源 | 11万+ 条 | 上交,接触丰富,含视觉+力觉+音频+动作+人类演示 |
| AgiBot World | 开源 | 百万+ 原子动作 | 智元,100 台同构机器人,100+ 场景,含视触觉/六维力/灵巧手 |
| GraspNet-1Billion | 开源 | 97,280 RGB-D 图 / 10亿抓取姿态 | 上交,通用物体抓取基准,88 种日常物品+3D模型 |
| OAKINK2 | 开源 | 627 双手操纵序列 / 401万帧 | 双手物体操纵,Affordance/原语/复杂任务三层抽象 |
| FMB | 开源 | 22,550 条轨迹 | 功能操作基准,多阶段装配(peg插板),Franka,2全局+2腕部视角 |
| 宇树 Unitree | 开源 | — | G1灵巧手/夹爪、Z1双臂操作数据 + 训好的 DP/ACT 模型 |
| π0 dataset | 闭源 | 1万+ 小时 / 7类机器人 68任务 | Physical Intelligence 自采,工业级护城河 |
| GR-2 | 闭源 | 4万+ 条 | 字节,GR-2 训练专采 |
| 平台 | 单位 | 规模/任务 | 特点 |
|---|---|---|---|
| CALVIN | — | 1场景4操作任务,长程 | 语言条件长时序;观测含头部+腕部RGBD+关节+末端+触觉;动作支持绝对/相对末端位姿+夹爪或关节 |
| Meta-World | Farama | 50 任务 | 元强化学习/多任务基准,任务标准化 |
| LIBERO | — | 130 任务(4套件) | 终身学习基准,声明性知识(物体/空间)+过程性知识(动作)迁移 |
| RoboMimic | Stanford/UT Austin | 多套演示 | 从演示学习框架,提供数据集+学习算法 |
| RoboCasa | UT Austin/NVIDIA | 大规模 | 厨房日常任务,高质量人类演示库 |
| Behavior-1K | Stanford 李飞飞 | 1000 任务/8场景 | 基于 Nvidia Omniverse,1900+物体类型,支持柔性体/流体/热效应 |
| VLABench | — | 100 任务(60原语+40复合) | Primitive(1-2维能力) vs Composite(多步推理长程规划) |
| UniDexGrasp/++ | 北大 王鹤 | — | 仿真中基于点云的抓取姿态估计 |
人类视频便宜且丰富,用于补机器人数据的规模和行为多样性(需经 H2R 转换才能变成机器人可学轨迹):
| 数据集 | 规模 | 特点 |
|---|---|---|
| Ego4D | 3600 小时 | 第一视角,9国74地点926人,日常活动,含音频/3D网格/眼动 |
| Ego-Exo4D | 1286.3 小时 | 多模态多视角,13城市740拍摄者,技能性活动,第一+第三视角配对 |
| HowTo100M | 1.36亿视频剪辑/120万YouTube视频 | 教学叙述视频,23k活动(烹饪/手工/园艺/健身) |
| EPIC-KITCHENS | 55 小时/32厨房 | 厨房第一视角,39594动作片段,454158物体框 |
小米机器人团队的内部数据分真机、仿真、人类视频三类,均上云管理(TOS):
| 类别 | 数据集 | 批次命名规则 |
|---|---|---|
| 真机 | M92U 真机数据 | 工站名 + 日期 + 机器人编号 |
| 松灵(Cobot Magic)真机数据 | 日期 + 任务名称 + cobot_magic | |
| AC_one 真机数据 | 日期 + 机器编号 | |
| 仿真 | Curobo 仿真数据(MiUniverse) | curobo + 日期 + 机器型号 |
| MimicGen 仿真数据 | 日期 + libero_aloha + 左右手 + 任务名 + cobot_magic | |
| 人类视频 | 第一人称数据 | 日期 + 批次 + human_video |
智元 AgiBot World 是重要的开源大规模数据集,分三部分:
| 子集 | Episodes | Tasks | 相机 | 类型 |
|---|---|---|---|---|
| AgiBotDigitalWorld | ~49k (48984) | ~6 | 8 | 仿真场景 |
| AgiBotWorld-Alpha | ~18k (18081) | 36 | 8 | 真实场景 |
| AgiBotWorld-Beta | 更大规模 | — | — | 真实场景 |
多相机配置(8路):head(头部) + head_front/left/right_fisheye(前/左/右鱼眼) + back_left/right_fisheye(后左/右鱼眼) + hand_left/right(左右手腕)。
本体数据结构(action/state 各含):effector(执行器: 力/位置) + end(末端: 角速度/朝向/位置/速度/力矩) + joint(关节: 电流/力矩/位置/速度) + robot(底盘: 朝向/速度) + waist(腰部, 真机)。数据需转成 LeRobot 格式训练。
知道一个数据集出自哪个团队,能帮你判断它的风格、质量和适用场景:
| 数据集/平台 | 发布团队/单位 | 定位 |
|---|---|---|
| Open X-Embodiment | Google DeepMind 联合 20+ 高校 | 跨本体开源大联盟,统一 RLDS 格式 |
| DROID | 多实验室联合(Stanford/Berkeley 等) | 分布式采集的 Franka 真机,多样性最高 |
| BridgeData V2 | UC Berkeley (RAIL 实验室) | WidowX 低成本机器人,语言标注丰富 |
| RH20T | 上海交通大学 | 接触丰富,含视觉+力觉+音频多模态 |
| AgiBot World | 智元机器人 (AgiBot) | 百万级人形/双臂,视触觉+六维力 |
| RoboMIND | 国家地方共建具身智能创新中心等 | 大规模多任务真机 |
| LIBERO | UT Austin (Lifelong Robot Learning) | 终身学习基准,4 套件 |
| CALVIN | Freiburg 大学 | 长程语言条件操作 |
| RoboCasa | UT Austin + NVIDIA (Yuke Zhu 团队) | 写实厨房场景 |
| RoboTwin (1.0/2.0) | 上海 AI Lab / 港大等 (RoboTwin 团队) | 数字孪生双臂,含域随机化 |
| SimplerEnv | UC San Diego / Google 等 | 仿真复现真机表现 |
| Meta-World / RLBench | Meta(原) / Farama 维护;帝国理工 | 早期多任务基准 |
| Behavior-1K | Stanford (李飞飞团队) | 1000 任务,Omniverse 仿真 |
| Ego4D / Ego-Exo4D | Meta AI 联合多机构 | 第一视角人类视频 |
| FAST tokenizer | Physical Intelligence | 动作 BPE tokenizer |
拿到数据集不能直接喂模型,每个都有自己的来源、格式和处理坑。下面逐个说清。(源码核对)=本地仓库/论文确认,(调研)=全网调研,(整理)=综合整理。
no_noops,下载即用img[::-1,::-1](旋转180°)摆正惯例。训练/评测朝向必须一致,否则成功率崩到0# 区分三种操作(易混!)
img[::-1] = 上下翻转
img[:, ::-1] = 左右翻转(镜像, 破坏左右语义!)
img[::-1, ::-1] = 旋转180°(双轴反转) ← LIBERO 用这个
delta=action−state, ‖delta‖₂≤1e-3 为 idle;删连续≥5帧的 idle 段┌─────────────────────────────────────────────────────────────────────┐
│ Qwen2.5-VL 内部结构 │
├─────────────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ │
│ │ RGB Image │ │ Text Prompt │ │
│ │ [H, W, 3] │ │ "pick up..." │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Vision Encoder│ │ Tokenizer │ │
│ │ (ViT-600M) │ │ (BPE 152064) │ │
│ │ Patch=14x14 │ └──────┬───────┘ │
│ └──────┬───────┘ │ │
│ ▼ ▼ │
│ ┌──────────────────────────────────────┐ │
│ │ Token Sequence 拼接 │ │
│ │ [img_tokens | text_tokens] │ │
│ │ 形状: [B, L, 2048] │ │
│ └──────────────────┬───────────────────┘ │
│ ▼ │
│ ┌──────────────────────────────────────┐ │
│ │ 36 层 Transformer Decoder │ │
│ │ │ │
│ │ 每层: │ │
│ │ LayerNorm │ │
│ │ Causal Self-Attention (GQA) │ ← 因果掩码 │
│ │ Q: [B,L,2048] K/V: [B,L,2048] │ ← GQA: Q头>KV头 │
│ │ Attn = softmax(QK^T/√d) · V │ │
│ │ Residual + LayerNorm │ │
│ │ FFN (SwiGLU) │ │
│ │ Residual │ │
│ │ × 36 层 │ │
│ │ │ │
│ │ 输出: hidden_states[0..36] │ │
│ │ 每层: [B, L, 2048] │ │
│ └──────────────────┬───────────────────┘ │
└─────────────────────┼───────────────────────────────────────────────┘
▼
GR00T 取: hidden_states[-1] → [B, L, 2048]
PI 取: hidden_states[-36:]→ 36 × [B, L, 2048]
KV Cache 是 Transformer 自回归推理的加速机制。缓存已计算的 K/V 向量,新 token 只需算自己的 Q 与缓存做 attention。
普通推理(无 cache): 有 KV Cache:
Step 1: 算 [t1] 全部 K,V,Q Step 1: 算 [t1] K,V,Q → 存 cache
Step 2: 算 [t1,t2] 全部 K,V,Q Step 2: 只算 [t2] 的 Q, 读 cache
Step 3: 算 [t1,t2,t3] 全部 K,V,Q Step 3: 只算 [t3] 的 Q, 读 cache
→ 每步重算全序列 O(L²) → 每步只算增量 O(L)
使用 KV Cache — 动作 token 是自回归生成的,和 LLM 生成文本一样
不使用 KV Cache — VLM 做单次前向拿 hidden_states,不逐 token 生成
固定 prompt 的 KV Cache 可复用,加速多次推理(prefix caching)
Action tokens → Q
VLM states → K, V
Attn = softmax(Q·K^T/√d)·V
↓
Action tokens 获得
VLM 视觉/语言知识
Action tokens "提问",VLM 提供 "答案"。注意力权重自动选择相关信息。
VLM states [B, L, H]
↓
选取特定 token 位置
↓
features [B, T, H]
↓
MLP → actions
预定义的 action token 位置通过因果注意力已聚合了上下文信息。
[img|txt|<act_start>]
↓ 自回归
[...|<a1>|<a2>|...]
因果注意力让动作
token attend 到
所有前面的 token
没有显式"传递"——动作生成天然看到所有观测。
DiT 在 StarVLA 中用作 Action Head 的去噪网络(GR00T 和 PI 方法)。给定噪声动作 + 时间步 + VLM 条件,预测速度场来去噪。
┌─────────────────────────────────────────────────────────────────┐
│ DiT 内部 (GR00T: 16层, 交替结构) │
├─────────────────────────────────────────────────────────────────┤
│ 输入拼接: [state_token | 32×future_tokens | action_tokens] │
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ 偶数层 (0,2,4...): Cross-Attention │ │
│ │ AdaNorm(hidden, timestep_emb) ← 时间步调制 scale/shift │ │
│ │ Attn(Q=hidden, K=VLM_features, V=VLM_features) │ │
│ │ ↑ action tokens 从 VLM 获取视觉/语言信息 │ │
│ │ FFN (GELU) + Residual │ │
│ ├───────────────────────────────────────────────────────────┤ │
│ │ 奇数层 (1,3,5...): Self-Attention │ │
│ │ AdaNorm(hidden, timestep_emb) │ │
│ │ Attn(Q=K=V=hidden) ← action tokens 间互相推理 │ │
│ │ FFN (GELU) + Residual │ │
│ └───────────────────────────────────────────────────────────┘ │
│ × 16 层 │
│ │
│ 输出: AdaNorm → Linear → 取最后 T 个 → MLP → [B,T,action_dim] │
└─────────────────────────────────────────────────────────────────┘
关键设计:
• AdaNorm: timestep embedding 调制归一化 (不同噪声水平→不同行为)
• 交替结构: cross-attn(取条件) ↔ self-attn(动作间推理)
• future_tokens: 32个可学习"规划槽"给 DiT 额外计算空间
Flow Matching 是 DiT 的训练目标和推理采样算法。定义了"从噪声到动作"的直线路径,训练 DiT 预测该路径的速度场。
# 采样噪声和时间步
noise ~ N(0,1)
t ~ Beta(1.5, 1.0), t∈[0, 0.999]
# 线性插值构造 noisy action
noisy = (1-t)·noise + t·action
# 真实速度 (训练标签)
velocity_true = action - noise
# DiT 预测
velocity_pred = DiT(noisy, t, VLM)
# 损失
loss = MSE(pred, true)
# 从纯噪声出发
action = randn(B, T, 7)
# 4步积分到干净动作
for t in [0, 0.25, 0.5, 0.75]:
v = DiT(action, t, VLM)
action += 0.25 × v
# 最终动作
return action # [B, T, 7]
仅需 4 次 DiT 前向!
| Flow Matching (GR00T/PI) | DDPM Diffusion (CogACT) | |
|---|---|---|
| 噪声过程 | 线性插值 (1-t)·noise + t·action | 高斯马尔可夫链 √ᾱ·x₀ + √(1-ᾱ)·ε |
| 预测目标 | 速度场 v = action - noise | 噪声 ε |
| 推理采样 | Euler ODE (4-10步) | DDPM/DDIM 反向 (10-100步) |
| 步数效率 | 更少步数即可 | 需要更多步 |
| 代码 | GR00T_ActionHeader.py | DiTActionHeader.py |
统一的 HDF5/Parquet 格式存储机器人演示数据。每条样本包含:多视角图像序列、语言指令、动作 chunk、本体感觉状态。通过 YAML 声明式配置混合多个数据集。
build_dataloader(cfg) 构建两路数据:VLA DataLoader(机器人动作数据)和 VLM DataLoader(图文问答数据)。交替喂入模型实现协同训练。
model.compute_loss(tag="vla", batch) → forward() → action_loss
model.compute_loss(tag="vlm", batch) → forward_vlm() → vlm_loss
通过 loss_scale 配置权重(如 vla:1.0, vlm:0.1)防止 VLM 能力遗忘。
AdamW 优化器,支持分组学习率(backbone 低 LR,action head 高 LR)。DeepSpeed ZeRO-2 分片优化器状态和梯度,8×A100 可达 80 samples/s。
模型作为 WebSocket Policy Server 运行,评测/真机通过轻量 Client 交互。predict_action(examples) → unnormalize → 执行。
example = {
"image": [PIL.Image, PIL.Image], # 多视角图像列表
"lang": "pick up the red cup", # 自然语言指令
"action": np.ndarray([T, 7]), # 动作 chunk [时间步, 动作维度]
"state": np.ndarray([1, 7]), # 当前本体感觉(可选)
}
batch = [example_1, example_2, ...] # 批次 = List[dict]
OpenPI 是 Physical Intelligence 官方开源的 π₀/π₀.₅/π₀-FAST 统一仓库。
┌─────────────────────────────────────────────────────────────────┐
│ OpenPI 模型架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ PaliGemma (VLM backbone, 共享) │ │
│ │ ┌─────────────┐ ┌─────────────────────────────────┐ │ │
│ │ │ SigLIP ViT │ │ Gemma-2B LLM (prefix encoder) │ │ │
│ │ │ So400m/14 │ │ 因果注意力, 处理 image+text │ │ │
│ │ │ 224×224→token│ │ tokens │ │ │
│ │ └──────┬──────┘ └────────────────┬────────────────┘ │ │
│ │ └────────────┬───────────────┘ │ │
│ │ ▼ │ │
│ │ prefix_tokens [B, S, 2048] │ │
│ └──────────────────────┬───────────────────────────────────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ π₀ │ │ π₀.₅ │ │ π₀-FAST │ │
│ │ Gemma-300M │ │ Gemma-300M │ │ Gemma-2B (自回归) │ │
│ │ action expert│ │ + adaRMSNorm │ │ FAST token decode │ │
│ │ Flow Match │ │ Flow Match │ │ Next-token predict │ │
│ └─────────────┘ └──────────────┘ └──────────────────────┘ │
│ │
│ 三者共享: VLM backbone (PaliGemma = SigLIP + Gemma-2B) │
│ 区别: Action expert 的结构和训练方式 │
└─────────────────────────────────────────────────────────────────┘
| 模型 | 代码入口 | VLM Backbone | Action Head | 与 π₀ 的区别 |
|---|---|---|---|---|
| π₀ | pi0.pyPi0Config(pi05=False) |
PaliGemma (SigLIP + Gemma-2B) |
Gemma-300M action expert + Flow Matching |
基准模型 |
| π₀.₅ | pi0.pyPi0Config(pi05=True) |
同上 | Gemma-300M + adaRMSNorm + Flow Matching |
① state 作为离散语言 token ② adaRMSNorm 注入 timestep ③ knowledge insulation 训练 |
| π₀-FAST | pi0_fast.py |
同上 | Gemma-2B 自回归 FAST tokenizer |
无 flow matching 动作作为 token 自回归生成 |
关键洞察:π₀ 和 π₀.₅ 共享同一个 Pi0 类,仅通过 pi05=True/False 开关区分。三者都共享 PaliGemma VLM backbone。
结论先行:原始 π₀ 和 π₀.₅ 论文本身都没有仿真实验,主要在真实机器人上验证。后续论文里,π₀ / π₀.₅ 在标准 LIBERO 类 benchmark 上很强;但换到 RoboCasa、RoboTwin、SimplerEnv-OOD、动态或接触丰富任务时,通常需要 world model、future prediction、guidance、tactile/force 或执行修正机制才能稳定超过它们。
π₀ / π₀.₅ 均为真机评测;没有 Isaac / MuJoCo / LIBERO 这类仿真主实验。
LIBERO 上 π₀≈94.2%、π₀.₅≈96.8%,已经是很强的 baseline。
RoboCasa、RoboTwin、SimplerEnv-OOD 中下降明显,是后续方法主要拉开差距的地方。
vision-only π₀/π₀.₅ 往往不足;触觉、力、future consequence guidance 能带来大幅提升。
| 论文 / 模型 | 评测类型 | 任务与平台 | π₀ / π₀.₅ 结果 | 读数 |
|---|---|---|---|---|
| π₀ A Vision-Language-Action Flow Model |
真机;无仿真 | 7 种机器人配置,68 种任务;RGB + proprio + language,无触觉/力 | 在 5 项主要后训练任务上全面超越 OpenVLA、Octo、π₀-small;本地分析未提取统一平均 SR | 奠定 VLM + flow matching action expert 的强 baseline;但不验证仿真泛化。 |
| π₀.₅ Open-World Generalization |
真机;无仿真 | 真实家庭 / mock rooms;移动双臂平台;4 路 RGB,无触觉/力 | items in drawer ≈70%,dishes in sink ≈65%,laundry basket ≈55%,make bed ≈40%;整体显著优于 π₀ / π₀-FAST+Flow | 主打开放世界长时程家务泛化;不是接触丰富精密操作或仿真 benchmark 论文。 |
| 后续论文 | 仿真环境 | π₀ / π₀.₅ 数字 | 后续方法数字 | 结论 |
|---|---|---|---|---|
| GR00T N1 | RoboCasa 20 tasks | π₀:55.6% | GR00T N1:61.6% | π₀ 是强 baseline,但在 RoboCasa 上被双系统 DiT 基础模型小幅超过。 |
| FutureVLA | SimplerEnv Google Robot | π₀:52.7% | FutureVLA-GT:80.1% | 视觉未来预测对 SimplerEnv 有明显增益。 |
| FutureVLA | SimplerEnv WidowX | π₀:20.9% | FutureVLA-GT:71.9% | 跨具身 / 域迁移下,原始 π₀ 明显变弱。 |
| FutureVLA | LIBERO | π₀:94.2% | FutureVLA-GT:98.3% | LIBERO 上 π₀ 已经很强,提升空间主要来自高分段微小增益。 |
| ForeAct | LIBERO Spatial / Object / Goal / Long | π₀:94.2%;π₀.₅:96.8% | ForeAct w/ π₀.₅:97.5% | π₀.₅ 在标准 LIBERO 上非常强;视觉前瞻引导带来小幅 SOTA 提升。 |
| DIAL | RoboCasa GR1 Tabletop 24 tasks | π₀:47.8% | DIAL:70.2% | 人形 / RoboCasa 上,单纯 π₀ 表征传递不足;latent intent/world modeling 更有效。 |
| GigaWorld-Policy | RoboTwin 2.0, 50 tasks | π₀.₅:0.44–0.48 SR | GigaWorld-Policy:0.86;Motus:0.88 | RoboTwin 上 π₀.₅ 明显不是强仿真 baseline,world-model/video-policy 类方法优势大。 |
| Qwen-VLA | SimplerEnv-OOD | π₀.₅:12.6% | Qwen-VLA:32.0% | OOD setting 下 π₀.₅ 成功率很低;大规模异构数据 + RL/SFT 有明显收益。 |
| REMAC | Kinetix 12 dynamic tasks | 基于 π₀ 的 naive async:d=0 为 0.828;d=4 为 0.451 | REMAC:d=0 为 0.888;d=4 为 0.779 | π₀ 类 action chunk 在异步 / 延迟执行下会退化;masked action chunking 修正有效。 |
| KI-VLA | LIBERO-90 / DROID benchmark | π₀-FAST:0.73(LIBERO-90) | KI-VLA:0.815 | 不是 raw π₀/π₀.₅,但说明 π-family 训练中 knowledge insulation 能提升仿真性能和训练效率。 |
| 后续论文 | 评测类型 | π₀ / π₀.₅ 数字 | 增强方法数字 | 结论 |
|---|---|---|---|---|
| ForeAct | 真机 11 tasks,π₀ backbone | π₀:46.7% | ForeAct:87.4% | 视觉前瞻 + action steering 对真实任务提升非常大。 |
| ForeAct | 真机,π₀.₅ backbone | π₀.₅:70.3% | ForeAct w/ π₀.₅:88.2% | π₀.₅ 本身更强,但 inference-time foresight guidance 仍有明显增益。 |
| TouchGuide | 真机接触丰富任务,DP / π₀.₅ | π₀.₅ baseline:35.9% | TouchGuide + π₀.₅:58.0% | vision-only π₀.₅ 在接触任务不稳;触觉对比评分器做推理时 guidance 有效。 |
| TaF-VLA | 真机 8 个力敏感操作任务 | π₀.₅ vision-only:37.1% | TaF-VLA:64.8% | 触觉-力对齐 adapter 对 π₀.₅ 的接触任务增益很大。 |
| GigaWorld-Policy | 真机 PiPER 4 tasks | π₀.₅:0.69 SR | GigaWorld-Policy:0.83 | world-model 预训练提升真机执行质量和数据效率。 |
| Qwen-VLA | 真机 ALOHA | π₀.₅:ID 71.6%;OOD 41.5% | Qwen-VLA:ID 83.6%;OOD 76.9% | π₀.₅ 的 OOD 真机泛化短板明显。 |
| Xiaomi-Robotics-0 | 真机 Lego / Towel Folding | π₀.₅:Lego 97.0%;Towel 0.9 件/min | Xiaomi-Robotics-0:Lego 99.7%;Towel 1.2 件/min | π₀.₅ 在部分高数据/规整真机任务上已经很强;后续模型主要提升延迟和平滑执行。 |
如果论文任务是普通 LIBERO-style tabletop imitation,π₀ / π₀.₅ 是高分强 baseline,单纯超过它们不容易。若任务是接触丰富、OOD、动态物体、跨具身或需要动作后果预测,π₀ / π₀.₅ 作为 vision-only VLA baseline 反而很有价值:已有后续论文显示它们在这些 setting 下会明显退化,而 foresight / world model / tactile-force guidance / execution correction 能系统性补上短板。
本节整理自本地 paper 库:/home/chenzhiyuan/projects/paper/2024-pi0/、2025-pi0.5/、2025-GR00T-N1/、2026-FutureVLA/、2026-ForeAct/、2026-DIAL/、2026-GigaWorld-Policy/、2026-Qwen-VLA/、2026-REMAC/、2026-TouchGuide/、2026-TaF-VLA/。
π₀ 的核心创新是用一个独立的小 Gemma (300M)作为 action expert,而非像 StarVLA-PI 那样用 DiT:
# 输入: prefix(VLM) + suffix(action+state)
# 两个 Gemma 共享注意力:
configs = [gemma_2b, gemma_300m]
# Gemma-2B 处理 prefix (图像+语言)
# Gemma-300M 处理 suffix (动作)
# 两者通过 cross-attention 交互
# Flow matching 部分:
noisy_action = (1-t)·noise + t·action
suffix = [state_embed, noisy_action_embed]
velocity = model(prefix, suffix, t)
loss = MSE(velocity, action - noise)
# 输入: VLM hidden states + noisy action
# DiT 独立架构:
# 每层 DiT cross-attend 到 VLM 层
# Flow matching 部分 (相同):
noisy_action = (1-t)·noise + t·action
action_tokens = ActionEncoder(noisy, t)
velocity = DiT(action_tokens, VLM_states)
loss = MSE(velocity, action - noise)
| 维度 | StarVLA | OpenPI |
|---|---|---|
| 框架语言 | PyTorch (Accelerate + DeepSpeed) | JAX (Flax NNX) 为主 + PyTorch 推理 |
| VLM Backbone | Qwen2.5-VL / Qwen3-VL / Gemma4 / MiniCPM 等 (可替换) | PaliGemma (SigLIP + Gemma-2B) (固定) |
| Action Expert | 独立的 DiT / MLP / FAST tokenizer (cross-attention 连接) | 小 Gemma-300M 与大 Gemma-2B 共享注意力 (prefix-suffix) |
| Flow Matching 实现 | 独立 DiT 网络做去噪 | Action expert Gemma 做去噪 (LLM 即去噪器) |
| VLM→Action 连接 | Cross-attention (KV来自VLM) | Prefix-suffix 注意力 (大小 Gemma 共享 KV space) |
| 模块化程度 | 高 — backbone/head 可独立替换 | 低 — 紧耦合 (PaliGemma 固定) |
| 支持 Backbone 数 | 7+ (Qwen/Gemma/MiniCPM/Florence/Cosmos/Wan) | 1 (PaliGemma) |
| Action Head 种类 | 4 (FAST/OFT/GR00T/PI) | 2 (Flow Matching / FAST) |
| 世界模型支持 | 有 (Wan2.2, CosmoPredict2) | 无 |
| 训练框架 | Accelerate + DeepSpeed ZeRO-2/3 | JAX FSDP (pjit) |
| 多节点训练 | 支持 (256 GPU 验证) | 不支持 (README 明确说明) |
| Benchmark 集成 | 7+ (LIBERO/SimplerEnv/RoboCasa...) | 3 (ALOHA/DROID/LIBERO) |
| 开源权重 | 有 (HuggingFace) | 有 (base model + fine-tuned) |
| 预训练数据 | 不含 (用户自备) | 10K+小时机器人数据预训练 |
| 设计目标 | 研究平台 — 快速原型/对比实验 | 产品级 — 提供强 base model 供微调 |
π₀ 把 action expert 也做成一个小 LLM (Gemma-300M),与 VLM (Gemma-2B) 在同一注意力空间中交互。大小模型共享 token embedding,通过 prefix-suffix 注意力掩码区分角色。Flow matching 的去噪过程就是小 LLM 的前向传播。
优势:架构统一,可利用 LLM 的语言理解做动作推理
劣势:紧耦合,换 backbone 困难
StarVLA 把 VLM 和 Action Head 完全解耦——VLM 输出 hidden states,Action Head (独立的 DiT/MLP/Tokenizer) 通过 cross-attention 消费这些特征。两者通过标准化的张量接口连接。
优势:灵活组合,快速实验不同配置
劣势:cross-attention 是信息瓶颈,可能不如共享注意力紧密
一句话:OpenPI 是"给你一个强 base model 来微调",StarVLA 是"给你一套积木来搭建和对比不同 VLA"。两者定位互补。
| 维度 | FAST | OFT | GR00T | PI (π) |
|---|---|---|---|---|
| 预测方式 | 自回归Token | 并行回归 | 迭代去噪 | 迭代去噪 |
| 动作表示 | 离散Token | 连续值 | 连续值 | 连续值 |
| 损失函数 | Cross-Entropy | L1 | MSE (velocity) | MSE (velocity) |
| VLM条件 | 内嵌在LLM生成中 | 最后层特定位置 | 最后层全序列(所有DiT层共享) | 每层DiT对应不同VLM层(一一映射) |
| 额外参数 | 0 (仅tokenizer) | ~10M (MLP) | ~100M (DiT-B) | ~300M (N层DiT) |
| 推理步数 | O(T×tokens/step) | 1 步 | 4-10 步 | 4-10 步 |
| 多模态分布 | 有限 | 单峰 | 支持 | 支持 |
| LIBERO Avg | 95.4% | 96.6% | 96.5% | 95.7% |
| 适用场景 | 语言-动作联合 | 低延迟/数据效率 | 通用 | 精确操作 |
| 外部方法 | StarVLA 对应 | 核心替换 | 效果对比 |
|---|---|---|---|
| OpenVLA-OFT | QwenOFT | Prismatic-7B → Qwen-VL-4B | 96.6% vs 97.1% (但仅1/6步数) |
| π₀ | QwenPI | PaliGemma → Qwen-VL | 95.7% vs 85.5% |
| GR00T N1.5 | QwenGR00T | Eagle-2 → Qwen-VL | 96.5% vs 86.5% |
| π₀-FAST | QwenFast | PaliGemma → Qwen-VL | 95.4% vs 85.5% |
| Cosmos Policy | WanPI / CosmoPredict2PI | 世界模型做backbone | 实验进行中 |
| 方法 | LIBERO Avg | SimplerEnv WidowX | RoboCasa-GR1 | RoboTwin 2.0 |
|---|---|---|---|---|
| StarVLA-OFT | 96.6% | 64.6% | 48.8% | 87.3% |
| StarVLA-GR00T | 96.5% | 65.3% | 47.8% | 88.5% |
| StarVLA-π | 95.7% | - | - | 88.8% |
| GR00T N1.5 | 86.5% | 61.9% | 47.6% | - |
| OpenVLA-OFT | 97.1% | - | - | - |
数据来源:StarVLA 论文各 benchmark 的 Training setup 小节(LIBERO/SimplerEnv/RoboCasa/RoboTwin 2.0)。用 accelerate + DeepSpeed 分布式训练。
| Benchmark | 训练 GPU | 分布式 | per-device batch | 优化步数 |
|---|---|---|---|---|
| LIBERO | 8× A100 | DeepSpeed ZeRO-2 | 16 | 100K(约 30K 即达好结果,每 10K 存 ckpt) |
| SimplerEnv (WidowX) | 8× A100 | DeepSpeed ZeRO-2 | 16 | 最多 100K |
| RoboCasa-GR1 | 8× A100 | DeepSpeed ZeRO-2 | 16 | 最多 100K |
| RoboTwin 2.0 | 48× A100 | DeepSpeed ZeRO-2 | 4 | —(多任务、5万+轨迹,开销最大) |
| 你的资源 | 可行做法 |
|---|---|
| 单卡 24GB(3090/4090) | 小 batch + 梯度累积跑 LIBERO 单套件冒烟;优先 OFT(额外参数最少、单步推理),或冻结 VLM 只训 action head |
| 单卡 48–80GB(A6000/A100) | 可训 LIBERO 单套件;4B VLM + LoRA/部分冻结可控显存 |
| 8× A100(论文标配) | 完整复现 LIBERO/SimplerEnv/RoboCasa 全套 |
| 多节点(48 卡级) | RoboTwin 2.0 这类多任务大数据 benchmark |
注:显存主要由 VLM backbone 规模(3–4B)+ action head(OFT ~10M / GR00T ~100M / PI ~300M)+ batch + 是否冻结 VLM 决定。上表右列为按论文配置与常规经验的推断,非论文原文,故标 🩷。