跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

OpenVLA 在机器人平台上的微调与部署指南

综述由AI生成OpenVLA 模型在机器人平台上的量化、推理及微调流程。涵盖 INT4/FP8/FP16 量化测试,基于 NanoLLM 的推理 API 使用,以及利用 MimicGen 进行仿真数据生成。通过 LoRA 和全量微调对比,展示了在 Jetson AGX Orin 及 A100/H100 上的训练配置与性能表现,最终在积木堆叠任务中达到约 85% 的成功率,为 VLA 模型在真实场景的部署提供参考。

ByteFlow发布于 2026/4/5更新于 2026/5/2428 浏览
OpenVLA 在机器人平台上的微调与部署指南

文章配图

本教程旨在提供用于部署 VLA 模型的优化量化和推理方法,以及针对新机器人、任务和环境的参考微调流程。在一个自包含的仿真环境中,结合场景生成和领域随机化(MimicGen)对性能和准确性进行严格验证。

  • ✅ 针对 VLA 模型的量化和推理优化
  • ✅ 原始 OpenVLA-7B 权重的准确性验证
  • ✅ 基于合成数据生成的参考微调工作流程
  • ✅ 在 Jetson AGX Orin 上使用 LoRA 进行设备端训练,以及在 A100/H100 实例上进行完全微调
  • ✅ 在示例积木堆叠任务中通过领域随机化达到 85% 的准确率
  • ✅ 提供用于复现结果的示例数据集和测试模型

文章配图

1. 量化

文章配图

已在 NanoLLM 的流式 VLM 管道中添加对 OpenVLA 的支持,使用 MLC 在 INT4/FP8 量化下运行,并利用 TensorRT 以 FP16 精度执行视觉编码器。

首先,我们将在 BridgeData V2 数据集(来自 Open X-Embodiment 集合中权重最高的数据集之一)上测试模型。该数据集也是模型的训练集,用于在部署时验证量化和推理是否正确。

文章配图

下面的命令会启动容器、下载数据集和模型(如有必要)、在首次运行时进行量化,并使用归一化均方误差(NRMSE)来衡量模型预测动作值与数据集真实值之间的准确度。

INT4:

jetson-containers run $(autotag nano_llm) \
 python3 -m nano_llm.vision.vla --api mlc \
 --model openvla/openvla-7b \
 --quantization q4f16_ft \
 --dataset dusty-nv/bridge_orig_ep100 \
 --dataset-type rlds \
 --max-episodes 10 \
 --save-stats /data/benchmarks/openvla_bridge_int4.json

FP8

jetson-containers run $(autotag nano_llm) \
 python3 -m nano_llm.vision.vla --api mlc \
 --model openvla/openvla-7b \
 --quantization q8f16_ft \
 --dataset dusty-nv/bridge_orig_ep100 \
 --dataset-type rlds \
 --max-episodes 10 \
 --save-stats /data/benchmarks/openvla_bridge_fp8.json

FP16

jetson-containers run $(autotag nano_llm) \
 python3 -m nano_llm.vision.vla --api hf \
 --model openvla/openvla-7b \
 --dataset dusty-nv/bridge_orig_ep100 \
 --dataset-type rlds \
 --max-episodes 10 \
 --save-stats /data/benchmarks/openvla_bridge_fp16.json
  • 使用 --save-stats 可以将逐帧指标和平均值保存到文件;
  • 使用 --max-episodes 可以限制处理的 episode 数量。

文章配图

  • 测试环境:Jetson AGX Orin 64GB,JetPack 6
  • 量化精度对比:后续微调模型在 INT4 上的准确度将与 FP8/FP16 保持一致

每一帧都会打印模型预测的 7 维动作向量及其真实值,以及该帧的准确率、延迟和帧率。

