《VLA系列》TurboVLA 技术解读:用直接 V+L→A 路径实现实时机器人控制

TurboVLA 技术解读:用直接 V+L→A 路径实现实时机器人控制

关键 :TurboVLA 并非把大语言模型简单缩小,而是移除了"大型生成式语言模型作为视觉到动作中枢"的路径。它用 DINOv3、BERT、轻量双向跨模态交互和 ACT 动作解码器,直接完成 V + L → A V+L\rightarrow A V+L→A,在执行级操作中换取更低时延和显存占用。

1. 整体框架

如下图所示,TurboVLA的结构图。

  1. 输入: 多视角图像、文字指令和机器人当前状态分别进入 DINOv3、BERT 与状态 MLP。
  2. 融合: 图中央的双向 cross-attention 交叉注意力 让视觉定位与指令相关的区域,也让指令结合当前场景完成 grounding。
  3. 输出: 融合 token 与状态 token 交给 ACT decoder,并行预测未来 H H H 步连续动作。

其对应的抽象计算流程如下:
#mermaid-svg-LrKj1esd9mrlFWv2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LrKj1esd9mrlFWv2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LrKj1esd9mrlFWv2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LrKj1esd9mrlFWv2 .error-icon{fill:#552222;}#mermaid-svg-LrKj1esd9mrlFWv2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LrKj1esd9mrlFWv2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LrKj1esd9mrlFWv2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LrKj1esd9mrlFWv2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LrKj1esd9mrlFWv2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LrKj1esd9mrlFWv2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LrKj1esd9mrlFWv2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LrKj1esd9mrlFWv2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LrKj1esd9mrlFWv2 .marker.cross{stroke:#333333;}#mermaid-svg-LrKj1esd9mrlFWv2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LrKj1esd9mrlFWv2 p{margin:0;}#mermaid-svg-LrKj1esd9mrlFWv2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LrKj1esd9mrlFWv2 .cluster-label text{fill:#333;}#mermaid-svg-LrKj1esd9mrlFWv2 .cluster-label span{color:#333;}#mermaid-svg-LrKj1esd9mrlFWv2 .cluster-label span p{background-color:transparent;}#mermaid-svg-LrKj1esd9mrlFWv2 .label text,#mermaid-svg-LrKj1esd9mrlFWv2 span{fill:#333;color:#333;}#mermaid-svg-LrKj1esd9mrlFWv2 .node rect,#mermaid-svg-LrKj1esd9mrlFWv2 .node circle,#mermaid-svg-LrKj1esd9mrlFWv2 .node ellipse,#mermaid-svg-LrKj1esd9mrlFWv2 .node polygon,#mermaid-svg-LrKj1esd9mrlFWv2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LrKj1esd9mrlFWv2 .rough-node .label text,#mermaid-svg-LrKj1esd9mrlFWv2 .node .label text,#mermaid-svg-LrKj1esd9mrlFWv2 .image-shape .label,#mermaid-svg-LrKj1esd9mrlFWv2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-LrKj1esd9mrlFWv2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LrKj1esd9mrlFWv2 .rough-node .label,#mermaid-svg-LrKj1esd9mrlFWv2 .node .label,#mermaid-svg-LrKj1esd9mrlFWv2 .image-shape .label,#mermaid-svg-LrKj1esd9mrlFWv2 .icon-shape .label{text-align:center;}#mermaid-svg-LrKj1esd9mrlFWv2 .node.clickable{cursor:pointer;}#mermaid-svg-LrKj1esd9mrlFWv2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LrKj1esd9mrlFWv2 .arrowheadPath{fill:#333333;}#mermaid-svg-LrKj1esd9mrlFWv2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LrKj1esd9mrlFWv2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LrKj1esd9mrlFWv2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LrKj1esd9mrlFWv2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LrKj1esd9mrlFWv2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LrKj1esd9mrlFWv2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LrKj1esd9mrlFWv2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LrKj1esd9mrlFWv2 .cluster text{fill:#333;}#mermaid-svg-LrKj1esd9mrlFWv2 .cluster span{color:#333;}#mermaid-svg-LrKj1esd9mrlFWv2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LrKj1esd9mrlFWv2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LrKj1esd9mrlFWv2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-LrKj1esd9mrlFWv2 .icon-shape,#mermaid-svg-LrKj1esd9mrlFWv2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LrKj1esd9mrlFWv2 .icon-shape p,#mermaid-svg-LrKj1esd9mrlFWv2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LrKj1esd9mrlFWv2 .icon-shape .label rect,#mermaid-svg-LrKj1esd9mrlFWv2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LrKj1esd9mrlFWv2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LrKj1esd9mrlFWv2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LrKj1esd9mrlFWv2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 多视角 RGB 观测
DINOv3: Patch Tokens
自然语言指令
BERT: Text Tokens
视觉投影 + 位置/视角编码
文本线性投影
6 层双向 V-L Cross Attention
机器人状态
MLP -> 2 个 State Tokens
拼接 V/L Tokens
3 层 ACT Decoder
H 个连续动作

