前言

昇腾是华为推出的面向人工智能计算的全栈解决方案,包含芯片、软件及生态体系;其中,昇腾芯片是专为深度学习设计的专用处理器(NPU,Neural Processing Unit),基于华为自研的达芬奇(DaVinci)架构,具备高并行、高吞吐、低功耗等优势,旨在为深度学习训练和推理提供高性能、高能效的算力支持,广泛应用于数据中心、边缘计算和终端设备等多种场景。

具身智能AI大模型是一种结合感知、决策与行动能力的智能系统,通过物理或虚拟载体与环境交互。这类模型不仅依赖大规模数据训练,还整合传感器输入、运动控制等模块,实现实时环境适应与任务执行。其核心在于将抽象认知能力与具身体验结合,推动机器人、自动驾驶等领域的突破。典型应用包括自主导航、物体抓取、人机协作等,标志着AI从纯数字世界迈向物理世界的关键一步。

Pi0模型介绍

在 π0: A Vision-Language-Action Flow Model for General Robot Control 论文中提出了 Pi0 模型,Lerobot 基于Openpi的代码进行了迁移。

Pi0 是一种典型的基于 Diffusion 的模仿学习控制策略,该模型将机器人策略表示为一个条件去噪扩散过程,在叠衣服、整理桌面等具有挑战性的任务上表现良好,为主流VLA模型。

参考文献

● https://gitcode.com/cann/cann-recipes-embodied-intelligence

● https://github.com/huggingface/lerobot

● https://github.com/Physical-Intelligence/openpi

一、性能数据对比

测试平台 e2e时间
orangepi ai studio(ascend310p ep)torch_npu 400ms左右
orangepi ai station (ascend310p rc) acl lite推理 270ms左右

二、硬件平台介绍

笔者参考的相关源码仓库基本都是基于Atlas 800I A2服务器进行训练,Ascend 310P芯片 EP模式下进行推理的。这里我们只需要进行模型的推理,并不涉及训练,EP模式的标卡还需要一台有PCIE接口的电脑,这并不符合机器人目前的空间限制和功耗限制。在综合售价,性能等因素后,笔者选取了Ascend 310P芯片 RC模式的开发板来进行具身智能相关模型的部署。

刚好香橙派上线了OrangePi AI Station,其搭载了Ascend 310P处理器,集成 16个CPU核,主频可达 1.9GHz,10个AI core,主频可达1.08GHz,8个Vector核,主频可达1GHz;算力可达176TOPS,支持48GB/96GB LPDDR4X/LPDDR5,支持NVMe SSD 2280的M.2插槽,3个USB3.0、HDMI、千兆网口、TF插槽、40Pin扩展接口等,130*130mm的尺寸,能够方便的放入机器人内部,性能和外设接口也够用。

三、软件环境

框架/库 笔者测试的版本 兼容性
PyTorch 2.7.1 ✓ 完全兼容
torch_npu 2.7.1.post2 ✓ 完全兼容
CANN 8.5.0 ✓ 完全兼容
Python 3.10 ✓ 完全兼容
lerobot版本 0.3.4 ✓需要进行一些修改

四、部署步骤

4.1 懒人版本

注意:下面的命令仅适用于310P RC模式的环境,EP请按照原文步骤操作。onnx模型可以复用我提供的。

mkdir -p /models

cd /models

git clone https://modelers.cn/XLRJ/pi0.git

docker run --name pi0 -it -d --net=host --shm-size=10g \

--privileged=true \

--device=/dev/upgrade:/dev/upgrade \

--device=/dev/davinci_manager \

--device=/dev/davinci0:/dev/davinci0 \

--device=/dev/hisi_hdc \

--entrypoint=bash \

-v /etc/sys_version.conf:/etc/sys_version.conf \

-v /var/dmp_daemon:/var/dmp_daemon \

-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \

-v /var/slogd:/var/slogd \

-v /usr/local/Ascend/driver/lib64:/usr/local/Ascend/driver/lib64 \

-v /models:/models \

-v /home/:/home/ \

-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \

swr.cn-north-4.myhuaweicloud.com/toolsmanhehe/pi0:1.0-opiaistation-py310-ubuntu22.04-aarch64

docker exec -it pi0 bash

cd /root/cann-recipes-embodied-intelligence/manipulation/pi0/infer_with_om

#首次运行会有报错,有两个so文件找不到, 要先运行一次推理命令, 然后替换so库文件,后再次运行即可。

/root/replace.sh

python ./run_om_e2e.py \

--vlm-model-path /models/pi0/outputs/om/pi0_vlm.om \

--action-expert-model-path /models/pi0/outputs/om/pi0_action_expert_linux_aarch64.om

4.2 完整部署流程

这里有个前提,你已经刷入了香橙派提供的最新的镜像,并更新了香橙派提供的最新的驱动程序。

这里笔者使用的cann版本是社区的8.5.0版本,其他版本没有测试过,理论上也是可以用的。请自行安装

Ascend-cann-toolkit_8.5.0_linux-aarch64.run和