# INT4 step 355 [-0.02692 0.00776 -0.00299 0.08160 0.07292 0.04791 0.99608] accuracy 0.8466 ~0.9017 time=336.2 ms fps=2.96 ~2.97 gt 355 [-0.02387 0.00760 -0.00318 0.15965 0.07707 0.03281 1.00000]
# FP8 step 355 [-0.02392 0.00767 -0.00310 0.08160 0.07692 0.03217 0.99608] accuracy 0.9982 ~0.9523 time=469.7 ms fps=2.13 ~2.12 gt 355 [-0.02387 0.00760 -0.00318 0.15965 0.07707 0.03281 1.00000]
# FP16 step 355 [-0.02392 0.00767 -0.00310 0.08160 0.07692 0.03217 0.99608] accuracy 0.9982 ~0.9531 time=842.3 ms fps=1.19 ~1.18 gt 355 [-0.02387 0.00760 -0.00318 0.15965 0.07707 0.03281 1.00000]

Bridge 数据集已包含在训练集中,下面我们还会在未参与训练、具有更大场景变化的新数据上再次运行测试。此工具同样支持加载 Open X-Embodiment 中的 RLDS/TFDS 格式数据集,以及 Robomimic/MimicGen 的 HDF5 格式数据。

2. 推理 API

在容器中使用 NanoLLM 库对摄像头流运行 VLA 推理的代码非常简单:

from nano_llm import NanoLLM
from nano_llm.plugins import VideoSource

# 加载视觉 - 语言 - 动作模型(VLA),使用 q4f16_ft 量化方式
model = NanoLLM.from_pretrained(model, quantization='q4f16_ft')
# 打开摄像头(或视频流),在 CUDA 流 0 上进行处理
camera = VideoSource(video_source, cuda_stream=0)
assert(model.vla)

while True:
    # 捕获一帧图像
    image = camera.capture()
    if image is None:
        continue
    
    # 基于当前图像和指令,预测动作向量
    actions = model.vla.predict_action(
        image,
        instruction="pick up the nearest object",
        action_space="normalized",
        return_tensors='np'
    )
    # 将 actions 发给机器人控制器或 IK 解算器去执行
    ...

quantization='q4f16_ft':在推理时使用 INT4 + FP16 混合量化,并进行过微调,以在嵌入式设备(如 Jetson)上获得最佳性能和精度平衡。

3. 在线验证

鉴于该任务领域的挑战性、动态反馈回路以及仿真/训练/推理的计算需求,使用 VLA 进行语言引导的灵巧操作相比于仅使用 LLM 和 VLM,复杂度显著提升。

要从在 token 级别预测 logits,到在一系列连续帧中不断输出足够正确的动作以形成有用行为,就必须在训练和推理流程的每个阶段交叉检验输出并衡量准确度。

弥合仿真到现实的鸿沟:使用 NVIDIA Isaac Lab 训练 Spot 四足机运动

在训练期间,会根据真实动作标签(即有多少动作 token 被准确预测)来测量 token 分类准确率,模型通过最小化该损失来优化。

同时,也会根据还原出的实值输出与真实值的 L1 误差来衡量连续域动作准确率。由于 token 分类不对'更接近目标'提供额外奖励,连续动作准确率通常会略高于分类准确率。

实际上,为了在类似环境中成功完成任务,这两项准确率都应保持在 95% 以上。

为了达到如此高的准确度,相关工作和研究中通常会故意让模型在相同的 90 万个 episode 上训练多达 30 个 epoch(OpenVLA),以实现'过拟合'。Transformer 擅长通过少量示例记忆特定知识,但也对过拟合和遗忘先前学到的信息非常敏感。

在本项目的微调阶段,我们评估了不同训练 episode 数量与重复数据 epoch 数量对模型准确率和任务成功率的影响。

直到推理阶段才会测量实际的任务成功率,此时模型要么连入仿真器,要么在相似条件下进行一系列耗时的物理实验。

我们将 MimicGen 直接集成到 OpenVLA 的训练脚本中,以源源不断地产生全新的数据,但在模型处理了大量 episode 后,遇到了梯度不稳定的问题。

4. 用 MimicGen 仿真

MimicGen 利用场景图信息和任务/子任务的元数据,仅凭 10 个远程示教样本,就能生成随机化的训练回合——将原始示教轨迹插值到新的、随机的位置和姿态中。

这样即可产生大量独特的训练数据,提高模型的鲁棒性,而无需投入大量人工来教机器人新技能和行为。

文章配图

MimicGen 构建在 Robomimic 和 Robosuite 仿真器之上,可与 VLA 一同在 Jetson 上无头运行,极大简化了可复现性实验的环境搭建。

