十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenVLA 在昇腾 310P 的离线推理与仿真部署指南:ONNX 导出、OM 转换与精度验证全流程

OpenVLA 在昇腾 310P 的离线推理与仿真部署指南:ONNX 导出、OM 转换与精度验证全流程 OpenVLA 在昇腾 310P 的离线推理与仿真部署指南ONNX 导出、OM 转换与精度验证全流程【免费下载链接】cann-recipes-embodied-ai本项目针对具身智能业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-embodied-ai导读本文基于 CANN 开源仓库cann-recipes-embodied-ai中 manipulation/openvla/infer_with_om 目录提供的 OpenVLA 适配样例完整讲解如何在 Ascend 310P 上把 OpenVLA 视觉-语言-动作VLA大模型从 PyTorch 权重一步步转换为昇腾亲和的离线模型OM并完成推理、仿真评测与精度验证。读完本文你将掌握PyTorch → 5 段式 ONNX → ATC 转 OM → OM-backend LIBERO 仿真评测的完整部署链路以及基于 mock 输入和基于 MuJoCo/LIBERO 仿真环境的两类精度验证方法并能理解各环节关键脚本convert_and_verify_onnx.py、convert_onnx_to_om.sh、verify_om_onnx.py的底层实现原理。OpenVLA 模型概览OpenVLAOpen-Source Vision-Language-Action Model是《OpenVLA: An Open-Source Vision-Language-Action Model》论文中提出的一种典型视觉-语言-动作VLA通用控制模型其论文编号为 arXiv:2406.09246。OpenVLA 的核心思想是将视觉观测与语言指令统一编码到同一序列表示中利用自回归autoregressive生成方式输出动作表示如动作 token 或离散化动作序列再解码为可执行的连续控制量。通过在大规模多任务机器人示范数据上学习从感知与语义到动作的统一映射OpenVLA 旨在提升跨任务、跨场景的泛化能力并降低为每个任务单独训练策略的成本。本样例使用的示例模型为 OpenVLA 官方在libero_object数据集上微调后发布的 7B 模型openvla-7b-finetuned-libero-object可先通过huggingface-cli等工具将其下载到本地models/目录pip install -U huggingface_hub huggingface-cli download openvla/openvla-7b-finetuned-libero-object --local-dir models模型输入与输出说明OpenVLA 的输入由**文本指令token与图像张量pixel_values**共同构成。当启用fused vision backbone时pixel_values的通道数为633表示同一帧图像经过两套视觉预处理后在通道维拼接。输入Inputs输入名含义dtypeshape示例备注input_ids指令/提示词的 token 序列int64[B, T]T为文本 token 长度包含特殊 tokenB为 batch size常见为 1attention_mask文本 token 的有效位掩码bool或int64/int32依实现而定[B, T]1/True 表示有效 token0/False 表示 paddingpixel_values摄像头 RGB 图像经 processor 预处理后的张量float16常见[B, C, H, W]若use_fused_vision_backboneTrue则C633否则C3输出Outputs输出名含义dtypeshape示例备注actions/generated_ids动作 token或离散动作序列的 token idint64常见[B, A]A为动作维度/动作 token 个数通常由action_dim决定后续需用bin_centersaction_norm_stats反归一化得到连续动作参数符号说明Bbatch size离线验证通常为 1。T文本 token 序列长度由 prompt 长度与 tokenizer 规则决定含特殊 token。H, Wprocessor 输出的视觉输入分辨率常见为 224×224具体以 processor 配置为准。仓库中 vla_validation_utils.py 的get_image_size_from_processor会从processor.image_processor.size读取读取失败时回退到默认值 224×224。C图像通道数启用 fused backbone 时为633两套视觉塔输入拼接否则为3。A动作序列长度/动作维度通常等于action_dim与机器人自由度、动作表示方式有关。昇腾 310P 运行环境配置与昇腾平台相关的环境配置.om模型转换及运行需要安装 CANN 软件包。本样例的编译执行依赖 CANN 开发套件包cann-toolkit与 CANN 二进制算子包cann-kernels支持的 CANN 软件版本为CANN 8.0.0-8.2.RC1。请从软件包下载地址下载对应架构软件包并参考 CANN 安装文档依次安装。# ${cann_install_path} 为 CANN 包的实际安装目录注意每次新建终端时首先 source 一下 set_env.sh。 # 方式1默认路径安装以 root 用户为例 source /usr/local/Ascend/ascend-toolkit/set_env.sh # 方式2指定路径进行安装 source ${cann_install_path}/ascend-toolkit/set_env.sh与昇腾服务器无关的环境配置# 创建运行环境 conda create -y -n openvla python3.10 conda activate openvla # 拉取 openvla 仓库并安装示例 git clone https://github.com/openvla/openvla.git cd openvla pip install -e .仿真渲染MuJoCo无头模式如果服务器/容器缺少显示环境或 OpenGL 渲染后端MuJoCo 可能无法正常渲染。可以在运行仿真/评测前指定 EGL 无头渲染export MUJOCO_GLegl昇腾 310P 上的推理部署流程本节介绍离线推理模式通过昇腾亲和的 OM 文件的部署参考。推荐的单机链路如下在 310P 宿主机导出 ONNX使用 Host CPU使用 ATC 将 ONNX 转为 OM在 310P 上使用 OM-backend sim-evaluator 在仿真环境评测在 310P 上。需要在转化 ONNX 的机器上额外安装 ONNX Runtime 依赖pip install onnx # 基于 Host CPU 转换 ONNX 请安装310P 宿主机执行 pip install onnxruntime # 基于 Host GPU 转换 ONNX 请安装 pip install onnxruntime-gpu步骤一导出 ONNXPyTorch → ONNX先对 transformers 库打算子适配补丁导出前需要先对环境中transformers库的 LLaMA 实现进行算子转化修复确保 OM 模型转换时能匹配昇腾亲和的算子。仓库在 lib/modeling_llama.patch 提供了补丁文件其核心改动有两点从补丁内容可见LlamaRMSNorm 的方差计算将hidden_states.pow(2).mean(-1, keepdimTrue)改写为hidden_states.pow(2).sum(dim-1, keepdimTrue) / hidden_states.shape[-1]即把求均值显式拆解为求和再除以维度规避算子转换时对mean的亲和性问题因果掩码causal mask构造将torch.triu(causal_mask, diagonal1)改写为基于row_idx/col_idx的col_idx row_idx逐元素比较后masked_fill使掩码逻辑在 ONNX 图中以昇腾友好的算子表达。应用补丁cd /path/to/conda/envs/openvla/lib/python3.10/site-packages/transformers/models/llama git apply --check -p1 /path/to/openvla/modeling_llama.patch git apply -p1 /path/to/openvla/modeling_llama.patch运行 ONNX 导出与校验脚本在 HostCPU 或 GPU上执行 convert_and_verify_onnx.py# 以本地目录为例models/ 里包含 config.json 等文件 python3 convert_and_verify_onnx.py \ --model-path models/openvla-7b-finetuned-libero-object \ --vision-export-dir outputs/onnx/vision \ --llama-prefill-export-dir outputs/onnx/llama_prefill \ --llama-decoder-export-dir outputs/onnx/llama_decoder \ --unnorm-key libero_object该脚本的 CLI 参数可从源码main()函数convert_and_verify_onnx.py中确认除上述 5 个必填参数外还支持参数默认值说明--prompt标准测试 promptpick up the alphabet soup and place it in the basket用于构造 dummy 输入的文本指令--no-validateFalse跳过导出后的精度校验--validate-onlyFalse只校验已存在的 ONNX 模型不重新导出--providerCPUExecutionProviderONNX Runtime 执行后端--target-seq-len288多模态序列统一 padding 到的目标序列长度从源码结构看该脚本将 OpenVLA 模型拆分为 5 个子模型分别导出这是 OM 转换与 NPU 离线推理的关键设计ONNX 文件对应子模块输入 → 输出作用vision_backbone.onnxmodel.vision_backbonepixel_values→patch_features视觉主干特征提取projector.onnxmodel.projectorpatch_features→projected_patch_embeddings视觉特征投影到语言嵌入空间embedding.onnxmodel.get_input_embeddings()input_ids→input_embeddings文本 token 嵌入input_ids维度为动态轴vla_prefill.onnxLlamaPrefillWrapper(language_model)multimodal_attention_mask、position_ids、multimodal_embeddings→logits 全部past_key_values首轮 Prefill生成完整 KV Cachevla_decoder.onnxLlamaDecoderWrapper(language_model)input_ids、multimodal_attention_mask、position_ids 全部past_key_values→logits 更新后的 KV Cache逐 token 自回归 Decode其中LlamaPrefillWrapper/LlamaDecoderWrapper两个封装类见 convert_and_verify_onnx.py会把past_key_values按层展开/拍平以适配 ONNX 静态图的输入输出命名present_{layer}_{key|value}、past_{layer}_{key|value}导出时统一使用opset_version14。多模态嵌入的拼接逻辑为[输入嵌入首 token] [投影后的视觉 patch 嵌入] [输入嵌入其余 token]并在target_seq_len288下用pad_token_id32000的嵌入补齐序列、用original_effective_seq_len - 1作为 padding 位置的 position id——PyTorch 与 ONNX 两条路径prepare_multimodal_inputs_torch与prepare_multimodal_inputs_numpy逻辑完全一致这正是最终输出能逐位对齐的保证。默认情况下脚本会用 ONNXRuntime CPU 对比 PyTorch 输出并打印 max/mean diff如需跳过可加--no-validate。样例输出如下 Validating Full Inference Pipeline [1/2] Running PyTorch inference... [2/2] Running ONNX inference... Loading ONNX models with provider: CPUExecutionProvider... ONNX models loaded successfully. [3/3] Comparing results... full_pipeline_action: max abs diff 0.000000e00 full_pipeline_action: mean abs diff 0.000000e00 full_pipeline_action: ✓ MATCH (rtol0.001, atol0.001, mean_diff_threshold1e-2) PyTorch action: [ 1.43156521e-01 2.43907466e-02 9.26470588e-01 -3.15118654e-05 7.75504180e-02 -3.35294148e-02 0.00000000e00] ONNX action: [ 1.43156521e-01 2.43907466e-02 9.26470588e-01 -3.15118654e-05 7.75504180e-02 -3.35294148e-02 0.00000000e00] ✅ Full pipeline validation passed! 上述对比逻辑可在源码validate_full_pipeline与 vla_validation_utils.py 的compare_outputs中找到默认容差rtol1e-3, atol1e-3并额外要求平均绝对差小于mean_diff_threshold1e-2。步骤二ATC 将 ONNX 转为 OM在 310P 上已安装并sourceCANN 环境执行仓库提供的 convert_onnx_to_om.sh./convert_onnx_to_om.sh \ --vision-onnx-dir outputs/onnx/vision \ --llama-prefill-onnx-dir outputs/onnx/llama_prefill \ --llama-decoder-onnx-dir outputs/onnx/llama_decoder \ --vision-om-dir outputs/om/vision \ --llama-prefill-om-dir outputs/om/llama_prefill \ --llama-decoder-om-dir outputs/om/llama_decoder \ --soc-version Ascend310P3当模型转换完成后各个 ONNX 模型转换出的.om模型应位于相应的指定 output 目录中终端输出应包含ATC run success, welcome to the next use。该脚本内部对各模型使用了不同的 ATC 参数源码 convert_onnx_to_om.sh理解这些细节有助于排查转换问题模型额外 ATC 参数原因vision_backbone/projector无不加--precision_mode_v2origin视觉分支对精度模式不敏感embedding--input_shapeinput_ids:1,-1 --dynamic_dims1;32 --input_formatND需支持动态序列长度配合预填/解码两种输入规模vla_prefill--precision_mode_v2originPrefill 阶段保留原始精度以保证 KV Cache 质量vla_decoder--precision_mode_v2origin --input_shapeinput_ids:1,1Decode 阶段每次只输入 1 个新 token脚本统一使用--framework5ONNX 框架标识调用 ATCSOC_VERSION默认值即为Ascend310P3并会在 ONNX 文件所在目录内执行atcpushd到 onnx 目录以正确解析外部权重文件。步骤三使用 OM-backend sim-evaluator 进行仿真评测在 310P 上执行需要 ACL/ACLLite Python 依赖可用。仿真评测是在 OpenVLA 官方给出的 LIBERO 仿真评测基础上修改而来可以通过应用仓库sim/目录下的仿真适配补丁获得 OM-backend 仿真评测代码环境。仿真相关补丁位于 manipulation/openvla/infer_with_om/sim 目录下包含robot_utils.patch、openvla_utils.patch、run_libero_eval.patch三个补丁以及一个需要新增的文件 openvla_om_utils.py。# 确保处于 openvla 仓库根目录 cd openvla git apply --check /path/to/xxx.patch git apply xxx.patch # 新增文件需置于 experiments/robot/ 目录下 cp /path/to/openvla_om_utils.py ./experiments/robot/从 openvla_om_utils.py 的源码结构看它实现了与verify_om_onnx.py中一致的 OM 推理管线封装AclLiteResource负责 ACL 运行时资源device/context/stream初始化与释放VisionModel基于AclLiteImageProcDVPP 图像处理与AclLiteModel封装三个视觉 OM 模型的推理LLaMA 的 prefill/decode 则基于带状态管理的KVStatefulModel见 acllite_kv_model.py该类实现了 KV Cache 的设备侧常驻内存管理解码循环中不再把 KV 反复拷回 Host从而降低数据传输开销。准备好代码环境后运行以下命令进行仿真评测python3 -m experiments.robot.libero.run_libero_eval \ --model_family openvla \ --pretrained_checkpoint models/openvla-7b-finetuned-libero-object/ \ --task_suite_name libero_object \ --center_crop True \ --vision_backbone_om outputs/om/vision/vision_backbone.om \ --projector_om outputs/om/vision/projector.om \ --embedding_om outputs/om/vision/embedding.om \ --prefill_om outputs/om/llama_prefill/vla_prefill.om \ --decode_om outputs/om/llama_decoder/vla_decoder.om输出说明评测结果日志会写入experiments/logs包含成功率等信息仿真结果视频位于rollout/date目录下date为日期。OpenVLA 在昇腾上的精度验证以下介绍两种验证转换后的.om模型在 NPU 上运行结果的方法。方法一基于 mock 数据输入与原始 PyTorch 输出对比构造固定输入如全 0/随机图像 固定指令 token对比 PyTorch CPU/GPU 与 OM 在 310P NPU 上的输出精度。在 310P 上执行需要 ACL/ACLLite Python 依赖python3 verify_om_onnx.py \ --model-path models/openvla-7b-finetuned-libero-object \ --unnorm-key libero_object \ --vision-backbone-om outputs/om/vision/vision_backbone.om \ --projector-om outputs/om/vision/projector.om \ --embedding-om outputs/om/vision/embedding.om \ --prefill-om outputs/om/llama_prefill/vla_prefill.om \ --decode-om outputs/om/llama_decoder/vla_decoder.om从 verify_om_onnx.py 源码可知其验证流程用AutoProcessor 随机 dummy 图像构造输入dummy 图像尺寸默认取自 processor 配置也可用--image-width/--image-height/--seed覆盖初始化 ACL 资源并依次加载 5 个 OM 模型从 PyTorch 模型提取action_dim、vocab_size、bin_centers、action_norm_stats等后处理元数据这些不进入 OM 图只在 Host 侧做动作反归一化执行 OM 推理得到generated_ids调用 vla_validation_utils.py 的post_process_action得到连续动作与 PyTorchpredict_action(do_sampleFalse)的结果用rtol1e-3, atol1e-3对比并打印前若干元素。其中post_process_action的动作解码逻辑为取生成序列末尾action_dim个 token → 用vocab_size - token_id映射为离散索引并 clip 到bin_centers范围内 → 查表得到归一化动作 → 依据action_norm_stats中的q01/q99与mask反归一化为真实动作值0.5 * (x1) * (q99 - q01) q01这正是 README 中需用bin_centersaction_norm_stats反归一化的源码实现。方法二基于仿真模拟器的功能测试MuJoCo / LIBERO使用libero仿真环境数据在 NPU 上进行推理在 Host CPU 上进行仿真渲染或控制循环python3 -m experiments.robot.libero.run_libero_eval \ --model_family openvla \ --pretrained_checkpoint models/openvla-7b-finetuned-libero-object/ \ --task_suite_name libero_object \ --center_crop True \ --vision_backbone_om outputs/om/vision/vision_backbone.om \ --projector_om outputs/om/vision/projector.om \ --embedding_om outputs/om/vision/embedding.om \ --prefill_om outputs/om/llama_prefill/vla_prefill.om \ --decode_om outputs/om/llama_decoder/vla_decoder.om该方法与前文步骤三的仿真评测命令完全一致只是用途不同前者用于部署验证后者作为端到端功能与精度验证手段。评测日志含成功率写入experiments/logs仿真视频输出到rollout/date目录。适配工程目录结构完成上述全部步骤后OpenVLA 适配昇腾的工程目录树示例如下格式 ├── README.md # 中文使用指南 ├── README_en.md # 英文使用指南本文对应文档 ├── models # Hugging Face 或其他来源下载的模型 ├── openvla/ │ ├── convert_and_verify_onnx.py # PyTorch - ONNX 转化脚本 │ ├── verify_om_onnx.py # PyTorch(CPU) vs OM(NPU) 误差对比 │ ├── vla_validation_utils.py # 精度验证辅助方法 │ ├── convert_onnx_to_om.sh # ONNX - OM 转化脚本 │ ├── acllite_kv_model.py # 设备侧 KV Cache 状态管理模型封装 │ ├── lib │ │ └── modeling_llama.patch # 对 transformers lib 的适配补丁 │ └── sim │ ├── robot_utils.patch # 仿真文件 robot_utils.py 补丁 │ ├── openvla_utils.patch # 仿真文件 openvla_utils.py 补丁 │ ├── run_libero_eval.patch # 仿真文件 run_libero_eval.py 补丁 │ └── openvla_om_utils.py # 仿真新增 OM-Backend 支持文件 └── outputs ├── onnx/ # 输出的 onnx 格式模型 └── om/ # 输出的 om 格式模型各文件在仓库中的实际位置为 manipulation/openvla/infer_with_om脚本与补丁以及 manipulation/openvla/infer_with_om/lib、manipulation/openvla/infer_with_om/sim补丁目录。关键实现要点小结五段式模型拆分视觉主干、投影器、文本嵌入、LLaMA Prefill、LLaMA Decoder 分别导出 ONNX/OM是让 7B 级 VLA 模型能在 310P 这类设备上离线推理的核心工程手段固定序列长度多模态序列统一 padding 到target_seq_len288pad_token_id32000解码循环中通过KV Cache 索引搬移 截断技巧让动态长度在静态图中得以表达精度一致性保障transformers的 RMSNorm 与因果掩码算子改写补丁、Pre/Decode 的precision_mode_v2origin精度模式、以及导出后的 PyTorch↔ONNX↔OM 三级对比校验共同保证了最终动作输出的数值一致KV Cache 设备侧常驻acllite_kv_model.py 的KVStatefulModel将 KV Cache 保留在设备内存中减少 Host↔Device 拷贝提升自回归解码效率。引用article{kim24openvla, title{OpenVLA: An Open-Source Vision-Language-Action Model}, author{{Moo Jin} Kim and Karl Pertsch and Siddharth Karamcheti and Ted Xiao and Ashwin Balakrishna and Suraj Nair and Rafael Rafailov and Ethan Foster and Grace Lam and Pannag Sanketi and Quan Vuong and Thomas Kollar and Benjamin Burchfiel and Russ Tedrake and Dorsa Sadigh and Sergey Levine and Percy Liang and Chelsea Finn}, journal {arXiv preprint arXiv:2406.09246}, year{2024} }【免费下载链接】cann-recipes-embodied-ai本项目针对具身智能业务中的典型模型、加速算法提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-embodied-ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表