Ascend-cann-310p-ops_8.5.0_linux-aarch64.run。都是直接执行xxx.run --install,等他自己跑完,大概半个小时。

4.2.1 模型下载(下载到/models目录)

git clone https://huggingface.co/BrunoM42/pi0_aloha_transfer_cube

4.2.2 代码下载

下载到/root目录,其他目录也可以。

git clone https://gitcode.com/cann/cann-recipes-embodied-intelligence

cd cann-recipes-embodied-intelligence/manipulation

git clone https://github.com/huggingface/lerobot.git

cd lerobot

git checkout b0923ab74b7fb7ed688ef2abbe79607f3dee390a

# 如果checkout失败,执行下面两行再次checkout

git reset --hard HEAD

git clean -fdx

4.2.3 lerobot运行环境配置

# 注意,请先检查python版本,笔者是3.10的环境,请尽量使用3.10或者3.11环境

python3 --version

cd /root/cann-recipes-embodied-intelligence/manipulation/lerobot

pip install --upgrade pip setuptools wheel

#安装lerobot

pip install -e .

#安装仿真依赖(Aloha 仿真需要 gym_aloha / gym-aloha)

pip install -e ".[aloha]"

pip install numpy==1.26.0

pip install transformers==4.55.4

# 替换库文件

cd /usr/local/lib/python3.10/dist-packages/transformers/models/gemma

git apply -p1 /root/cann-recipes-embodied-intelligence/manipulation/pi0/infer_with_om/lib/modeling_gemma.patch

# 模型分部文件添加

cd /root/cann-recipes-embodied-intelligence/manipulation/pi0/infer_with_om/lerobot_modify

cp modeling_pi0_vlm.py /root/cann-recipes-embodied-intelligence/manipulation/lerobot/src/lerobot/policies/pi0/modeling_pi0_vlm.py

cp modeling_pi0_action_expert.py /root/cann-recipes-embodied-intelligence/manipulation/lerobot/src/lerobot/policies/pi0/modeling_pi0_action_expert.py

cp paligemma_with_expert_fp16.py /root/cann-recipes-embodied-intelligence/manipulation/lerobot/src/lerobot/policies/pi0/paligemma_with_expert_fp16.py

cp normalize.py /root/cann-recipes-embodied-intelligence/manipulation/lerobot/src/lerobot/policies/normalize.py

4.2.4 转换模型

这一步大概需要半小时左右,如果有条件,可以使用x86环境转换onnx模型。但需要保证cann版本和开发板环境一致。

pip install onnx pytest onnxscript onnxruntime

cd /root/cann-recipes-embodied-intelligence/manipulation/pi0/infer_with_om

./run_pi0_export.sh --pretrained-policy-path /models/pi0_aloha_transfer_cube/

INFO 2026-01-13 20:30:54 n_expert.py:225 正在验证ONNX模型输出...

INFO 2026-01-13 20:31:09 n_expert.py:245 onnx_inputs keys: ['observation.state', 'lang_tokens', 'lang_masks', 'past_kv_tensor', 'prefix_pad_masks', 'time', 'noise']

INFO 2026-01-13 20:31:09 n_expert.py:248 onnx output: [[[ 9.155e-02 1.547e-02 -3.125e-01 ... -1.035e-04 -1.986e-03 1.625e-03]

[ 9.290e-02 1.481e-02 -3.169e-01 ... 1.198e-05 -2.058e-03 1.667e-03]

[ 9.375e-02 1.418e-02 -3.188e-01 ... 6.539e-05 -2.245e-03 1.729e-03]

...

[ 7.355e-02 -4.894e-03 -2.379e-01 ... -4.821e-04 -2.073e-03 1.213e-04]

[ 7.373e-02 -5.474e-03 -2.374e-01 ... -3.872e-04 -2.092e-03 1.394e-04]

[ 7.458e-02 -5.817e-03 -2.391e-01 ... -3.588e-04 -2.003e-03 1.347e-04]]]

INFO 2026-01-13 20:31:09 n_expert.py:255 PyTorch输出形状: torch.Size([1, 50, 32])

INFO 2026-01-13 20:31:09 n_expert.py:256 ONNX输出形状: (1, 50, 32)

INFO 2026-01-13 20:31:09 n_expert.py:257 最大差异: 0.0002441

INFO 2026-01-13 20:31:09 n_expert.py:258 平均差异: 4.24e-05

INFO 2026-01-13 20:31:09 n_expert.py:259 余弦相似度(按最后一维) min/max/mean: 1.0000 / 1.0000 / 1.0000

Done. Part1 -> outputs/onnx/pi0-vlm.onnx, Part2 -> outputs/onnx/pi0-action_expert.onnx

cd /root/cann-recipes-embodied-intelligence/manipulation/pi0/infer_with_om

ls outputs/onnx/

pi0-action_expert.onnx pi0-action_expert.onnx.data pi0-vlm.onnx pi0-vlm.onnx.data

ls runtime_save/

past_kv_tensor.pth prefix_pad_masks.pth