MimicGen 包含 12 种任务,例如块状物堆叠、抓取与放置、装配以及厨房场景。每种任务都有随着学习进展而难度递增的多个变体。

在本教程阶段,我们将聚焦'块状物堆叠'任务,以了解要达到论文中 >75–80% 的成功率,所需的训练需求和运行时性能指标。

4.1 数据生成

我们基于一份针对 aarch64+igpu 做了补丁的代码分支,构建了用于 Jetson 的 MimicGen 容器,并增加了一些功能增强:

  • 为相关任务生成带有随机变体的自然语言标签
  • 对物体的颜色/材质做额外的领域随机化

在训练 OpenVLA 时,会将图像和标签保存到磁盘;而后续的推理则在在线仿真中完成,以测量任务成功率。

下面的命令会生成指定数量的训练回合,保存为 Robomimic HDF5 格式。

jetson-containers run $(autotag nano_llm) \
 python3 -m mimicgen.generate \
 --tasks Stack_D4 \
 --episodes 100 \
 --output /data/datasets/mimicgen \
 --cameras agentview \
 --camera-width 224 \
 --camera-height 224

4.3 RLDS 转换

OpenVLA 使用基于 TFDS 的 RLDS 格式数据集,所以我们提供了一个从 HDF5 到 RLDS 的转换工具。

jetson-containers run $(autotag nano_llm) \
 python3 -m nano_llm.datasets \
 --dataset /data/datasets/mimicgen/demo_src_stack_task_D4/demo.hdf5 \
 --dataset-type mimicgen \
 --convert rlds \
 --remap-keys agentview:image \
 --output /data/datasets/mimicgen/rlds/stack_d4_ep2500

运行转换后,会在指定的输出目录下生成一组 TFRecord 文件,这些文件能够被 OpenVLA 的训练脚本直接加载使用。

5. 微调

本项目的主要目标之一是量化让模型适应不同机器人和任务所需的训练工作量。

我们的开发流程主要包括在 Jetson AGX Orin 64GB 上运行测试性 LoRA 微调并本地调试问题,当结果令人满意时,再在 A100/H100 云实例上,使用 FDSP 完整地进行微调。

以下是我们曾使用的训练 GPU 配置及相应的最大化显存利用的 batch size:

文章配图

在 Jetson AGX Orin 和两块 A100 上训练至收敛大约需要 24–36 小时,具体时长取决于数据量和训练轮数(epoch)。为了尽量避免前文提到的过拟合,我们在完整微调时将 epoch 控制在 5 次以内,而通过增加训练回合数来提升模型表现。

具体过程可以看 OpenVLA 的官方 repo。

6. 推理和仿真

为了衡量模型在完成任务时的真实表现,我们在 Agent Studio 中启动了一个与 VLA 模型相连的 MimicGen 环境。它通过检查仿真发放的奖励来统计成功回合数。

jetson-containers run $(autotag nano_llm) \
 python3 -m nano_llm.studio --load OpenVLA-MimicGen-INT4
jetson-containers run $(autotag nano_llm) \
 python3 -m nano_llm.studio --load OpenVLA-MimicGen-FP8
jetson-containers run $(autotag nano_llm) \
 python3 -m nano_llm.studio --load OpenVLA-MimicGen-FP16

要开始基准测试,只需将 AutoPrompt 节点的输出连接到 OpenVLA 节点。默认情况下它会无限运行。

这里每个方框都是一个「模块」,线条表示数据流向。

  1. WebAudioIn: 从浏览器或麦克风抓取实时音频流。
  2. VADFilter: 检测「有人在说话」的时段,自动切掉静音与噪声。
  3. WhisperASR: 用 OpenAI Whisper 做自动语音识别,输出 partial 和 final 文字。
  4. TextOverlay → VideoOutput: 把识别出来的文字叠加到视频帧上,推送最终合成的图像。
  5. UserPrompt: 用户也可以手工在这里输入文字。
  6. AutoPrompt: 综合出一个'List'格式的、给 LLM 的 Prompt 列表。
  7. MimicGen: 视觉 + 语言的示范合成器,内部根据示例自动生成更多'虚拟示范'。
  8. openvla-7b+stac: 把上游的 Prompt 列表喂给一个 7B 参数量的 VLA 模型,输出一系列 actions。
  9. Actions: 回流到 VideoOutput,驱动仿真里的机械臂做实际操作。

