从VLM到VLA:具身智能机器人动作模型解析与选型指南

📅 发布时间:2026/8/27 10:24:01
从VLM到VLA:具身智能机器人动作模型解析与选型指南
机器人只会“看见”却不会“动手”是具身智能落地时最让人头疼的问题之一。如果你接触过 VLM视觉语言模型应该熟悉这个场景给模型一张桌面杂乱摆放物体的图片它能准确描述环境、识别物体甚至说出“请把红色方块放到蓝色碗里”。但当你真的想把这句话变成机械臂的运动轨迹时中间隔着一道巨大的鸿沟——VLM 只负责理解世界不负责改变世界。具身智能真正需要的是能从“理解”直接跨越到“行动”的模型。这正是 VLAVision-Language-Action Model视觉语言动作模型要解决的问题也是 OpenVLA、Octo、π₀ 这几个名字逐渐进入开发者视野的原因。这篇文章不打算堆砌概念而是想帮大家把一条关键脉络理清楚从 VLM 到 VLA模型架构到底发生了哪些本质变化三个主流开源方案各自用什么思路解决“怎么动手”的问题以及在实际项目中如何选型、如何快速跑通一个最小示例。如果你正在做机械臂操控、机器人数据采集、仿真到真机迁移或者只是想知道“具身智能的模型层到底发展到哪一步了”这篇教程会给你一个比较完整的坐标系。1. 从 VLM 到 VLA到底多了一个什么能力先做一个简单对比帮助理解 VLM 和 VLA 的关系。维度VLM视觉语言模型VLA视觉语言动作模型输入图像 文本图像 文本 状态/动作信息输出文本描述、回答、推理动作 token、动作序列、控制信号核心能力理解物理世界理解并改变物理世界典型任务视觉问答、图像描述、具身推理机械臂操控、移动操作、灵巧操作训练数据图像-文本对机器人轨迹数据 视觉语言数据VLM 的能力边界可以用一句话概括“看见并理解但不动手”。LLaVA、GPT-4V、Qwen-VL 这类模型在视觉问答、图表理解、网页操作等任务上表现出色但它们没有经过“动作”维度的对齐训练无法直接输出关节角度、末端位姿或操作指令。VLA 的能力边界则是“理解之后直接给出动作”。它在 VLM 的基础上增加了动作预测头通过在海量机器人轨迹数据上训练学会了把视觉观察、语言指令映射为具体的动作输出。你可以把 VLA 理解为“长了手的 VLM”也可以理解为“会说人话的机器人 Policy”。真正值得关注的是模型内部的结构变化。VLM 的做法是把图像编码成视觉 token和文本 token 一起送进 Transformer 做自回归生成最后输出文本 token。VLA 在架构上保留了这条主干但输出层从“词表上的概率分布”扩展到“动作空间上的预测”或者通过一个额外的动作头将隐藏状态解码为连续动作。从训练数据的角度看差距更明显。VLM 的数据是互联网上几乎无限量的图文对而 VLA 需要的是“带动作标签的机器人轨迹数据”这类数据的获取成本要高得多。也正因为如此当前 VLA 模型的泛化能力普遍受限于数据规模这也是为什么开源社区非常看重训练流程的清晰度和模型的可复现性。2. VLA 模型的核心设计问题动作怎么表示在深入 OpenVLA、Octo、π₀ 之前有必要先建立一个框架一个 VLA 模型到底由哪几部分组成以及不同设计之间最核心的分歧在哪里。一个完整的 VLA 模型通常包含以下部分视觉编码器Vision Encoder将原始图像转换为视觉特征常见选择是 SigLIP、ViT 等。语言编码器/融合模块处理文本指令并与视觉特征对齐。多模态主干网络通常是 Transformer负责跨模态推理。动作解码头Action Head将隐藏状态转换为动作输出。动作表示机制连续控制信号还是离散 token这是不同方案分化的关键点。动作表示是整个 VLA 设计里最值得花时间理解的部分它直接决定了模型的训练难度和真机部署效果。第一种方案是离散动作 tokenDiscrete Action Tokens。OpenVLA 采用这种方式。具体做法是先把连续动作空间比如 7 自由度机械臂的关节位置变化离散成若干 bin再将离散值映射到词表索引。这样模型可以完全复用语言模型的交叉熵损失函数训练流程简单直接。缺点是需要为不同机器人重新定义离散化范围离散化精度有限。第二种方案是连续动作回归。Octo 支持这种思路。模型不把动作当作 token 生成而是直接回归出一个连续动作向量。好处是精度高、控制流畅缺点是训练不稳定需要设计专门的损失函数。第三种方案是 Flow Matching。π₀ 采用的是这个方法。它把动作生成看作一个去噪过程从随机噪声逐步还原出真实动作分布。相对自回归逐 token 生成Flow Matching 在生成连续动作时更自然表达能力更强尤其适合高精度的灵巧操作任务。理解了这三个方案你就能看懂为什么这些模型看起来都属于 VLA但设计哲学完全不同OpenVLA 想的是“尽可能复用语言模型的成熟技术”Octo 想的是“让一个模型适配多种机器人”π₀ 想的是“把动作生成做到最接近真实物理世界的精度”。3. OpenVLA把 VLM 变成 VLA 的典型范本OpenVLA 在开源 VLA 社区里影响很大它最重要的贡献是证明了“在强大的 VLM 基础上微调就能得到可用的 VLA”。很多人在初学时容易把 OpenVLA 理解成“一个模型”它更像是一套方法论取一个开源 VLM接入动作预测层在大规模机器人数据集上微调。OpenVLA 的基础模型是 Prismatic VLM视觉编码器使用 SigLIP语言主干使用 Llama 2 7B。它把动作空间离散化后映射到语言模型的词表中从而将机器人动作预测转化成下一个 token 预测问题。训练数据来自 Open X-Embodiment 数据集——这是一个由全球多家机器人实验室共同构建的大规模多机器人数据集包含多种操作任务和多种机器人形态。这里需要特别说明OpenVLA 论文发布时的模型参数量为 7B这个量级意味着它在实际部署时对 GPU 显存有明确要求。FP16 推理大约需要 14GB 以上显存4bit 量化后可以降到 6GB 左右。所以如果你打算在本地跑 OpenVLA 推理最好准备一张显存充足的 GPU或者直接使用量化版本。OpenVLA 的优势在于技术路径清晰训练代码开源便于二次开发。基于通用 VLM 底座语义理解能力强。社区使用广泛资料多问题容易定位。局限也很明显离散动作 token 的精度上限有限不适合高精度力控场景。自回归生成动作的速度相对较慢。对多机器人形态的适配需要额外微调。如果你想快速验证 VLA 的基础能力OpenVLA 是值得优先尝试的模型。4. Octo面向多机器人场景的 Transformer 动作模型Octo 的定位和 OpenVLA 不太一样。它在设计之初就考虑了一个实际问题机器人实验室里通常有多台不同构造的机器人总不能每换一台机器人就重新训练一个模型。Octo 是一个开源的 Transformer 架构 Policy它支持通过模块化的条件输入来适配不同的机器人。简单来说Octo 把“观察信息”“语言指令”和“机器人形态信息”分别编码在 Transformer 内部进行跨模态融合然后输出连续动作。因为机器人形态是通过条件向量注入的所以同一个模型权重可以通过更换条件向量来适配不同机器人。Octo 和 OpenVLA 的主要区别如下维度OpenVLAOcto动作表示离散动作 token连续动作回归模型规模7B 级别相对轻量多机器人适配需要微调原生支持条件注入主打优势语义理解、可微调快速部署、多形态适配训练数据Open X-EmbodimentOpen X-EmbodimentOcto 的模型设计更接近传统机器人学习中的 Policy 架构强调控制频率和响应速度而不是复杂语义推理。因此如果你在做一个对实时性要求比较高、指令相对固定的工业场景Octo 这类轻量策略可能更合适但如果你需要处理开放式的语言指令OpenVLA 的语义能力更强。从笔者的角度看Octo 和 OpenVLA 并不完全对立。把它们看作用户在不同需求下的两种选择会更准确追求语义泛化选 OpenVLA追求多形态适配和控制效率选 Octo。5. π₀Pi Zero面向灵巧操作的 VLA 新方向π₀ 来自 Physical Intelligence 团队这个名字在具身智能领域代表了一种更接近真实物理交互的追求。与其说 π₀ 是一个固定模型不如说它代表了一种新的动作生成范式。π₀ 在架构上做了两个关键变化。第一个变化是动作头采用 Flow Matching 而非离散 token。Flow Matching 与扩散模型有相似之处但在训练稳定性和采样效率上做了优化。动作生成就是从随机噪声开始通过多次迭代去噪逐步逼近目标动作。这个过程天然支持连续动作空间能够输出更平滑、更高精度的控制信号这对灵巧操作中常见的插孔、堆叠、抓取等精细动作非常重要。第二个变化体现在视觉和动作信息的组织方式。π₀ 系列模型有 single-flow 和 dual-flow 等不同变体。single-flow 将视觉 token 和动作 token 放在同一序列中处理信息融合更紧密dual-flow 则用独立的动作专家模块处理动作序列让动作模态保持自己的表达空间。从经验上讲dual-flow 更容易训练动作精度也更高single-flow 在信息交互上更充分。π₀ 的实现还特别关注“视觉-语言基础模型”和“动作专家”的分工。视觉语言部分负责理解场景和指令动作专家负责将理解转化为精确的动作序列。这样设计的好处是动作专家可以独立演进比如针对不同类型的机器人设计不同的动作专家而视觉语言部分保持相对统一。需要说明的是π₀ 的官方权重并不像 OpenVLA 和 Octo 那样完全开放更多是通过论文和开源社区实现来传播。如果你想在本地体验它需要关注社区复现项目并仔细确认运行环境。6. 三个模型的定位与选型建议先给出一个整体对比表模型核心思路动作表示最佳适用场景硬件要求开源程度OpenVLA在通用 VLM 上微调离散动作 token开放式语义任务、桌面操作高7B 模型权重开源Octo多机器人条件 Transformer连续动作回归多机器人部署、实时控制中等权重开源π₀视觉语言基础模型 动作专家Flow Matching灵巧操作、高精度任务较高开源程度因项目而异选型建议并没有唯一答案需要结合项目阶段来判断。如果是实验室研究想理解 VLA 的基本工作流程推荐从 OpenVLA 入手因为它的技术栈最成熟教程多遇到问题容易搜到解决方案。如果是产品原型验证需要快速适配不同机器人型号Octo 的模块化设计更方便。如果团队主攻灵巧操作希望尝试最新动作生成范式可以关注 π₀ 社区复现项目并准备较强的训练资源。另外需要提醒的是不管是哪个模型真机部署都涉及很多工程细节相机标定、坐标变换、动作尺度归一化、安全限位等。模型只是整套系统的一部分不要指望“加载模型就能动”。7. 环境准备与可运行示例接下来用一个最小示例演示 VLA 模型的使用流程。这里以 OpenVLA 为例因为它的权重获取和推理代码相对标准便于读者复现。7.1 环境要求建议使用 Linux 系统Python 3.10 以上PyTorch 2.0 以上CUDA 11.8 或更高版本。硬件方面如果使用原版 7B 模型做 FP16 推理至少需要 16GB 显存如果使用 4bit 量化版本8GB 显存也可以尝试但速度会明显变慢。7.2 安装依赖# 创建虚拟环境 conda create -n vla python3.10 -y conda activate vla # 安装 PyTorch请根据自己的 CUDA 版本调整安装命令 pip install torch torchvision # 安装 transformers 及必要的依赖库 pip install transformers accelerate sentencepiece protobufOpenVLA 官方仓库还要求安装flash-attn来提升注意力计算效率。如果安装 flash-attn 遇到编译问题可以先跳过这一项改为在加载模型时设置use_flash_attention_2False。7.3 加载模型并执行推理下面是一段简化后的 OpenVLA 推理示例核心目的是展示模型加载和动作输出的完整链路。# 文件路径openvla_inference.py import torch from PIL import Image from transformers import AutoModelForVision2Seq, AutoProcessor model_id openvla/openvla-7b # 加载模型和处理器 processor AutoProcessor.from_pretrained(model_id, trust_remote_codeTrue) model AutoModelForVision2Seq.from_pretrained( model_id, torch_dtypetorch.bfloat16, low_cpu_mem_usageTrue, trust_remote_codeTrue, ).to(cuda) # 准备输入一张图像和一条语言指令 image Image.open(example.jpg) instruction pick up the red cube and place it in the blue bowl inputs processor(textinstruction, imagesimage, return_tensorspt).to(cuda, torch.bfloat16) # 执行动作预测 with torch.inference_mode(): action model.predict_action( **inputs, unnorm_keybridge_orig, do_sampleFalse, max_new_tokens64, ) # 输出预测的动作向量维度取决于具体机器人配置 print(action)这段代码中有两个需要重点理解的地方。首先是unnorm_key参数。VLA 模型在训练时会对动作数据做归一化不同的机器人和数据集使用不同的归一化参数。推理时必须传入正确的unnorm_key否则输出的动作会偏离真实物理空间。这也是新手最容易忽略的细节。其次是model.predict_action这个接口。它不是 Hugging Face Transformers 原生 API而是 OpenVLA 在推理代码中封装的方法内部会自动处理动作 token 的映射、归一化和解码。如果直接使用原生generate方法得到的是 token ID还需要额外步骤才能转成动作。7.4 一个更贴近实际的数据预处理示例实际项目中你通常会把图像先缩放到模型输入尺寸再进行归一化。下面的代码演示了批次式的数据预处理流程方便与自己的数据管线对接。# 文件路径preprocess_robot_data.py import torch from PIL import Image from torchvision import transforms def make_vla_transform(resolution224): return transforms.Compose([ transforms.Resize((resolution, resolution)), transforms.ToTensor(), transforms.Normalize( mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225] ), ]) def prepare_batch(image_paths, instructions, tokenizer, transform): images [] input_texts [] for img_path, inst in zip(image_paths, instructions): img Image.open(img_path).convert(RGB) images.append(transform(img)) input_texts.append(inst) pixel_values torch.stack(images) text_inputs tokenizer( input_texts, paddingTrue, return_tensorspt, ) return { pixel_values: pixel_values, input_ids: text_inputs[input_ids], attention_mask: text_inputs[attention_mask], }这段代码展示了最标准的图像预处理流程缩放、转 Tensor、ImageNet 归一化。如果你的机器人相机视角固定还可以通过中心裁剪进一步提升数据一致性。8. 运行验证与效果判断如果你按照上面的方式跑通了推理如何判断模型是否正常工作最简单的方式是先打印出动作向量检查每个维度的数值是否在合理范围。以 Bridge 数据集为例动作向量通常包含 7 个维度的末端位姿增量或关节位置增量。如果所有值都接近零说明模型没有从指令中获得有效信息如果出现极大或极小的异常值大概率是归一化参数不匹配。使用命令查看输出python openvla_inference.py预期输出应该是一行形如[ 0.021, -0.034, 0.012, 0.003, 0.009, -0.002, 0.001]的浮点数数组数值的大小和方向应与图像中物体的位置关系大致吻合。如果结果不符合预期按以下顺序排查确认图像内容清晰物体没有被遮挡。确认指令中物体名称与图像内容对应。确认unnorm_key与数据集的匹配关系。检查图像预处理是否与训练时一致。查看日志中是否有异常值或 NaN 出现。在真机部署前强烈建议先用仿真环境验证模型输出再进行硬件接入。具体做法是在仿真环境中运行模型把预测动作应用到仿真机械臂观察任务是否完成。这一步能提前发现动作尺度、方向、参考坐标系等常见问题避免直接磨损真机。9. VLA 常见问题与排查思路问题现象可能原因排查方式解决方案加载模型时显存不足模型精度过高或 GPU 显存偏小查看nvidia-smi显存使用量改用 4bit 量化或减小 batch size动作输出全为零指令和图像信息未有效传入检查输入数据是否有内容打印 tokenizer 和图像预处理输出动作值出现 NaN归一化参数不合法或输入包含异常值检查unnorm_key和图像像素范围修正归一化参数改用有效图像推理速度太慢自回归生成步数过多统计max_new_tokens适当减小生成步数或使用推理加速框架真机执行后动作方向相反坐标系方向不一致对比仿真输出和真机日志统一坐标系定义检查外参训练微调时 loss 不下降数据格式或学习率设置不当查看 loss 曲线和数据样例调整学习率检查训练数据的动作标签这些都是实际项目中比较常见的问题。重点提醒一下真机测试前务必确认安全措施到位启用急停开关、速度限制和位置限制并在小范围内先做单步动作测试再逐步放开到完整任务。10. 最佳实践与工程建议最后补充一些 VLA 相关的工程实践建议这些经验来自机器人学习项目的共性规律而非某一家特定方法。10.1 数据才是真正的瓶颈VLA 模型的效果上限几乎由数据质量决定。训练数据中动作标签的噪声会直接降低模型精度所以数据清洗和标注校验非常关键。建议在采集数据时同时记录多视角图像、关节角度、末端位姿、时间戳和任务描述保证数据管线完整可回溯。10.2 仿真验证不可跳步很多项目失败不是模型有问题而是没有做仿真到真机的差异分析。建议先搭建仿真环境把模型输出的动作应用到仿真机械臂验证任务成功率再切换到真机。仿真和真机之间的动作尺度差异、动力学差异、图像差异都会影响最终效果。10.3 使用统一的坐标变换工具坐标变换是机器人项目中最隐蔽的 bug 来源。建议使用成熟的三维几何库管理坐标变换显式标注每个动作是在哪个坐标系下表示的并用单元测试验证关键变换的准确性。10.4 量化与推理加速VLA 模型规模较大在真机上实时推理需要优化。常见手段包括使用 4bit 或 8bit 量化减小显存占用。使用 TensorRT、ONNX Runtime 或 vLLM 等推理引擎。减少自回归生成步数用更紧凑的动作表示。将视觉编码部分提前缓存避免重复计算不变图像。10.5 安全边界必须最先实现任何情况下都建议优先实现硬件的安全保护逻辑再接入模型推理。速度限制、位置限制、急停机制、碰撞检测这些能力应该与模型完全解耦即使模型输出异常系统也能保证人员和设备安全。11. 总结与后续学习路径读完这篇文章你应该对 VLA 的全貌有了一个清晰印象VLM 解决的是“理解世界”的问题VLA 解决的是“理解之后如何行动”的问题OpenVLA 通过复用 VLM 技术栈证明了这条路的可行性Octo 通过条件注入解决了多机器人适配问题π₀ 则用 Flow Matching 为精细操作提供了新思路。如果想要继续深入学习建议按这个顺序推进先跑通 OpenVLA 的推理链路理解动作 token 的编解码过程。阅读 Open X-Embodiment 数据集说明了解 VLA 训练数据的来源和格式。选一个仿真环境例如 MuJoCo 相关机器人环境用历史轨迹数据做行为克隆实验。研究 π₀ 的 Flow Matching 实现对比它与自回归生成在动作质量上的差异。在具备安全条件的实验室中做一次真实机械臂部署把坐标系、归一化、推理延迟这些工程问题完整过一遍。使用网络搜索的素材注意替换为安全表述并重新组织代码部分均依赖于模型社区现状实际使用前请以官方仓库为准。建议收藏备用后续可以继续关注 VLA 的推理优化、数据飞轮和跨形态泛化这几个方向。