华为昇腾910B部署Pi-0.5具身智能模型简记

发表于 3 小时前  3 次阅读


文章目录

一、背景概述

Pi-0.5 是 Physical Intelligence 团队推出的视觉-语言-动作(VLA)具身智能模型,采用"双系统"架构——高层语义理解与底层动作执行协同工作,能在完全陌生的环境中持续执行复杂任务 10-15 分钟。相比 Pi-0,Pi-0.5 通过异构数据协同训练显著提升了开放世界泛化能力,在训练时未见过的场景中也能保持与特定环境训练模型相当的执行效果。

华为昇腾 DrivingSDK 已对 Pi-0.5 完成 NPU 适配,支持在 Atlas 800T A2(910B)上进行训练。本文记录在 910B 单机 8 卡环境下的完整部署与训练流程。

二、环境准备

硬件环境

  • **芯片**:华为昇腾 910B × 8
  • **宿主机**:ARM64(aarch64)架构

软件版本

组件版本
CANN8.3.RC1
PyTorch2.7.1
torch_npu2.7.1
Python3.10
基础镜像cann:8.1.rc1-910b-ubuntu22.04-py3.10

Docker 部署

由于 910B 为 ARM 架构,需使用华为昇腾专用 Docker 镜像。基础镜像从华为云 SWR 拉取:

docker pull --platform=arm64 swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.1.rc1-910b-ubuntu22.04-py3.10

**ARM64 原生环境**启动容器(8 卡全部挂载,shm-size 设为 500G 以满足训练需求):

docker run -itdu root --privileged --name=pi --net=host \
  --shm-size 500g \
  --device=/dev/davinci0 --device=/dev/davinci1 \
  --device=/dev/davinci2 --device=/dev/davinci3 \
  --device=/dev/davinci4 --device=/dev/davinci5 \
  --device=/dev/davinci6 --device=/dev/davinci7 \
  --device=/dev/davinci_manager --device=/dev/hisi_hdc \
  --device=/dev/devmm_svm \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
  -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
  -v /usr/local/sbin:/usr/local/sbin \
  -v /etc/hccn.conf:/etc/hccn.conf \
  -v /etc/localtime:/etc/localtime \
  -v /data/z84185676:/data/ \
  swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.1.rc1-910b-ubuntu22.04-py3.10 bash

**注意**:务必映射 `msnpureport` 以支持 NPU 状态监控。

**x86 宿主机**通过 QEMU 模拟 ARM64 启动(开发调试场景):

docker run --name=pi -it --privileged --net=host \
  -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static \
  -v /etc/timezone:/etc/timezone:ro \
  -v /etc/localtime:/etc/localtime:ro \
  -v /mnt1/:/data \
  swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.1.rc1-910b-ubuntu22.04-py3.10 bash

三、CANN 升级至 8.3.RC1

基础镜像自带 CANN 8.1.RC1,需要升级到 8.3.RC1。从华为 Ascend 仓库下载三个 runfile 包:

wget -c https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/CANN/CANN%208.3.RC1/Ascend-cann-toolkit_8.3.RC1_linux-aarch64.run --no-check-certificate > wget-toolkit.log 2>&1 &
wget -c https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/CANN/CANN%208.3.RC1/Ascend-cann-kernels-910b_8.3.RC1_linux-aarch64.run --no-check-certificate > wget-kernel.log 2>&1 &
wget -c https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/CANN/CANN%208.3.RC1/Ascend-cann-nnal_8.3.RC1_linux-aarch64.run --no-check-certificate > wget-nnal.log 2>&1 &

依次安装(注意 kernels 为全新安装,其余为升级):

# 升级 Toolkit
./Ascend-cann-toolkit_8.3.RC1_linux-aarch64.run --upgrade --install-for-all -q
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 安装 NPU Kernels(910B 专用)
./Ascend-cann-kernels-910b_8.3.RC1_linux-aarch64.run --install --install-for-all -q
# 升级 NNAL(ATB 推理加速库)
./Ascend-cann-nnal_8.3.RC1_linux-aarch64.run --upgrade --install-for-all -q

配置环境变量,确保每次登录自动生效:

source /usr/local/Ascend/ascend-toolkit/set_env.sh
source /usr/local/Ascend/nnal/atb/set_env.sh

安装基础依赖:

apt update
apt-get install git vim wget gcc cmake curl iproute2 python3-dev python3-venv bc -y

安装 PyTorch NPU 版:

pip install torch==2.7.1
pip install torch_npu==2.7.1

四、模型环境安装

4.1 拉取 DrivingSDK

git clone https://gitcode.com/Ascend/DrivingSDK.git
cd DrivingSDK/model_examples/Pi-0.5

4.2 安装 LeRobot(昇腾适配版)

git clone https://github.com/huggingface/lerobot.git
cd lerobot
git checkout b954337ac7c8db5ea592c0d59dfb435845d9d380
cp -f ../pi05.patch .
cp -rf ../test/ .
git apply pi05.patch
pip install -e .
cd ..

4.3 安装 Transformers(特定分支)

git clone https://github.com/huggingface/transformers.git
cd transformers
git checkout fix/lerobot_openpi
git checkout dcddb970176382c0fcf4521b0c0e6fc15894dfe0
pip install -e .
cd ..

4.4 安装 MindSpeed(昇腾加速库)

git clone https://gitcode.com/Ascend/MindSpeed.git
cd MindSpeed
git checkout c357f9d2fd6f35365c9dc86f4792b8779420b667
pip install -e .
cd ../lerobot

4.5 依赖冲突说明

安装过程中可能出现 numpy 版本冲突(te/opencv-python-headless 等包依赖不同版本的 numpy),不影响训练,可忽略:

te 0.4.0 requires ml-dtypes, tornado (未安装,不影响)
opencv-python-headless requires numpy>=2, but numpy 1.26.0 (降级后可正常运行)
rerun-sdk requires numpy>=2 (训练不依赖)

五、数据准备

5.1 数据集下载

下载 koch_test 数据集(V2.1 格式),解压后需转换为 LeRobot V3.0 格式:

gzip -d koch_test.zip

5.2 数据集格式转换

python -m lerobot.datasets.v30.convert_dataset_v21_to_v30 --repo-id=/data/koch_test

5.3 计算分位数统计

python src/lerobot/datasets/v30/augment_dataset_quantile_stats.py --repo-id=/data/koch_test

该步骤会计算数据集的 quantile 统计信息,用于训练时的动作归一化。80 个 episodes 处理耗时约 2.5 小时。完成后数据集 meta 中会包含统计信息,再次运行会跳过计算。

**关键修复**:如果数据集仅存放在本地(不推送到 HuggingFace Hub),需注释掉 `augment_dataset_quantile_stats.py` 中的 `push_to_hub()` 调用,改用 `save_to_disk()` 本地保存。

push_to_hub修复代码截图

六、权重准备

6.1 Pi-0.5 预训练权重

下载 Pi-0.5 base 权重:

# 从 HuggingFace 下载
# https://huggingface.co/lerobot/pi05_base

6.2 PaLiGemma 视觉编码器权重

Pi-0.5 使用 PaLiGemma-3B-224 作为视觉编码器。在离线或有防火墙的环境下,模型无法自动下载权重。需手动下载:

  • **HuggingFace**:https://huggingface.co/google/paligemma-3b-pt-224
  • **ModelScope**(国内更快):https://modelscope.cn/models/google/paligemma-3b-pt-224

下载后放到 `/root/paligemma-3b-pt-224`,执行路径替换脚本:

bash test/paligemma_weights_mod.sh /root/paligemma-3b-pt-224

**注意**:如果需要更换 paligemma 权重路径,还需修改 `src/lerobot/processor/tokenizer_processor.py` 中的路径配置。

七、训练执行

7.1 指定 NPU 设备

export ASCEND_RT_VISIBLE_DEVICES=4,5,6,7

7.2 启动训练

cd /root/DrivingSDK/model_examples/Pi-0.5/lerobot
# 单机8卡性能模式
bash test/train_performance.sh /data/koch_test /data/pi05_base/
# 单机8卡精度模式
bash test/train_full.sh /data/koch_test /data/pi05_base/

训练参数说明:

参数必选/可选说明
dataset_path必选koch_test 数据集路径,如 `/data/koch_test`
pi05_weights必选Pi-0.5 预训练权重路径,如 `/data/pi05_base`