1.1 视觉分支:保留空间与视角信息

  • 实现位置:turbovla/models/vision_encoder.py。
  • DINOv3 输出最后一层 hidden states;实现会移除 CLS/register 等前缀 token,只保留 patch token。
  • 每个相机视角单独编码;之后加入可学习的视角 embedding。RoboTwin 配置额外使用可学习 patch 位置 embedding。
  • LIBERO 使用 DINOv3 ViT-B、两视角、 256 × 256 256\times256 256×256 输入;RoboTwin 使用 ViT-L、三视角、 224 × 224 224\times224 224×224 输入。

这意味着视觉 token 不只是"整图语义向量",而是保留了可供语言查询的空间位置。语言中的"左侧红色杯子"等描述可在后续注意力层中选择相关 patch。

1.2 语言分支:轻量但不是静态文本标签

  • 实现位置:turbovla/models/text_encoder.py。
  • 每次前向传播都在线执行 AutoTokenizer 和 BERT,输出 token 级特征,再线性投影到共享的 256 256 256 维隐藏空间。
  • 论文配方冻结 BERT 参数并强制保持 eval 模式,但训练文本投影层;因此语言表征稳定,控制模块可学习如何使用它。
  • 对 LIBERO,项目用固定或按指令分组的 padding 长度,使 checkpoint 对应的 token 布局保持一致。

重点:BERT 的职责是保留动作执行相关的语义,不负责生成文字、拆分子任务或进行长链推理。

1.3 双向视觉-语言交互:模型真正的创新落点

实现位置:turbovla/models/components/fusion.py 与 turbovla/models/turbovla.py。每一层同时执行:

V ( l ) = V ( l − 1 ) + Attn ⁡ v ← l ( V ( l − 1 ) , L ( l − 1 ) ) V^{(l)}=V^{(l-1)}+\operatorname{Attn}_{v\leftarrow l}(V^{(l-1)},L^{(l-1)}) V(l)=V(l−1)+Attnv←l(V(l−1),L(l−1))

L ( l ) = L ( l − 1 ) + Attn ⁡ l ← v ( L ( l − 1 ) , V ( l − 1 ) ) L^{(l)}=L^{(l-1)}+\operatorname{Attn}_{l\leftarrow v}(L^{(l-1)},V^{(l-1)}) L(l)=L(l−1)+Attnl←v(L(l−1),V(l−1))

  • 视觉查询语言:让每个图像 patch 带上当前任务语义,例如"抓取"还是"放到"。
  • 语言查询视觉:让指令 token 感知场景中实际出现的对象、属性和空间布局。
  • 每层融合后,文本还经过 self-attention;默认堆叠 6 6 6 层。
  • 交互模块由 GroundingDINO 的特征增强权重初始化,减少从机器人示范数据从零学习对齐的负担。

论文消融显示,这不是可有可无的装饰:LIBERO 上直接拼接仅为 96.3 % 96.3\% 96.3%,单向交互为 96.8 % / 97.2 % 96.8\%/97.2\% 96.8%/97.2%,双向交互达到 97.6 % 97.6\% 97.6%;RoboTwin 上无交互为 82.58 % 82.58\% 82.58%,双向交互为 88.06 % 88.06\% 88.06%。

指标 TurboVLA 说明
参数量 0.2B 无 LLM,整体小一个数量级
LIBERO 平均成功率 97.6% 与 LLM 中心的大模型相当
推理延迟 31.2 ms(32 Hz) RTX 4090 实测
推理显存 0.9 GiB 消费级显卡可部署

1.4 状态与动作头:一次预测完整动作段

实现位置:turbovla/models/action_head.py。

  1. StateProjection 将当前关节/末端状态经 MLP 投影为 N s = 2 N_s=2 Ns=2 个状态 token。
  2. 将状态 token 拼到融合后的视觉、语言 token 后,作为 decoder memory。
  3. ACTDecoder 持有 H H H 个可学习 action query。每个 query 对应 chunk 中的一个时刻。
  4. 三层 Transformer decoder 并行生成全部动作,三层 MLP 变成动作维度,最后经 tanh 得到 − 1 , 1 -1,1 −1,1 的归一化动作。

因此模型不是一个动作一个动作地自回归生成,而是一次计算:

A ^ t = a \^ t , a \^ t + 1 , ... , a \^ t + H − 1 ∈ R H × d a \hat A_t=\\hat a_t,\\hat a_{t+1},\\ldots,\\hat a_{t+H-1}\in\mathbb R^{H\times d_a} A^t=a\^t,a\^t+1,...,a\^t+H−1∈RH×da

LIBERO 使用 d a = 7 , H = 12 d_a=7,H=12 da=7,H=12;RoboTwin 使用双臂 d a = 14 , H = 50 d_a=14,H=50 da=14,H=50。

2、模型结构:一次前向的完整流程

#mermaid-svg-MDxMMHX0bIPiCROL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MDxMMHX0bIPiCROL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MDxMMHX0bIPiCROL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MDxMMHX0bIPiCROL .error-icon{fill:#552222;}#mermaid-svg-MDxMMHX0bIPiCROL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MDxMMHX0bIPiCROL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MDxMMHX0bIPiCROL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MDxMMHX0bIPiCROL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MDxMMHX0bIPiCROL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MDxMMHX0bIPiCROL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MDxMMHX0bIPiCROL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MDxMMHX0bIPiCROL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MDxMMHX0bIPiCROL .marker.cross{stroke:#333333;}#mermaid-svg-MDxMMHX0bIPiCROL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MDxMMHX0bIPiCROL p{margin:0;}#mermaid-svg-MDxMMHX0bIPiCROL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-MDxMMHX0bIPiCROL .cluster-label text{fill:#333;}#mermaid-svg-MDxMMHX0bIPiCROL .cluster-label span{color:#333;}#mermaid-svg-MDxMMHX0bIPiCROL .cluster-label span p{background-color:transparent;}#mermaid-svg-MDxMMHX0bIPiCROL .label text,#mermaid-svg-MDxMMHX0bIPiCROL span{fill:#333;color:#333;}#mermaid-svg-MDxMMHX0bIPiCROL .node rect,#mermaid-svg-MDxMMHX0bIPiCROL .node circle,#mermaid-svg-MDxMMHX0bIPiCROL .node ellipse,#mermaid-svg-MDxMMHX0bIPiCROL .node polygon,#mermaid-svg-MDxMMHX0bIPiCROL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MDxMMHX0bIPiCROL .rough-node .label text,#mermaid-svg-MDxMMHX0bIPiCROL .node .label text,#mermaid-svg-MDxMMHX0bIPiCROL .image-shape .label,#mermaid-svg-MDxMMHX0bIPiCROL .icon-shape .label{text-anchor:middle;}#mermaid-svg-MDxMMHX0bIPiCROL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MDxMMHX0bIPiCROL .rough-node .label,#mermaid-svg-MDxMMHX0bIPiCROL .node .label,#mermaid-svg-MDxMMHX0bIPiCROL .image-shape .label,#mermaid-svg-MDxMMHX0bIPiCROL .icon-shape .label{text-align:center;}#mermaid-svg-MDxMMHX0bIPiCROL .node.clickable{cursor:pointer;}#mermaid-svg-MDxMMHX0bIPiCROL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MDxMMHX0bIPiCROL .arrowheadPath{fill:#333333;}#mermaid-svg-MDxMMHX0bIPiCROL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MDxMMHX0bIPiCROL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MDxMMHX0bIPiCROL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MDxMMHX0bIPiCROL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MDxMMHX0bIPiCROL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MDxMMHX0bIPiCROL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MDxMMHX0bIPiCROL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MDxMMHX0bIPiCROL .cluster text{fill:#333;}#mermaid-svg-MDxMMHX0bIPiCROL .cluster span{color:#333;}#mermaid-svg-MDxMMHX0bIPiCROL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-MDxMMHX0bIPiCROL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MDxMMHX0bIPiCROL rect.text{fill:none;stroke-width:0;}#mermaid-svg-MDxMMHX0bIPiCROL .icon-shape,#mermaid-svg-MDxMMHX0bIPiCROL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MDxMMHX0bIPiCROL .icon-shape p,#mermaid-svg-MDxMMHX0bIPiCROL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MDxMMHX0bIPiCROL .icon-shape .label rect,#mermaid-svg-MDxMMHX0bIPiCROL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MDxMMHX0bIPiCROL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MDxMMHX0bIPiCROL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MDxMMHX0bIPiCROL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Action Head(ACT 式)
Vision-Language Interaction ×6 层
编码器
输入
双视角图像

agentview + wrist

256×256
语言指令

padding 到 21 token
机器人状态

8 维
DINOv3 ViT-B

(BF16 autocast 计算

全量微调)
BERT base uncased

(冻结)
VisionProjection

LayerNorm+MLP+skip

→ 256 维
text_projection

→ 256 维
BiAttentionBlock

视觉↔文本双向交叉注意力
Text Encoder Layer

文本自注意力
StateProjection

8 维 → 2 个状态 token
TransformerDecoder ×3 层

12 个可学习 action query
MLP + tanh

→ 12×7 动作块

各模块要点(与后文命令参数的对应关系):

模块 关键配置 训练策略 初始化来源
视觉编码器 DINOv3 ViT-B,双视角分别编码,patch token + 视角 embedding 全量解冻微调,BF16 autocast(权重保持 FP32) facebook/dinov3 预训练
文本编码器 BERT base,在线编码(无文本特征缓存),固定 padding 长度 21 冻结 (freeze_text_encoder=True) google-bert 预训练
交互模块 6 层 ×(双向交叉注意力 + 文本自注意力),hidden 256 / inner 1024 训练 GroundingDINO 的 feature enhancer (--pretrained_init_ckpt 的作用)
动作头 状态 8 维→2 token;12 个 action query;3 层 Decoder 训练 随机初始化

3. 训练与推理流程

3.1 训练:带 chunk mask 的行为克隆

LIBERO 训练主入口为 experiments/libero/train.py,实际训练器为 turbovla/training/trainer.py。目标函数是:

L = ∑ i , j , k m i j ∣ A ^ i j k − A i j k ∗ ∣ ∑ i , j , k m i j \mathcal L=\frac{\sum_{i,j,k}m_{ij}|\hat A_{ijk}-A^*{ijk}|}{\sum{i,j,k}m_{ij}} L=∑i,j,kmij∑i,j,kmij∣A^ijk−Aijk∗∣

其中 m m m 屏蔽 episode 末尾的填充动作。LIBERO 的不足 12 12 12 步 chunk 会以最后一个动作补齐,但不参与损失;这避免了边界 padding 污染行为克隆。

训练配置要点:

项目 LIBERO RoboTwin 2.0
视觉骨干 DINOv3 ViT-B DINOv3 ViT-L
相机数 2 3
动作/状态维度 7 / 8 14 / 14
动作 horizon 12 50
训练步数 40k 150k
有效 batch size 128 512
优化器 AdamW AdamW
EMA 衰减 0.999 0.999

