LingBot-VLA 面对的是 VLA 落地时最现实的一组矛盾:单一本体数据容易做出局部效果,却很难覆盖不同机器人;把多本体数据直接混在一起,又会遇到相机、关节维度、动作空间和数据质量不一致的问题。作者没有引入更复杂的世界模型,而是沿着数据规模、统一动作表示、训练效率和空间表征四条线推进,最终训练出一个约 4B 参数的通用双臂 VLA。

这篇工作的核心可以概括为四点:

  • 预训练数据约 2 万小时,来自 9 种常见双臂机器人配置,并统一成三路 RGB、语言、本体状态和连续动作块;
  • 模型采用 Qwen2.5-VL 理解专家与轻量动作专家组成的 Mixture-of-Transformers,动作端用 Flow Matching 一次生成 50 步连续控制;
  • 深度版本在训练期向冻结的单目深度模型蒸馏空间表征,推理期不需要深度图,也不需要继续运行深度 teacher;
  • 在 GM-100 真机测试和 RoboTwin 2.0 仿真测试中均优于论文采用的基线,同时训练吞吐相对现有 VLA 代码库提高约 1.5 到 2.8 倍。

在这里插入图片描述

上图把这项工作的重点放在了一张图里。左侧是 9 种本体和约 2 万小时真机数据,中间是视觉语言专家与动作专家,右侧是真机和仿真结果。理解 LingBot-VLA 时,最重要的不是把它当成一种全新的生成范式,而是看它如何把已有 VLA 路线做成可扩展、可训练、可迁移的完整系统。

论文与官方资料:

1、从多本体数据到统一 VLA

LingBot-VLA 的出发点很直接。机器人学习需要足够大的真机数据,但不同团队采集的数据很少天然兼容。相机名字不同、关节自由度不同、动作可能是绝对位置或增量,甚至同一个字段在不同数据集里含义也不同。如果只把文件放进同一个目录,模型学到的未必是可迁移能力,更多时候只是数据接口的混乱。

在这里插入图片描述

论文汇总了 AgiBot G1、AgileX、Galaxea R1Lite、Galaxea R1Pro、Realman RS-02、Leju KUAVO 4 Pro、Qinglong、ARX Lift2 和双臂 Franka 等 9 种配置。数据以桌面双臂操作为主,通常包含一个头部或前视相机和两个腕部相机。人工先把长轨迹切成原子动作,去掉起止处静止帧,再由 Qwen3-VL-235B-A22B 生成任务与子任务描述,最后人工修订。

论文中的原子动作词云也说明了数据分布并不均匀。

在这里插入图片描述

高频动作集中在抓取、放置、打开等常见模式,但测试集约一半原子动作不在训练集最高频的 100 类动作中。这里不能简单理解为严格的零样本测试,因为低频长尾动作仍可能在其他描述或组合任务里出现。更稳妥的结论是,评测没有只复用最常见的训练动作模板。

1.1、模型、teacher 与输出之间的关系

组件 输入 输出 训练与推理中的作用
Qwen2.5-VL 理解专家 三路 RGB 与任务语言 视觉语言 token 训练和推理都保留
动作专家 视觉语言表征、本体状态、带噪动作、生成时间 动作速度场 训练和推理都保留
深度 teacher 训练图像 深度 token 仅深度版训练使用,参数冻结
深度对齐头与查询 token VLM 特征 空间表征 深度版保留在模型中,推理不需要 teacher
Flow Matching 求解器 高斯噪声与条件特征 50 步连续动作块 推理默认做 10 次 Euler 更新

LingBot-VLA 是 VLA,不是 World Model,也不是 World-Action Model。它没有预测未来图像或未来 latent 再把预测结果接到动作生成链路。深度分支提供的是训练期空间表征监督,目标是让当前图像编码更懂几何,而不是模拟未来环境。

2、模型架构:共享注意力的双专家网络

设机器人真实控制时刻为 t t t,模型的观测可以写成:

O t = [ I t 1 , I t 2 , I t 3 , L , s t ] O_t=\left[I_t^1,I_t^2,I_t^3,L,s_t\right] Ot=[It1,It2,It3,L,st]

I t 1 , I t 2 , I t 3 I_t^1,I_t^2,I_t^3 It1,It2,It3 分别是前视和两路腕部 RGB, L L L 是语言指令, s t s_t st 是机器人本体状态。三路图像在官方配置中缩放到 224 × 224 224\times224 224×224。模型输出长度为 H = 50 H=50 H=50 的连续动作块:

A t = [ a t , a t + 1 , … , a t + H − 1 ] , H = 50 A_t=\left[a_t,a_{t+1},\ldots,a_{t+H-1}\right],\qquad H=50 At=[at,at+1,,at+H1],H=50

这里 a t a_t at 是一个控制步的动作向量,具体维度由机器人映射配置决定。代码先把有效状态和动作映射到统一特征空间,再补齐到最大 75 维。补齐位置不会参与损失,因此 75 维只是批处理容器,不代表每台机器人都有 75 个有效关节。

2.1、Mixture-of-Transformers 如何融合两个专家

理解专家使用 Qwen2.5-VL-3B-Instruct,动作专家使用较小的 Qwen2 Transformer。两条分支拥有不同的参数和隐藏维度,但每一层通过联合自注意力交换信息。这样做比把动作 token 直接塞进同一个大 VLM 更灵活,也便于对动作专家采用不同精度和并行策略。

输入 token 被分为三个块:

  1. 图像与语言块负责场景、物体和任务语义
  2. 状态块表示当前机器人姿态
  3. 动作块包含 50 个带噪连续动作 token

块内采用双向注意力,块之间保持因果关系。动作可以读取图像、语言和状态,状态不会反过来污染前面的视觉语言编码。推理时图像与语言前缀保持不变,因此源码会先计算并缓存这一部分的 KV,后续每次去噪只更新状态与动作后缀。

2.2、深度蒸馏到底蒸馏了什么

深度版本并不把深度图作为第四路相机输入。训练时,Qwen2.5-VL-3B、MoGe-2 和 LingBot-Depth 组成冻结的 teacher 侧,为 RGB 图像产生深度相关 token。student 侧在每个视角插入 8 个可学习查询 token,再用 cross-attention 对齐 teacher 表征。

可以把深度损失简化为:

L d e p t h = 1 N ∑ i = 1 N SmoothL1 ⁡ ( P i , D i ) \mathcal{L}_{\mathrm{depth}}= \frac{1}{N}\sum_{i=1}^{N} \operatorname{SmoothL1}\left(P_i,D_i\right) Ldepth=N1i=1NSmoothL1(Pi,Di)

N N N 是有效深度 token 数量, P i P_i Pi 是 student 的投影结果, D i D_i Di 是冻结 teacher 输出并经过 detach 的目标。当前开源配置把这项损失权重设为 0.004 0.004 0.004,总目标为:

L = L F M + 0.004 L d e p t h \mathcal{L}=\mathcal{L}_{\mathrm{FM}}+0.004\mathcal{L}_{\mathrm{depth}} L=LFM+0.004Ldepth

论文正文将对齐项概括为 L1,当前查询模式代码实际调用 SmoothL1。这是复现时需要注意的实现差异。teacher 全程无梯度,部署代码也不加载 MoGe-2 或 LingBot-Depth。因此推理只需要 RGB、语言和本体状态,不需要外部深度相机,也不需要在线生成深度图。

3、训练与推理:连续动作如何从噪声产生

3.1、Flow Matching 训练目标

论文把真实动作 A t A_t At 与高斯噪声 ϵ \epsilon ϵ 在生成时间 τ \tau τ 上插值:

A t , τ = τ A t + ( 1 − τ ) ϵ , τ ∈ [ 0 , 1 ] A_{t,\tau}=\tau A_t+(1-\tau)\epsilon,\qquad \tau\in[0,1] At,τ=τAt+(1τ)ϵ,τ[0,1]

t t t 是机器人真实控制时间, τ \tau τ 是生成模型内部的去噪时间,两者不能混为一谈。 A t , τ A_{t,\tau} At,τ 与完整动作块形状相同, τ = 0 \tau=0 τ=0 时接近纯噪声, τ = 1 \tau=1 τ=1 时到达真实动作。动作专家预测速度场:

u ∗ = A t − ϵ u^*=A_t-\epsilon u=Atϵ

L F M = E [ ∥ v θ ( A t , τ , τ , O t ) − u ∗ ∥ 2 2 ] \mathcal{L}_{\mathrm{FM}}= \mathbb{E}\left[ \left\|v_\theta(A_{t,\tau},\tau,O_t)-u^*\right\|_2^2 \right] LFM=E[vθ(At,τ,τ,Ot)u22]

v θ v_\theta vθ 是动作专家, O t O_t Ot 是三路图像、指令和状态组成的条件, u ∗ u^* u 是沿插值路径的目标速度。真机预训练配置使用 MSE,RoboTwin 配置使用 L1,因此只说整个项目固定使用某一种损失并不准确。

源码选择了反向等价的时间方向:

x_t = time_expanded * noise + (1 - time_expanded) * actions
u_t = noise - actions
v_t = self.action_out_proj(suffix_out)
losses = F.mse_loss(u_t, v_t, reduction="none")

这里 time=1 对应噪声,time=0 对应真实动作,目标速度的符号也随之反转。推理积分从 1 走到 0,步长为负,所以最终轨迹与论文从噪声走向动作的定义一致。这不是算法变化,只是参数化方向不同。

3.2、完整训练流

  1. 将各机器人数据转换为 LeRobot v3,每个数据集通过 YAML 映射状态、动作和三路相机字段。
  2. 根据数据 FPS 为当前帧取未来 50 步动作,必要时把关节位置转换为相对当前状态的增量。
  3. 图像缩放到 224 × 224 224\times224 224×224,语言最多保留 72 个 token,状态与动作补齐到 75 维,同时生成有效关节掩码。
  4. 理解专家编码三路图像和语言,动作专家接收状态、带噪动作和 Flow Matching 时间。
  5. 双专家逐层共享注意力,动作头预测 50 步速度场,只在有效关节维度上计算动作损失。
  6. 深度版本额外运行冻结 teacher,并把深度对齐损失加到总损失;无深度版本完全跳过这条支路。
  7. 训练入口使用 FSDP2、混合精度、FlexAttention 和 torch.compile,按数据集记录损失并保存分布式 checkpoint,随后可转换为 Hugging Face 格式。

论文给出的吞吐提升是整个多 GPU 作业的聚合吞吐,不是单卡吞吐。当前 README 专门修正了早期图表中容易误读的 per-GPU 标注。不同 VLM、GPU 数量和并行配置下,官方报告相对其他 VLA 代码库约 1.5 到 2.8 倍加速,不能把某一个峰值直接套到所有配置。

在这里插入图片描述

3.3、推理流与真实执行

推理阶段先编码不变的图像和语言前缀,再缓存 KV:

_, past_key_values = self.qwenvl_with_expert_model(
    prefix_embs=[prefix_embs, None],
    prefix_pad_masks=[prefix_pad_masks, None],
    fill_kv_cache=True,
)

while time >= -dt / 2:
    v_t = self.predict_velocity(x_t, time, past_key_values, ...)
    x_t += dt * v_t

默认部署配置做 10 次 Euler 更新,README 也建议在更重视速度时尝试 5 步。每次生成 50 个动作,但服务器默认只返回并执行前 25 步,然后基于新观测重新规划。动作块长度、实际执行长度和去噪步数是三个不同概念。

用双臂机器人制作吐司三明治举例。模型收到前视和左右腕部 RGB、任务文本 make a toast sandwich 以及当前双臂关节状态。理解专家定位面包、配料与两只夹爪,动作专家从噪声生成未来 50 步双臂动作。控制器执行前 25 步后重新拍摄图像,如果左手已经固定面包而右手尚未抓稳配料,下一次动作块会基于新状态调整。深度版在这个过程中仍只读取 RGB,不会额外调用深度 teacher。

4、源码解析:论文概念在仓库中的落点

4.1、与方法直接相关的目录

lingbot-vla/
├── configs/
│   ├── robot_configs/robotwin.yaml
│   └── vla/
│       ├── real_load20000h.yaml
│       ├── real_load20000h_depth.yaml
│       └── robotwin_load20000h.yaml
├── lingbotvla/
│   ├── data/vla_data/
│   │   ├── base_dataset.py
│   │   └── transform.py
│   ├── models/vla/pi0/
│   │   ├── modeling_lingbot_vla.py
│   │   └── qwenvl_in_vla.py
│   ├── models/vla/vision_models/align_heads/depth_head.py
│   └── schedulers/flow_match.py
├── tasks/vla/train_lingbotvla.py
├── deploy/
│   ├── lingbot_vla_policy.py
│   └── websocket_policy_server.py
├── scripts/open_loop_eval.py
└── experiment/robotwin/README.md

4.2、论文模块与源码映射

论文概念 文件、类或函数 实际作用
双专家 MoT QwenvlWithExpertModel 初始化 Qwen2.5-VL 与 Qwen2 action expert,逐层联合注意力
图像语言前缀 FlowMatching.embed_prefix 编码三路图像、文本和可选深度查询 token
状态与动作后缀 FlowMatching.embed_suffix 投影状态、带噪动作和生成时间
Flow Matching 训练 FlowMatching.forward 采样时间和噪声,插值动作并计算速度场损失
去噪动作生成 FlowMatching.sample_actions 缓存前缀 KV,循环预测速度并执行 Euler 积分
深度蒸馏 TaskTokenDepthHeaddepth_emb_forward 用查询 token 对齐冻结深度 teacher 表征
统一本体维度 VLADatasetVLADataTransform 字段映射、归一化、动作切片、补齐与掩码
训练入口 train_lingbotvla.py 构建数据、teacher、FSDP2、优化器与 checkpoint
真机部署 LingBotVlaInferencePolicyLingbotVLAServer 加载权重、预处理、预测动作块并通过 WebSocket 服务
开环检查 scripts/open_loop_eval.py 计算未归一化动作的 MSE、MAE 并绘制预测曲线

