TurboVLA 技术解读:用直接 V+L→A 路径实现实时机器人控制
关键 :TurboVLA 并非把大语言模型简单缩小,而是移除了"大型生成式语言模型作为视觉到动作中枢"的路径。它用 DINOv3、BERT、轻量双向跨模态交互和 ACT 动作解码器,直接完成 V + L → A V+L\rightarrow A V+L→A,在执行级操作中换取更低时延和显存占用。
1. 整体框架
如下图所示,TurboVLA的结构图。
- 输入: 多视角图像、文字指令和机器人当前状态分别进入 DINOv3、BERT 与状态 MLP。
- 融合: 图中央的双向 cross-attention 交叉注意力 让视觉定位与指令相关的区域,也让指令结合当前场景完成 grounding。
- 输出: 融合 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。
StateProjection将当前关节/末端状态经 MLP 投影为 N s = 2 N_s=2 Ns=2 个状态 token。- 将状态 token 拼到融合后的视觉、语言 token 后,作为 decoder memory。
ACTDecoder持有 H H H 个可学习 action query。每个 query 对应 chunk 中的一个时刻。- 三层 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:
- 将环境图像旋转、按 DINOv3 统计量归一化。
- 从末端位姿、轴角和夹爪状态构造 8 8 8 维 state,并标准化。
- 调用模型得到 12 × 7 12\times7 12×7 动作 chunk。
- 前六维按数据集 min/max 反归一化;第七维按正负号转换为夹爪开合命令。
- 在默认协议下执行完整 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. 为什么它快:架构收益与工程收益要分开看
架构层面的收益
- 不经过数十亿参数的 LLM/VLM 主干。
- BERT、DINOv3、融合器与动作 decoder 都是固定深度前向计算。
- ACT query 并行预测动作 chunk,没有 token-by-token 自回归动作解码。
- 融合维度仅为 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_noopsRLDS 数据集,或 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 |
参考
分享完成~