RoboTwin 训练配置位于 experiments/robotwin/configs/taskbalanced_all50.yaml:50 个任务均匀采样,且每个任务内部 Randomized:Clean 采样比为 10 : 1 10:1 10:1。

3.2 评估和部署:chunk 执行并不等于每步都重新观察

LIBERO 的策略封装在 turbovla/evaluation/policy.py:

  1. 将环境图像旋转、按 DINOv3 统计量归一化。
  2. 从末端位姿、轴角和夹爪状态构造 8 8 8 维 state,并标准化。
  3. 调用模型得到 12 × 7 12\times7 12×7 动作 chunk。
  4. 前六维按数据集 min/max 反归一化;第七维按正负号转换为夹爪开合命令。
  5. 在默认协议下执行完整 chunk,再重新观测并规划。

重要取舍 :动作 chunk 降低策略调用次数,但也使 chunk 内成为开环控制。论文在 LIBERO 中发现 H = 12 H=12 H=12 最好: H = 8 / 10 / 12 / 15 H=8/10/12/15 H=8/10/12/15 的平均成功率为 96.8 % / 97.3 % / 97.6 % / 96.7 % 96.8\%/97.3\%/97.6\%/96.7\% 96.8%/97.3%/97.6%/96.7%。更长的预测窗口不必然更好,因为视觉反馈变少了。

RoboTwin 路径通过 StarVLA runtime 和 WebSocket policy server 对接仿真器,允许模型服务与仿真器使用不同 Python 环境。


4. 为什么它快:架构收益与工程收益要分开看

架构层面的收益

  1. 不经过数十亿参数的 LLM/VLM 主干。
  2. BERT、DINOv3、融合器与动作 decoder 都是固定深度前向计算。
  3. ACT query 并行预测动作 chunk,没有 token-by-token 自回归动作解码。
  4. 融合维度仅为 256 256 256,交互层为 6 6 6 层。

已在仓库体现的工程手段

  • 冻结模块时使用 torch.no_grad(),避免无用的激活和梯度。
  • CUDA 上支持 BF16 autocast。
  • RoboTwin 配置请求 Flash Attention 2;不可用时会回退到 SDPA/默认 attention。
  • 训练侧使用 pinned memory、persistent workers、梯度累积和 EMA。

论文数字的正确解读

论文的 31.2 ms 31.2\text{ ms} 31.2 ms 对应约 32 32 32 Hz,测量定义是:单张 RTX 4090、batch size 1、GPU 已驻留输入、完成一个动作 chunk 的稳态策略前向;不包含传感器采集、CPU 预处理、数据传输、网络通信或机器人执行。因此它是本地策略推理频率,不是端到端机器人控制频率。

论文还报告结合 CUDA Graph replay、数据转换和内存分配优化后达到 7.42 ms 7.42\text{ ms} 7.42 ms。当前仓库的核心路径可见 BF16/SDPA/Flash Attention 支持,但未包含 CUDAGraph 或 torch.compile 的可复用实现;复现该 7.42 ms 7.42\text{ ms} 7.42 ms 结果需要自行补足论文所述 runtime 优化与一致的测量脚本。


5. 总结-思路流程

#mermaid-svg-a9Qqgnfmi2NXtiHy{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-a9Qqgnfmi2NXtiHy .error-icon{fill:#552222;}#mermaid-svg-a9Qqgnfmi2NXtiHy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-a9Qqgnfmi2NXtiHy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-a9Qqgnfmi2NXtiHy .marker.cross{stroke:#333333;}#mermaid-svg-a9Qqgnfmi2NXtiHy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-a9Qqgnfmi2NXtiHy p{margin:0;}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge{stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section--1 rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section--1 path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section--1 circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section--1 polygon,#mermaid-svg-a9Qqgnfmi2NXtiHy .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section--1 text{fill:#ffffff;}#mermaid-svg-a9Qqgnfmi2NXtiHy .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-depth--1{stroke-width:17;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:lightgray;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:#efefef;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-0 rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-0 path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-0 circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-0 polygon,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-0 text{fill:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .node-icon-0{font-size:40px;color:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-depth-0{stroke-width:14;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:lightgray;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:#efefef;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-1 rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-1 path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-1 circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-1 polygon,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-1 text{fill:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .node-icon-1{font-size:40px;color:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-depth-1{stroke-width:11;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:lightgray;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:#efefef;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-2 rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-2 path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-2 circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-2 polygon,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-2 text{fill:#ffffff;}#mermaid-svg-a9Qqgnfmi2NXtiHy .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-depth-2{stroke-width:8;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:lightgray;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:#efefef;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-3 rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-3 path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-3 circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-3 polygon,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-3 text{fill:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .node-icon-3{font-size:40px;color:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-depth-3{stroke-width:5;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:lightgray;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:#efefef;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-4 rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-4 path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-4 circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-4 polygon,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-4 text{fill:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .node-icon-4{font-size:40px;color:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-depth-4{stroke-width:2;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:lightgray;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:#efefef;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-5 rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-5 path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-5 circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-5 polygon,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-5 text{fill:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .node-icon-5{font-size:40px;color:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-depth-5{stroke-width:-1;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:lightgray;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:#efefef;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-6 rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-6 path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-6 circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-6 polygon,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-6 text{fill:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .node-icon-6{font-size:40px;color:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-depth-6{stroke-width:-4;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:lightgray;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:#efefef;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-7 rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-7 path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-7 circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-7 polygon,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-7 text{fill:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .node-icon-7{font-size:40px;color:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-depth-7{stroke-width:-7;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:lightgray;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:#efefef;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-8 rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-8 path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-8 circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-8 polygon,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-8 text{fill:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .node-icon-8{font-size:40px;color:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-depth-8{stroke-width:-10;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:lightgray;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:#efefef;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-9 rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-9 path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-9 circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-9 polygon,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-9 text{fill:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .node-icon-9{font-size:40px;color:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-depth-9{stroke-width:-13;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:lightgray;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:#efefef;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-10 rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-10 path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-10 circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-10 polygon,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-10 text{fill:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .node-icon-10{font-size:40px;color:black;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge-depth-10{stroke-width:-16;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:lightgray;}#mermaid-svg-a9Qqgnfmi2NXtiHy .disabled text{fill:#efefef;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-root rect,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-root path,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-root circle,#mermaid-svg-a9Qqgnfmi2NXtiHy .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-root text{fill:#ffffff;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-root span{color:#ffffff;}#mermaid-svg-a9Qqgnfmi2NXtiHy .section-2 span{color:#ffffff;}#mermaid-svg-a9Qqgnfmi2NXtiHy .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-a9Qqgnfmi2NXtiHy .edge{fill:none;}#mermaid-svg-a9Qqgnfmi2NXtiHy .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-a9Qqgnfmi2NXtiHy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} TurboVLA
目标
低延迟控制
低显存部署
语言条件操作
方法
直接 V+L→A
DINOv3 多视角视觉
BERT 指令编码
双向跨模态交互
ACT 并行动作 chunk
训练
L1 行为克隆
动作边界 mask
AdamW + EMA
GroundingDINO 初始化
基准
LIBERO
2 视角
7D 动作
H=12
RoboTwin 2.0
3 视角
14D 双臂动作
H=50
优势
无 LLM 中枢
非自回归动作
0.2B / 0.9 GiB
边界
开环 chunk 风险
不做高层规划
外部依赖较多


6. 复现指南

参考我这篇博客:《VLA系列》TurboVLA 复现指南:0.2B小模型 | 32 Hz | 显存<1 GB 全量微调

6.1 准备两套环境

项目建议 LIBERO 与 RoboTwin 使用独立的 Python 3.10 环境,因为二者依赖的仿真器与运行时不同。

bash 复制代码
# LIBERO
conda create -n turbovla-libero python=3.10 -y
conda activate turbovla-libero
pip install torch==2.3.1 torchvision==0.18.1 --index-url https://download.pytorch.org/whl/cu121
pip install -e ".[libero]"