模型前向的核心并不复杂。LingbotVlaPolicy.forward 先构造关节掩码,调用 Flow Matching 主体,再加入可选深度损失:

loss_vla, loss_depth = self.model(
    images, image_masks, lang_tokens, lang_masks,
    states, actions, joint_mask=joint_mask,
    depth_tokens=depth_tokens,
)
loss = loss_vla + loss_depth

动作补齐位置由 joint_mask 排除,不会因为多本体统一成 75 维而产生虚假监督。深度目标在 teacher 侧无梯度,推理接口也没有 depth_tokens 输入,这与论文提出的训练期蒸馏、推理期零额外传感器开销相符。

4.3、数据映射是跨本体复现的关键

仓库没有假设所有数据集字段相同,而是通过机器人 YAML 把原始特征切片到统一名称。一个简化配置可以写成:

state:
  left_arm: [observation.state, 0, 7]
  right_arm: [observation.state, 7, 14]
action:
  left_arm: [action, 0, 7]
  right_arm: [action, 7, 14]
images:
  head: observation.images.head
  left_wrist: observation.images.left_wrist
  right_wrist: observation.images.right_wrist

切片只是第一步。还要使用与 checkpoint 一致的归一化统计,并确认配置是否启用 delta joint action。VLADataset.get_delta_timestamps 会根据每个数据集的 FPS 取 50 个未来动作,所以不同控制频率下,50 步覆盖的物理时间并不相同。仓库统一的是动作块步数,不是强行把所有机器人重采样成同一个物理时长。

5、实验结果:真机、仿真与数据扩展

5.1、GM-100 真机基准

GM-100 包含 4 种机器人平台、100 个桌面任务、约 3.9 万条专家示范和 2.25 万次评测。四个平台是 AgileX、AgiBot G1、Galaxea R1Pro 与 Leju KUAVO 4 Pro,测试时底座固定。每个任务和机器人组合做 15 次试验,单次时限 3 分钟;连续 3 个子任务失败或发生安全事件也会结束。

指标包含完整成功率 SR 和子任务进度 PS。SR 只有在时限内完成全部任务才计 1,PS 则按依次完成的子任务检查点比例计算。后者能区分完全没动和已经做完大半但最终失败的轨迹。

方法 平均 SR 平均 PS
WALL 3.85 10.70
GR00T N1.6 7.31 16.66
π 0.5 \pi_{0.5} π0.5 13.00 27.32
LingBot-VLA 无深度 16.20 34.32
LingBot-VLA 深度版 16.87 35.16

在这里插入图片描述

深度版平均结果更高,但并非每个平台都更好。它在 AgileX 和 Galaxea 上提升明显,在 AgiBot 与 Leju 上反而略低。这意味着深度蒸馏不是稳定的免费增益,也提示几何 teacher、相机视角和本体数据分布之间仍有匹配问题。另一个不能忽略的事实是,最好模型的完整成功率仍只有 16.87,说明开放式真机长任务距离可靠部署还有明显差距。

5.2、RoboTwin 2.0 场景随机化

仿真实验选择 50 个任务。标准场景每个任务使用 50 条示范,共 2500 条;随机化场景每个任务使用 500 条,共 2.5 万条,并改变背景、杂物、桌面高度和光照。

方法 标准场景成功率 随机场景成功率
π 0.5 \pi_{0.5} π0.5 82.74 76.76
LingBot-VLA 无深度 86.50 85.34
LingBot-VLA 深度版 88.56 86.68

在这里插入图片描述

随机化后, π 0.5 \pi_{0.5} π0.5 下降 5.98 个百分点,LingBot-VLA 深度版下降 1.88 个百分点。这个结果支持预训练和空间蒸馏增强视觉变化鲁棒性的判断,但它仍是仿真内随机化,不等同于从仿真直接零样本迁移到真机。

5.3、规模扩展还没有饱和

作者在 25 个真机任务上把预训练数据从 3000 小时逐步增加到 6000、13000、18000 和 20000 小时。平均 SR 与 PS 总体持续上升,末端没有明显饱和。

