《VLA 系列》LingBot-VLA | 2 万小时真机数据 | 深度表征蒸馏 | 论文与源码解析
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 路线做成可扩展、可训练、可迁移的完整系统。
论文与官方资料:
- 论文:A Pragmatic VLA Foundation Model
- 项目主页:LingBot-VLA
- 源码:Robbyant/lingbot-vla
- 模型与数据集合:Hugging Face Collection
- 真机基准:GM-100
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+H−1],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 被分为三个块:
- 图像与语言块负责场景、物体和任务语义
- 状态块表示当前机器人姿态
- 动作块包含 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=1∑NSmoothL1(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)−u∗∥22]
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、完整训练流
- 将各机器人数据转换为 LeRobot v3,每个数据集通过 YAML 映射状态、动作和三路相机字段。
- 根据数据 FPS 为当前帧取未来 50 步动作,必要时把关节位置转换为相对当前状态的增量。
- 图像缩放到 224 × 224 224\times224 224×224,语言最多保留 72 个 token,状态与动作补齐到 75 维,同时生成有效关节掩码。
- 理解专家编码三路图像和语言,动作专家接收状态、带噪动作和 Flow Matching 时间。
- 双专家逐层共享注意力,动作头预测 50 步速度场,只在有效关节维度上计算动作损失。
- 深度版本额外运行冻结 teacher,并把深度对齐损失加到总损失;无深度版本完全跳过这条支路。
- 训练入口使用 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 积分 |
| 深度蒸馏 | TaskTokenDepthHead、depth_emb_forward |
用查询 token 对齐冻结深度 teacher 表征 |
| 统一本体维度 | VLADataset、VLADataTransform |
字段映射、归一化、动作切片、补齐与掩码 |
| 训练入口 | train_lingbotvla.py |
构建数据、teacher、FSDP2、优化器与 checkpoint |
| 真机部署 | LingBotVlaInferencePolicy、LingbotVLAServer |
加载权重、预处理、预测动作块并通过 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,真实机器人还需要自行实现与控制器、相机和安全系统的对接。
如果只是验证代码是否跑通,建议按下面顺序降低风险:
- 先下载无深度 4B checkpoint,用少量 LeRobot v3 数据执行开环评测,核对字段、归一化和动作方向
- 再在 RoboTwin 示例任务上做小规模后训练,检查 50 步动作切片和仿真控制频率
- 确认无深度版闭环稳定后,再加入深度 teacher,避免同时排查数据与蒸馏问题
- 真机部署先缩小动作范围和执行块长度,并加入急停、限位、碰撞检测和人工接管
LingBot-VLA 的价值主要有三点。第一,它证明多本体真机数据继续扩展仍能给 4B VLA 带来稳定平均收益;第二,它把统一数据映射、分布式训练、深度蒸馏和部署接口放进同一开源仓库,工程完整度高于只发布模型结构的工作;第三,训练期深度蒸馏避免了部署端增加深度传感器与 teacher 推理开销。
限制也同样清楚。GM-100 最好完整成功率约 17%,距离无人值守还很远;评测集中在固定底座的桌面双臂操作,单臂、移动操作和更长时序任务仍需验证;深度增益在不同本体上不一致;完整 2 万小时数据没有公开,因此社区更容易复现后训练,而不是从零复现基座模型。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)