八、训练结果

训练日志示例(每 20 步打印一次):

step=20 smpl=1640 ep=2 loss=2.021 grdn=1.234 lr=2.9e-07 udpt_s=1.23 data_s=0.45
step=40 smpl=1K ep=3 loss=1.949 grdn=0.987 lr=7.9e-07 udpt_s=1.18 data_s=0.42
step=60 smpl=2K ep=5 loss=1.896 grdn=0.856 lr=1.3e-06 udpt_s=1.21 data_s=0.44

可观察到 loss 稳步下降(2.021 → 1.949 → 1.896),learning rate 处于 warm-up 阶段逐步上升。

Pi-0.5训练日志输出

性能对比

Atlas 800T A3(910B)单机 8 卡与竞品 H 的性能对比(30k iterations):

平台精度Global BatchsizeTraining LossFPS(每秒样本数)
竞品 Hbf16640.00570.8
Atlas 800T A3bf161280.004155.1

昇腾 910B 在 Pi-0.5 训练任务上 FPS 达到竞品 H 的 **2.2 倍**,且支持更大的 global batchsize,training loss 也更低。

九、踩坑记录

9.1 push_to_hub 报错

数据集分位数统计完成后,`augment_dataset_quantile_stats.py` 默认调用 `push_to_hub()` 推送到 HuggingFace Hub。如果本地路径不符合 HF repo_id 格式,会报错:

HFValidationError: Repo id must be in the form 'repo_name' or 'namespace/repo_name': '/data/koch_test'

**解决方案**:注释掉 `push_to_hub()` 调用,改用 `save_to_disk()` 本地保存。

9.2 numpy 版本冲突

安装 MindSpeed 时会降级 numpy 到 1.26.0,与 opencv-python-headless、rerun-sdk 的 numpy>=2 要求冲突。此冲突不影响 Pi-0.5 训练,可直接忽略。

9.3 torchcodec 不可用

ARM64 平台缺少 torchcodec,训练时会 fallback 到 pyav 解码视频,功能正常但会有 warning:

'torchcodec' is not available in your platform, falling back to 'pyav' as a default decoder

不影响训练,可忽略。

9.4 镜像保存与复用

配置好的环境可以导出为 Docker 镜像,方便后续复用。用户提供的打造好的镜像为 `pi-8.3.rc1-910b-ubuntu22.04-py3.10-20250228.tar.gz`:

# 解压镜像
gzip -d pi-8.3.rc1-910b-ubuntu22.04-py3.10-20250228.tar.gz
# 导入镜像
docker load -i pi-8.3.rc1-910b-ubuntu22.04-py3.10-20250228.tar
# 拉起容器
docker run -itdu root --privileged --name=pi --net=host \
  --shm-size 500g \
  --device=/dev/davinci0 ... --device=/dev/davinci7 \
  --device=/dev/davinci_manager --device=/dev/hisi_hdc \
  --device=/dev/devmm_svm \
  -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
  -v /usr/local/Ascend/firmware:/usr/local/Ascend/firmware \
  -v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
  -v /usr/local/sbin:/usr/local/sbin \
  -v /etc/hccn.conf:/etc/hccn.conf \
  -v /etc/localtime:/etc/localtime \
  -v 模型权重等文件的映射路径:/data/ \
  pi:8.3.rc1-910b-ubuntu22.04-py3.10-20250228 bash
# 进入容器
docker exec -it pi bash

十、参考链接

  • DrivingSDK Pi-0.5 官方文档:https://gitcode.com/Ascend/DrivingSDK/blob/master/model_examples/Pi-0.5/README.md
  • LeRobot 官方仓库:https://github.com/huggingface/lerobot
  • MindSpeed 昇腾加速库:https://gitcode.com/Ascend/MindSpeed
  • PaLiGemma 权重(ModelScope):https://modelscope.cn/models/google/paligemma-3b-pt-224
  • CANN 软件包下载:https://www.hiascend.com/software/cann

简记。

本站文章基于国际协议BY-NA-SA 4.0协议共享;
如未特殊说明,本站文章皆为原创文章,请规范转载。

0

scanz个人博客