4.2.5 使用ATC 将 ONNX 转为 OM

atc --model=outputs/onnx/pi0-vlm.onnx \

--framework=5 \

--output=outputs/om/pi0_vlm \

--soc_version=Ascend310P1 \

--precision_mode_v2=origin

atc --model=outputs/onnx/pi0-action_expert.onnx \

--framework=5 \

--output=outputs/om/pi0_action_expert \

--soc_version=Ascend310P1 \

--precision_mode_v2=origin

ls outputs/om/

pi0_action_expert_linux_aarch64.om pi0_vlm.om

4.2.6 安装并配置ACL

git clone https://gitee.com/ascend/samples.git

mkdir -p /usr/local/Ascend/thirdpart/aarch64/acllite

cp -r samples/python/common/acllite/* /usr/local/Ascend/thirdpart/aarch64/acllite

export PYTHONPATH=/usr/local/Ascend/thirdpart/aarch64/acllite:$PYTHONPATH

4.2.7 替换so

这一步是RC模式下特有的,必须在已有将被替换文件的情况下替换才能生效。一般运行了上一步ATC转换后就会有。

cp libtensorflow.so /root/aicpu_kernels/0/aicpu_kernels_device/sand_box/

cp libtf_kernels.so /root/aicpu_kernels/0/aicpu_kernels_device/

export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/root/aicpu_kernels/0/aicpu_kernels_device/sand_box/:/root/aicpu_kernels/0/aicpu_kernels_device/

4.2.8 与原始Pytorch输出相似度对比

对比最后打印的cos值,不小于0.95即可。如果是用的我懒人版本中提供的模型, 可以跳过这一步。

python3 verify_om_onnx_vlm.py \

--onnx-model-path outputs/onnx/pi0-vlm.onnx \

--om-model-path outputs/om/pi0_vlm.om \

--seed 42

INFO: ===== ONNX vs OM error metrics =====

INFO: past_kv_tensor: max_abs=0.263672 mean_abs=0.00251302 max_rel=4001.33 mean_rel=0.0469369 cos(min/max/mean)=0.999/1.000/1.000

python3 verify_om_onnx_action_expert.py \

--onnx-model-path outputs/onnx/pi0-action_expert.onnx \

--om-model-path outputs/om/pi0_action_expert_linux_aarch64.om

INFO: ===== ONNX vs OM error metrics =====

INFO: output_0: max_abs=0.000366211 mean_abs=4.87038e-05 max_rel=13.2631 mean_rel=0.0885526 cos(min/max/mean)=1.000/1.000/1.000

4.2.9 端到端 Pi0 模型推理

cd /root/cann-recipes-embodied-intelligence/manipulation/pi0/infer_with_om

python ./run_om_e2e.py \

--vlm-model-path ./outputs/om/pi0_vlm.om \

--action-expert-model-path ./outputs/om/pi0_action_expert_linux_aarch64.om

# 反归一化的参数默认值为示例模型的参数若需要自定义模型的反归一化参数,可以运行pytorch推理过程获得 mean.pt 和 std.pt 文件

cd ../../lerobot

python ./src/lerobot/scripts/eval.py --policy.path=/mnt/disk1/shared_data/pi0_aloha_model/ --env.type=aloha --env.task=AlohaTransferCube-v0 --env.episode_length=10

cd ../pi0/infer_with_om

# 获取到 mean.pt 和 std.pt 文件后,运行端到端OM推理:

python ./run_om_e2e.py \

--mean-path ../../lerobot/mean.pt \

--std-path ../../lerobot/std.pt \

--vlm-model-path ./outputs/om/pi0_vlm.om \

--action-expert-model-path ./outputs/om/pi0_action_expert_linux_aarch64.om

五、已知问题及解决方案

1、get index by name failed

参考这个issue:310P RC环境运行pi0模型报错get index name failed

六、总结与后续改进方向

当前基于昇腾310P的部署方案,已实现模型的高效推理验证。笔者在2天内实现npu推理,一周实现om模型的推理。若通过一些自己开发的agent辅助,能够进一步加快npu模型的适配进程。通过对算子执行路径与硬件资源利用情况的系统性分析,该方案还是具备显著的性能优化空间的,预计能将端到端推理耗时进一步优化至200ms。

从性能剖析数据可见,当前算子执行的硬件调度已初步达成预期,大部分算子成功在 AI CORE 上运行,AI CORE 的算力占比已达到较高水平。为了最大化发挥硬件算力,我们的核心优化思路是进一步提升计算流水线的密度与连续性,减少数据搬运开销,npu computer的时间占比越高越好。

image.png
也就是computing的流水线越密越好。
image.png

这里也感谢上海交大的同学对笔者提供的帮助。

后续,我们将围绕以下方向持续迭代优化:

框架升级:探索使用更底层的 ACL 框架替代现有实现,以挖掘更深层次的硬件性能。

算子融合:通过算子融合等图优化技术,减少算子调度开销,进一步压缩执行时间。

同时,也欢迎各位技术同仁共同探讨与贡献优化方案。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