在这里插入图片描述

在这里插入图片描述

需要注意,部分单平台曲线在中间规模并不单调,稳定上升的是聚合趋势。这个实验只改变数据量,尚不足以推出参数规模、算力和数据规模之间的完整 scaling law。更准确的说法是,在作者当前 4B 模型与数据配方下,继续增加预训练小时数仍然有收益。

数据效率实验又取 AgiBot G1 上的 8 个任务做后训练。LingBot-VLA 每任务 80 条示范时,SR 为 43.3,PS 为 63.7; π 0.5 \pi_{0.5} π0.5 每任务 130 条时,SR 为 38.0,PS 为 58.7。

在这里插入图片描述

这说明预训练确实降低了后训练示范需求,但比较范围只有 8 个任务,不能外推为所有机器人都能固定减少多少数据。

6、论文与当前开源实现的差异

项目 论文设定 当前仓库与复现注意事项
真机平台数量 主要表格包含 4 个平台 Figure 1 图注仍写 3 种本体,属于论文修订残留;当前 commit 已加入 Leju 相关内容
深度损失 正文概括为 L1 对齐 查询模式代码使用 SmoothL1,release 配置权重为 0.004
Flow Matching 时间 从噪声时间 0 积分到动作时间 1 代码从 1 积分到 0,并同步翻转目标速度符号,数学上等价
动作损失 论文给出统一 Flow Matching 目标 真机配置默认 MSE,RoboTwin 配置默认 L1
吞吐口径 8 GPU 等配置给出 samples/s README 已明确图中数字是所有 GPU 的总吞吐,不是每 GPU
数据格式 论文描述统一多本体数据 当前代码已经迁移到 LeRobot v3,2026 年 5 月前下载的 checkpoint 可能需重新下载
评测脚本 论文报告 GM-100 与 RoboTwin 仓库有 RoboTwin、LIBERO 和开环评测入口;在所检查 commit 中未找到完整 GM-100 真机评测脚本与 2.25 万次 rollout
预训练复现 报告约 2 万小时内部真机数据 权重和训练代码已公开,但完整 2 万小时数据配方未公开,无法仅凭仓库从零复现论文预训练

这里最关键的边界是代码开源不等于实验全量可复现。公开权重足以做后训练和部署研究,RoboTwin 示例也提供了较完整的路径;若要复现 2 万小时预训练、GM-100 全部真机试验和论文吞吐曲线,还需要作者未公开的数据、硬件集群和机器人基础设施。

7、最小复现与工程判断

官方环境要求为 Python 3.12.3、PyTorch 2.8.0 和 CUDA 12.8。最小安装流程是:

git clone https://github.com/Robbyant/lingbot-vla.git
cd lingbot-vla
bash install.sh
python3 scripts/download_hf_model.py \
  --repo_id robbyant/lingbot-vla-4b \
  --local_dir lingbot-vla-4b

后训练需要把数据转换到 LeRobot v3,准备机器人字段映射和归一化统计,再选择 robotwin_load20000h.yaml 或对应深度配置运行 train.sh。深度版训练还要下载 Qwen2.5-VL-3B-Instruct、MoGe-2 和 LingBot-Depth。部署入口是 deploy/websocket_policy_server.py,真实机器人还需要自行实现与控制器、相机和安全系统的对接。

如果只是验证代码是否跑通,建议按下面顺序降低风险:

  1. 先下载无深度 4B checkpoint,用少量 LeRobot v3 数据执行开环评测,核对字段、归一化和动作方向
  2. 再在 RoboTwin 示例任务上做小规模后训练,检查 50 步动作切片和仿真控制频率
  3. 确认无深度版闭环稳定后,再加入深度 teacher,避免同时排查数据与蒸馏问题
  4. 真机部署先缩小动作范围和执行块长度,并加入急停、限位、碰撞检测和人工接管

LingBot-VLA 的价值主要有三点。第一,它证明多本体真机数据继续扩展仍能给 4B VLA 带来稳定平均收益;第二,它把统一数据映射、分布式训练、深度蒸馏和部署接口放进同一开源仓库,工程完整度高于只发布模型结构的工作;第三,训练期深度蒸馏避免了部署端增加深度传感器与 teacher 推理开销。

限制也同样清楚。GM-100 最好完整成功率约 17%,距离无人值守还很远;评测集中在固定底座的桌面双臂操作,单臂、移动操作和更长时序任务仍需验证;深度增益在不同本体上不一致;完整 2 万小时数据没有公开,因此社区更容易复现后训练,而不是从零复现基座模型。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