[嵌入式AI从0开始到入土]嵌入式AI系列教程

注:等我摸完鱼再把链接补上
可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。

第1期 昇腾Altas 200 DK上手
第2期 下载昇腾案例并运行
第3期 官方模型适配工具使用
第4期 炼丹炉的搭建(基于Ubuntu23.04 Desktop)
第5期 炼丹炉的搭建(基于wsl2_Ubuntu22.04)
第6期 Ubuntu远程桌面配置
第7期 下载yolo源码及样例运行验证
第8期 在线Gpu环境训练(基于启智ai协作平台)
第9期 转化为昇腾支持的om离线模型
第10期 jupyter lab的使用
第11期 yolov5在昇腾上推理
第12期 yolov5在昇腾上应用
第13期_orangepi aipro开箱测评
第14期 orangepi_aipro小修补含yolov7多线程案例
第15期 orangepi_aipro欢迎界面、ATC bug修复、镜像导出备份
第16期 ffmpeg_ascend编译安装及性能测试
第17期 Ascend C算子开发
第18期 Ascend C算子开发环境(S5赛季)
第19期 vllm Ascend初体验
第20期 在Ascend上使用ComfyUI部署SD模型
第21期 基于昇腾310P RC模式的Pi0模型部署实践
未完待续…



前言

昇腾(Ascend)是华为推出的一系列面向人工智能计算的专用处理器(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模型。

参考文献


一、硬件平台介绍

笔者参考的相关源码仓库基本都是基于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的尺寸,能够方便的放入机器人内部,性能和外设接口也够用。

二、部署步骤

2.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

2.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,等他自己跑完,大概半个小时。

2.2.1 模型下载(我下载到了/models目录)

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

2.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

2.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

2.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

2.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

2.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

2.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/

2.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

2.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

三、性能数据对比

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

四、已知问题及解决方案

1、get index by name failed

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

五、总结与后续改进方向

当前实测性能数据和nVidia orin仍有一些差距,笔者分析过相关相关性能数据,还是有希望优化到200ms左右的。欢迎各位大神提交相关的PR。这里也感谢上海交大的同学对笔者提供的帮助。
后续可以尝试使用ACL框架替代ACL Lite框架来实现更好的性能,部分算子也可以使用融合算子来优化执行时间。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