# RoboTwin
conda create -n turbovla-robotwin python=3.10 -y
conda activate turbovla-robotwin
pip install -e ".[robotwin]"
pip install flash-attn==2.7.4.post1 --no-build-isolation

此外需独立安装 LIBERO 与 RoboTwin 2.0 仿真器;后者评测环境可以与模型服务环境分离。

6.2 下载外部模型和数据

仓库不包含模型权重、DINOv3、BERT、GroundingDINO 初始化权重或 benchmark 数据。先下载发布 checkpoint 与归一化元数据:

bash 复制代码
pip install -U huggingface_hub
hf download H-EmbodVis/TurboVLA --local-dir pretrained/TurboVLA

还需准备:

  • DINOv3 ViT-B(LIBERO)或 ViT-L(RoboTwin);
  • bert-base-uncased;
  • GroundingDINO Swin-T OGC checkpoint;
  • LIBERO 的四个 no_noops RLDS 数据集,或 RoboTwin 的 Clean/Randomized 转换数据。

检查点 :路径必须与命令参数一致;默认倾向离线加载。只有显式传 --allow_hf_download 时 LIBERO 路径才允许 Hugging Face 下载。

6.3 复现 LIBERO 训练

论文配方:4 张 RTX 4090、每卡 batch 8、梯度累积 4,因此全局 batch 是 4 × 8 × 4 = 128 4\times8\times4=128 4×8×4=128;训练 40k step、warmup 10k step。

bash 复制代码
torchrun --nproc_per_node=4 experiments/libero/train.py \
  --dataset_dir data/libero/libero_10_no_noops/1.0.0 \
  --dataset_dirs "data/libero/libero_10_no_noops/1.0.0,data/libero/libero_goal_no_noops/1.0.0,data/libero/libero_object_no_noops/1.0.0,data/libero/libero_spatial_no_noops/1.0.0" \
  --stats_path experiments/libero/configs/libero_all4_stats.json \
  --stats_key libero_all4_no_noops \
  --dinov3_path /path/to/dinov3-vitb \
  --bert_path /path/to/bert-base-uncased \
  --pretrained_init_ckpt /path/to/groundingdino_swint_ogc.pth \
  --batch_size 8 \
  --grad_accum_steps 4 \
  --max_steps 40000 \
  --checkpoint_dir outputs/libero

务必显式传入 --max_steps 40000:论文配方是 40k,但训练器的 CLI 默认值是 80k;不覆盖会得到不同的训练预算。

评估单一 suite:

bash 复制代码
python experiments/libero/evaluate.py \
  --ckpt_path pretrained/TurboVLA/checkpoints/libero/libero_object.pth \
  --dinov3_path /path/to/dinov3-vitb \
  --bert_path /path/to/bert-base-uncased \
  --stats_path experiments/libero/configs/libero_all4_stats.json \
  --stats_key libero_all4_no_noops \
  --task_suite_name libero_object \
  --num_trials_per_task 50 \
  --chunk_size 12 \
  --num_open_loop_steps 12 \
  --precision bf16 \
  --result_json_path outputs/evaluation/libero_object.json

要与论文平均值严格对齐,需评测四个 suite、每 task 50 条 rollout,共 4 × 10 × 50 = 2000 4\times10\times50=2000 4×10×50=2000 次试验,并使用 EMA checkpoint。

6.4 复现 RoboTwin 训练与评估

bash 复制代码
export ROBOTWIN_DATA_ROOT=/path/to/converted/RoboTwin
export BERT_MODEL_PATH=/path/to/bert-base-uncased
export TURBOVLA_INIT_CKPT=/path/to/groundingdino_swint_ogc.pth
export DINOV3_MODEL_PATH=/path/to/dinov3-vitl
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7

RUN_ID=turbovla_robotwin_all50_taskbalanced_150k \
  bash scripts/robotwin/train.sh

论文配方使用 8 张 H100、每卡 64、全局 batch 512、150k step。评估时启动模型服务与 RoboTwin 仿真:

bash 复制代码
export ROBOTWIN_PATH=/path/to/RoboTwin
export STARVLA_PYTHON=/path/to/policy-env/bin/python
export ROBOTWIN_PYTHON=/path/to/robotwin-env/bin/python

bash scripts/robotwin/evaluate.sh \
  /path/to/steps_150000_ema_pytorch_model.pt

论文报告按 Clean 和 Randomized 各 50 个任务、每任务 100 次 rollout,即每种设置各 5000 次试验;使用未见过的任务指令。


7. 结果、亮点与边界

值得关注的结果

场景 论文报告结果 应如何理解
LIBERO 97.6 % 97.6\% 97.6% 成功率, 0.2 0.2 0.2B, 31.2 ms 31.2\text{ ms} 31.2 ms, 0.9 GiB 0.9\text{ GiB} 0.9 GiB 轻量 V+L→A 可达到强执行性能
RoboTwin 2.0 88.06 % 88.06\% 88.06%, 0.4 0.4 0.4B, 43.4 ms 43.4\text{ ms} 43.4 ms 方法可扩展到三视角双臂控制
真实 AgileX Piper 87.5 % 87.5\% 87.5% 平均成功率 论文报告的 4 个桌面任务结果

方法亮点

  • 表示路径更短:避免大语言模型成为每次控制推理的固定成本。
  • 语言与视觉真正交互:双向 cross-attention 的收益由两个 benchmark 的消融支持。
  • 动作输出连续且并行:无需离散 action token 化,也没有自回归解码延迟。
  • 架构有清晰分工:DINOv3 提供空间视觉,BERT 提供指令语义,融合器负责 grounding,ACT 负责控制序列。

适用边界

  • 更适合"明确指令下的执行级操作",不针对"收拾房间"这类需要目标拆分和高层推理的开放任务。
  • action chunk 存在开环执行区间,对快速变化、接触不确定性强或视觉反馈频繁变化的任务需要缩短 horizon 或加入重规划策略。
  • 性能数字依赖特定 GPU、输入分辨率、动作 horizon 和论文定义的测量范围,不能直接等同于真实机器人端到端频率。

8. 代码阅读入口

目的 入口
主模型与融合调度 turbovla/models/turbovla.py
DINOv3 视觉 token turbovla/models/vision_encoder.py
在线 BERT 编码 turbovla/models/text_encoder.py
双向视觉语言注意力 turbovla/models/components/fusion.py
ACT 状态投影与动作头 turbovla/models/action_head.py
LIBERO 训练 turbovla/training/trainer.py
LIBERO 评测预后处理 turbovla/evaluation/policy.py
RoboTwin 完整配置 experiments/robotwin/configs/taskbalanced_all50.yaml

参考

分享完成~

相关推荐
海盗12342 小时前
AI 新闻日报 2026-10-01:OpenAI 把 ChatGPT 变成智能体平台,VS Code 上线多模型编排,国产算力补到内核层
人工智能·chatgpt·机器人·人工智能aigc
FII工业富联科技服务6 小时前
2026工业AI智能体架构全景:从单Agent到多Agent协同的工厂级闭环实践
人工智能·ai·机器人·制造
workflower7 小时前
世界模型向产业上游发掘的热点
人工智能·机器学习·机器人·云计算·无人机
海盗12349 小时前
微软技术日报 2026-10-01:VS Code 1.140 让模型互相挑错,EWS 今天起关停
人工智能·驱动开发·microsoft·机器人·aigc
zhangrelay10 小时前
机器人或计算机智能与时间相关案例汇总(ROS2-ROS1)
linux·笔记·学习·ubuntu·机器人
zhangrelay21 小时前
ROS项目设计案例智能大模型正经乱答案例
linux·笔记·学习·ubuntu·机器人
苏打豆1 天前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人
BSD_CGQ1 天前
从工业称重到机器人触觉:柔性压力传感器的跨场景工程适配路径
人工智能·机器人·压力传感器·柔性薄膜压力传感器
硅谷秋水1 天前
WLA³:面向语义、动力学与运动学的世界潜动作建模
人工智能·机器学习·计算机视觉·语言模型·机器人