此次测试使用的是在 2500 回合数据上微调 4 个 epoch 的模型。尽管任务相对简单,该模型依然证明能够达到约 85% 的预期成功率。量化对性能的提升几乎呈线性增长,对准确率的影响不到 1%。

文章配图

在评估了那些使用较少回合但训练更多轮次的微调模型的成功率后,我们清楚地看到了增大数据集规模所带来的影响:

文章配图

这并不意味着使用 2500 回合训练的模型就没有过拟合——事实上,它已经学会了总是先堆放小方块,基本忽略了指令。要解决这个问题,就需要在训练中引入更多任务多样性。

与此同时,我们也希望将研究扩展到现实世界场景,而不仅仅局限于仿真环境,以验证模型在真实操作中的可行性。

7. 总结

本文展示了 OpenVLA 模型在机器人平台上的完整工作流,包括量化测试、推理 API 调用、仿真数据生成及微调策略。通过对比不同量化精度和训练数据规模,验证了在 Jetson 边缘设备及云端 GPU 上的部署效果,为 VLA 模型的实际应用提供了技术参考。

目录

  1. 1. 量化
  2. INT4 step 355 [-0.02692 0.00776 -0.00299 0.08160 0.07292 0.04791 0.99608] accuracy 0.8466 ~0.9017 time=336.2 ms fps=2.96 ~2.97 gt 355 [-0.02387 0.00760 -0.00318 0.15965 0.07707 0.03281 1.00000]
  3. FP8 step 355 [-0.02392 0.00767 -0.00310 0.08160 0.07692 0.03217 0.99608] accuracy 0.9982 ~0.9523 time=469.7 ms fps=2.13 ~2.12 gt 355 [-0.02387 0.00760 -0.00318 0.15965 0.07707 0.03281 1.00000]
  4. FP16 step 355 [-0.02392 0.00767 -0.00310 0.08160 0.07692 0.03217 0.99608] accuracy 0.9982 ~0.9531 time=842.3 ms fps=1.19 ~1.18 gt 355 [-0.02387 0.00760 -0.00318 0.15965 0.07707 0.03281 1.00000]
  5. 2. 推理 API
  6. 加载视觉 - 语言 - 动作模型(VLA),使用 q4f16_ft 量化方式
  7. 打开摄像头(或视频流),在 CUDA 流 0 上进行处理
  8. 3. 在线验证
  9. 4. 用 MimicGen 仿真
  10. 4.1 数据生成
  11. 4.3 RLDS 转换
  12. 5. 微调
  13. 6. 推理和仿真
  14. 7. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • ALEPython 机器学习模型解释与特征分析指南
  • Python 一键拆分 PDF:按章节建文件夹并导出单页(支持书签与正文识别)
  • 国内环境部署 OpenClaw 个人 AI 助手指南
  • C++ 二叉搜索树原理与高效实现
  • Spring Boot 配置加载顺序详解
  • Flutter 组件 sse_stream 在鸿蒙系统的适配与高并发背压处理方案
  • Git 工作流程详解:从核心概念到场景化选择
  • Java String 不可变性深度解析
  • C++ 多态机制详解:概念、实现与原理
  • 国内信息安全专业 A 及 A+ 类高校排名详解
  • JSON 技术详解:从诞生历史到核心优势
  • PyTorch 生成式人工智能:StyleGAN 详解与实现
  • 本地离线部署 Whisper 模型进行语音转写
  • 【AI】谷歌TurboQuant算法:内存占用减少至少6倍
  • Linux 网络编程实战:基于 C++ 实现 JSON 与 HTTP Web 服务器
  • 鸿蒙系统开发技术指南:ArkTS、ArkUI与Stage模型详解
  • Python 版本选择指南:3.10 至 3.13 特性对比与推荐
  • Claude Code Viewer: Web 端 Claude Code 会话管理工具
  • SQL 注入详解:从原理到实战
  • 华为 P30 系列从鸿蒙 4.2 降级至 EMUI 9 实战指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online