OpenVLA-7B 视觉-语言-动作模型在昇腾 NPU 上的推理适配。
OpenVLA-7B 是一个开源的视觉-语言-动作模型,用于机器人操作任务。
| 项目 | 值 |
|---|---|
| 模型类型 | VLA (Vision-Language-Action) |
| 参数量 | 7B |
| 语言 Backbone | Llama-2-7b |
| 视觉编码器 | SigLIP |
| 输入 | 图像 + 文本指令 |
| 输出 | 7维动作向量 (x, y, z, roll, pitch, yaw, gripper) |
| 型号 | 状态 |
|---|---|
| Ascend910 | ✅ 已验证 |
| Ascend910B3 (A3) | ✅ 已验证 |
镜像选择: 根据芯片类型选择对应镜像
- Ascend910:
cann:8.5.1-ubuntu22.04-py3.10- Ascend910B3 (A3):
cann:8.5.1-a3-ubuntu22.04-py3.11
| 软件名 | 版本 |
|---|---|
| CANN | 8.5.1 |
| Python | 3.10 |
| torch | 2.9.0+cpu |
| torch-npu | 2.9.0 |
| torchvision | 0.24.0 |
| transformers | 4.40.1 |
| timm | 0.9.16 |
# 创建容器 (Ascend910B3/A3)
docker run -d \
--name openvla-npu \
--privileged \
--device /dev/davinci_manager \
--device /dev/devmm_svm \
--device /dev/hisi_hdc \
--device /dev/davinci0 \
-v /usr/local/dcmi:/usr/local/dcmi:ro \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi:ro \
-v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/:ro \
-v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info:ro \
-v /etc/ascend_install.info:/etc/ascend_install.info:ro \
-v /data/npu_adapter/openvla:/data \
--shm-size=16g \
-p <ssh_port>:22 \
swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.1-a3-ubuntu22.04-py3.11 \
sleep infinity
# Ascend910 (非A3) 请将镜像替换为:
# swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.1-ubuntu22.04-py3.10
# 安装并配置 SSH
docker exec openvla-npu bash -c "apt-get update && apt-get install -y openssh-server"
docker exec openvla-npu mkdir -p /run/sshd
docker exec openvla-npu sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
docker exec openvla-npu sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
docker exec openvla-npu /usr/sbin/sshd
docker exec openvla-npu bash -c "echo 'root:<your_password>' | chpasswd"重要参数说明:
--privileged: 特权模式,允许容器访问宿主机设备(开发测试环境推荐):ro: 只读挂载,保护宿主机文件--shm-size=16g: 共享内存大小,大模型推理需要权限替代方案(生产环境推荐): 如需更精细的权限控制,可用
--cap-add替代--privileged:--cap-add=SYS_PTRACE \ --cap-add=IPC_LOCK \ --cap-add=SYS_ADMIN \
Capability 用途 SYS_PTRACE调试和性能分析 IPC_LOCK锁定共享内存,NPU 内存管理需要 SYS_ADMIN设备管理和资源控制
# 进入容器
docker exec -it openvla-npu bash
# 设置环境变量
export LD_LIBRARY_PATH=/usr/local/Ascend/driver/lib64:/usr/local/Ascend/driver/lib64/driver:/usr/local/Ascend/ascend-toolkit/latest/runtime/lib64:/usr/local/Ascend/ascend-toolkit/latest/acllib/lib64:$LD_LIBRARY_PATH
source /usr/local/Ascend/ascend-toolkit/set_env.sh# 安装 pip(镜像默认未安装)
apt-get update && apt-get install -y python3-pip
# 先安装基础依赖(不含 torch 相关)
pip3 install transformers==4.40.1
pip3 install Pillow accelerate
# 安装 timm(使用 --no-deps 避免自动安装 torch)
pip3 install timm==0.9.16 --no-deps
# 最后安装 PyTorch、torch-npu 和 torchvision(确保版本正确)
pip3 install torch==2.9.0+cpu --index-url https://download.pytorch.org/whl/cpu
pip3 install torch-npu==2.9.0
pip3 install torchvision==0.24.0 --no-deps重要:
- torchvision 必须使用
--no-deps安装,否则会自动升级 torch 版本,导致 torch-npu 不兼容。- 安装顺序很重要,先安装 timm 再安装 torch/torch-npu,避免 pip 自动解析版本冲突。
python run_inference_npu.py \
--image_path test_image.jpg \
--instruction "pick up the red block"示例输出:
Loading model on npu:0...
Model loaded successfully.
Instruction: pick up the red block
Action Vector: [0.0074, 0.0112, -0.0073, 0.0069, 0.0186, 0.0257, 0.996]
- Position (x, y, z): 0.0074, 0.0112, -0.0073
- Rotation (roll, pitch, yaw): 0.0069, 0.0186, 0.0257
- Gripper: 0.996 (open)
Inference time: 0.60sOpenVLA 使用 timm 的 SigLIP ViT 作为视觉编码器,timm 依赖 torchvision 的 transforms 和 FrozenBatchNorm2d。
关键发现:
| 组件 | 版本要求 | 说明 |
|---|---|---|
| transformers | 4.40.1 | 4.41.0 会导致输出乱码 |
| timm | 0.9.16 | OpenVLA 要求 >= 0.9.10 且 < 1.0.0 |
| torch-npu | 2.9.0 | 必须与 CANN 8.5.1 匹配 |
# 正确的 dtype 设置
for k, v in inputs.items():
if hasattr(v, 'to'):
if v.dtype in [torch.int64, torch.int32]:
inputs[k] = v.to("npu:0") # 保持 int 类型
else:
inputs[k] = v.to("npu:0", dtype=torch.float16) # float16| 设备 | 推理时间 | 加速比 |
|---|---|---|
| NPU (Ascend910B3) | 0.60s | 42x |
| CPU | 25.03s | 1x |
| 指标 | 结果 |
|---|---|
| Token Match | ✅ True |
| Action Match | ✅ True |
| Max Diff | 0.0 |
NPU 与 CPU 输出完全一致,精度无损。
原因: 依赖版本不正确
解决:
--no-deps 安装原因: transformers 版本不兼容
解决: 安装 transformers==4.40.1
原因: 其他进程占用 NPU 资源
解决: 执行 npu-smi info 查看进程,kill 占用进程
原因: CANN/torch-npu 版本不匹配或 AICore 数量不支持
解决:
Apache-2.0