Pi0仿真与端侧运行

本章节将以Pi0模型为例,为您介绍该模型的仿真与端侧运行流程。

整体概览

VLA模型与机器人本体存在强耦合关系,表现为VLA模型的输入为机器人本体当前状态的视觉、关节传感器数据,模型的输出改变机器人本体状态,整体是一个不断交互更新的过程。 为方便在S600上体验Pi0,demo采用S600端侧推理结合PC仿真的方式完成,主要分为两个部分:

  1. 在PC部署RoboTwin仿真环境,用于得到模型输入和执行模型输出,以及观测Pi0模型推理效果。

  2. 在S600部署Pi0模型,用于端侧推理并统计耗时。

二者之间的通信通过以太网完成,S600需能通过网络连接至PC。

S600与PC仿真交互流程示意:

【 S600 】 【 PC 】 +-------------------+ +-------------------+ | OELLM 环境部署 | | x86 仿真环境部署 | +---------+---------+ +---------+---------+ | | v v +---------+---------+ +---------+---------+ | 运行模型 | | 运行仿真 | +---------+---------+ +---------+---------+ | | v v +---------+---------+ +---------+---------+ | 等待状态 |<------------------+ 发送状态 | +---------+---------+ +---------+---------+ | ^ v | +---------+---------+ +---------+---------+ | 模型推理 | | 仿真迭代 | +---------+---------+ +-----------+-------+ | ^ v | +---------+---------+ +---------+---------+ | 发送动作 +------------------->| 接收动作 | +-------------------+ +-------------------+

PC仿真部署

准备环境

  1. 下载仓库:
git clone https://github.com/D-Robotics/RoboTwin.git cd RoboTwin/ git checkout pi0pub
  1. 准备虚拟环境:
# RoboTwin目录下 conda create -n RoboTwin python=3.10 -y conda activate RoboTwin pip install uv # RoboTwin/policy/pi0目录下 cd policy/pi0 GIT_LFS_SKIP_SMUDGE=1 uv sync cp -r ./src/openpi/models_pytorch/transformers_replace/* .venv/lib/python3.11/site-packages/transformers/
  1. 安装cuboro:
# RoboTwin/policy/pi0目录下 conda deactivate source .venv/bin/activate # At this point, you should be in the (openpi) environment cd ../../envs git clone https://github.com/NVlabs/curobo.git cd curobo export CUROBO_DISABLE_CUDA_EXT=0 pip install -e . --no-build-isolation # 耗时较久
  1. 下载数据:
# 进入Robotwin/assets目录 # 以2M/s下载速度为标准,此流程需2h以上 bash download.sh

常见问题

  1. curboro安装失败

尝试export CUROBO_DISABLE_CUDA_EXT=1然后执行

pip install -e . --no-build-isolation # 耗时较久
  1. 高版本CUDA不适配

若您使用CUDA13.0及以上版本,需在执行uv sync后更新torch版本,在openpi虚拟环境中执行

pip install --pre torch torchvision --index-url https://download.pytorch.org/whl/nightly/cu130

修改配置

修改RoboTwin/task_config/config.yaml配置文件,如下所示:

# 测试相关 sample: 0 # 样本索引 rnd: false # 是否启用随机采样,false 表示使用sample的样本 restore: false # 是否启用断点续测 # 部署相关 stage: 3 # 测试阶段 OBS=0, SKIP, ACTION, FULL use_cpp: true # 是否仅使用端侧推理,仿真侧不执行推理(stage为FULL时可选) torch_model: "policy/pi0/torch_model/pi0_aloha_pytorch_hammer_vispruner_1126" # PyTorch 模型路径 port: 8888 # 监听socket连接的端口 # 滤波相关 filter: 0 # 滤波类型:0,禁用;1:ButterWorth;2:FIR;3:ZeroPhase cutoff: 3 # 截止频率 fs: 50 # 采样频率 channels: 14 # 滤波维度 # 推理相关 chunk: 50 # 每輪使用的chunk_size(max=50) visp: true # 使用vispruner词汇压缩 do_preproc: false # 发送预处理后的OBS do_postproc: false # 接收动作进行后处理 debug: false # 显示相关 use_video: true # 是否保存视频 spcam: false # 是否使用自定义camera,在_camera_config.yaml调整分辨率,在eval_policy.py中调整角度 raw_tri: false cat_dim: 1 # 拼接维度:0 竖拼,1 横拼 fresh: 0 # 图像刷新时间,0为不显示图像 hd: 2 # 图像放大倍数

需要您重点关注的参数:

  • port:与端侧进行通信的接口,需要与端侧配置对齐。
  • use_video:是否保存仿真视频,默认开启,关闭可小幅提升性能。
  • fresh:是否实时显示仿真场景,默认开启,关闭可小幅提升性能。
  • samplernd:验证使用的样本集,如sample=0时,rnd=false指使用现存的数据集0,rnd=true指随机采样新数据集0(若存在则覆盖)。
  • restore:是否启用断点续测,若为true则优先读取该任务中上一次中断的测试进度和配置,若为false则重新开始一轮eval。

仿真运行

进入RoboTwin/policy/pi0目录运行指令:

bash eval.sh beat_block_hammer demo_clean pi0_base_aloha_robotwin_full demo_clean 0 0

S600端侧部署

准备环境

阅读 端侧运行准备 章节做好端侧环境配置。

示例文件说明

oellm_runtime目录中,Pi0示例使用到的文件和文件夹如下所示:

. ├── configs # Tokenizer文件 │ └── Pi0_config ├── examples │ └── pi0_demo │ ├── proto # proto消息定义 │ ├── msg.proto │ ├── build_pi0.sh # 交叉编译脚本 │ ├── CMakeLists.txt │ ├── pi0_demo.cc # 可执行文件源码 │ ├── pi0 # 可执行文件 │ ├── run_pi0.sh # 端侧运行脚本 │ └── pi0_config.json # 端侧运行配置文件 ├── include ├── lib └── model ├── Pi0 │ ├── Pi0_hammer-beat-block_vision_224x224_w8_nash-p_corenum_1.hbm │ ├── Pi0_hammer-beat-block_language_w8_nash-p_corenum_4.hbm │ └── Pi0_hammer-beat-block_action_w8_nash-p_corenum_4.hbm └── resolve_model_nash-p.md # 端侧模型下载方式

配置文件说明

端侧运行配置文件{model}_config.json的配置参数及其说明:

参数名称参数说明可选/必选
siglip_hbm_path参数描述:vision模型路径
参数类型string
必选
paligemma_hbm_path参数描述:language模型路径
参数类型string
必选
action_hbm_path参数描述:action模型路径
参数类型string
必选
siglip_bpu_core参数描述:vision模型使用的bpu核,
设定多个值时按照[0,1,2,3]填写
参数类型[int]
必选
paligemma_bpu_core参数描述:language模型使用的bpu核,
设定多个值时按照[0,1,2,3]填写
参数类型[int]
必选
action_bpu_core参数描述:action模型使用的bpu核,
设定多个值时按照[0,1,2,3]填写
参数类型[int]
必选
tokenizer_dir参数描述:Tokenizer配置文件路径
参数类型string
必选
norm_stats_path参数描述:norm stats文件路径
参数类型string
必选
server_ip参数描述:端口号,需和仿真侧config.yaml配置端口对齐
参数类型int
默认配置8888
可选
stage参数描述:设定运行模式,通常无需修改,建议保持为6
参数类型int
必选
preproc参数描述:是否在端侧做预处理,建议设定为true
参数类型bool
必选
postproc参数描述:是否在端侧做后处理,建议设定为true
参数类型bool
必选
fs参数描述:动作滤波的采样频率,可根据动作效果调整,0为关闭滤波
参数类型double
必选

pi0_config.json参考配置示例:

{ "siglip_hbm_path": "../../model/Pi0/Pi0_hammer-beat-block_vision_224x224_w8_nash-p_corenum_1.hbm", "paligemma_hbm_path": "../../model/Pi0/Pi0_hammer-beat-block_language_w8_nash-p_corenum_4.hbm", "action_hbm_path": "../../model/Pi0/Pi0_hammer-beat-block_action_w8_nash-p_corenum_4.hbm", "siglip_bpu_core": [ 0,1,2 ], "paligemma_bpu_core": [ 0,1,2,3 ], "action_bpu_core": [ 0,1,2,3 ], "tokenizer_dir": "../../configs/Pi0_config/", "norm_stats_path": "../../configs/Pi0_config/norm_stats.json", "server_ip": "120.48.157.2", "server_port": 30001, "stage": 6, "preproc": true, "postproc": true, "fs": 15 }

端侧运行说明

示例提供运行脚本run_pi0.sh,运行指令参考:

cd /userdata/oellm_runtime/examples/pi0_demo/ bash run_pi0.sh

该脚本内容如下:

export LD_LIBRARY_PATH=../../lib:$LD_LIBRARY_PATH # 指定动态库 export HB_DNN_USER_DEFINED_L2M_SIZES=6:6:6:6 # 为BPU分配L2M大小 ./pi0 --config pi0_config.json

可执行文件的参数信息:

Usage: ./pi0 --config_path <config_path> [options] Options: -c, --config_path <config_path> Path to the pi0 config file (required) -h, --help Show this help message Examples: ./pi0 --config_path ./pi0_config.json

运行结果展示

S600

... Filter fs: 15 xlm init success 开始连接:120.48.157.2:30001 连接成功:120.48.157.2:30001 ... 接收成功,长度:691484字节 ===== 解析 Header 信息 ===== 序列号: 0 时间戳: 1770106723.66053628 重置仿真: 1 ===== 解析 Body 信息 ===== 接收到 3 个图像张量: 类型=1,维度=3 240 320 类型=1,维度=3 240 320 类型=1,维度=3 240 320 接收到 1 个语言张量: 类型=2,维度= 接收到 1 个状态张量: 类型=0,维度=14 ===== 开启 Pi0 推理 ===== Preprocess time: 1.573ms. Siglip infer time: 18.468ms. Paligemma infer time: 38.965ms. Action infer time: 38.578ms. Postprocess time: 0.059ms. Pi0 Total time: 97.888ms. =========================== 发送成功,长度:5651字节 ...

PC

... Render Well ============= Config ============= Messy Table: False Random Background: False Random Light: False Random Table Height: 0 Random Head Camera Distance: 0 Head Camera Config: D435, True Wrist Camera Config: D435, True Embodiment Config: aloha-agilex ================================== missing pytorch3d No model loaded! Load tokenizer success! NoFilter NoFilter Load model success! Task Name: beat_block_hammer Policy Name: pi0 Start new eval! ... 服务器启动成功,等待客户端连接...(端口:30001) 客户端已连接:IP=221.226.80.67, 端口=58799 发送成功,长度:691484字节 接收成功,长度:5651字节 ===== 解析 Header 信息 ===== 序列号 : 1 时间戳: 1770106723.508825449 ====== 解析 Body 信息 ====== 接收到 0 个图像张量: 接收到 1 个嵌入张量: 语言0:类型=0,维度=1 50 14 接收到 0 个状态张量: ============================ step: 1 / 400 ...

pi0/RoboTwin/eval_result目录还会生成机械臂抓取过程的完整视频,以下为视频截图展示: