w
weasonlee/SimVLA-LIBERO
模型介绍
文件和版本
Pull Requests
讨论
分析

SimVLA-LIBERO (YuankaiLuo/SimVLA-LIBERO) 昇腾 NPU 适配

SimVLA(Luo et al., 2026, arXiv 2602.18224)是一个极简但强力的 Vision-Language-Action(VLA)机器人操作基线:严格解耦感知与控制——用标准视觉语言骨干(SmolVLM-500M-Instruct)加轻量 flow-matching 动作头,仅 0.5B 级参数即在标准仿真基准上超越数十亿参数模型,实机性能与 π0.5 相当。本仓库将 YuankaiLuo/SimVLA-LIBERO(LIBERO 版检查点)适配到 华为昇腾 Ascend 910 NPU,并完成与 CPU 的精度/性能对比验证。

模型信息

项目内容
上游模型YuankaiLuo/SimVLA-LIBERO(Apache-2.0,global_step 150000)
代码LUOyk1999/SimVLA
任务VLA 机器人操作——图像+指令+本体状态 → 动作块(LIBERO 基准)
架构SmolVLM-500M-Instruct 视觉语言骨干(forward_vlm_efficient 统一编码 3 视角图像与指令,输出 158×960 特征)+ SmolVLMActionTransformer flow-matching 动作头(concat 模式,24 层,hidden 1024,16 头,dim_time 32)
参数量811.4M(vlm 489 键 + transformer 动作头 297 键)
动作空间libero_joint:dim_action=7(delta_xyz + delta_euler + gripper)、dim_proprio=8、num_actions=10(动作块长度)
输入input_ids (B,50)、image_input (B,3,3,384,384)(3 视角)、image_mask (B,3)、proprio (B,8)
输出flow-matching 速度场 v_t (B,10,7);10 步 Euler 积分得动作块 actions (B,10,7)

适配环境

组件版本
NPUAscend 910 ×2(64GB HBM)
CANN8.5.1
torch2.9.0
torch_npu2.9.0.post1
transformers / Python4.57.6 / 3.11

适配要点

  1. 骨干重定向:checkpoint 的 config 中 smolvlm_model_path 指向 HuggingFaceTB/SmolVLM-500M-Instruct,加载前重定向到本地目录(骨干权重 489 键已内嵌 checkpoint,仅需 processor/tokenizer/config 文件)。
  2. AutoConfig 注册:上游未将 smolvlm_vla 注册进 transformers AutoConfig,直接 AutoConfig.from_pretrained 会报"未知架构";适配为先 AutoConfig.register("smolvlm_vla", SmolVLMVLAConfig) 再加载。
  3. 依赖补齐:上游 modeling 代码 import json_numpy(FastAPI 序列化用),补装 pip install json_numpy。
  4. 精度对比方式(action token teacher-forcing 等价):该模型动作头非自回归离散 token,而是连续 flow-matching 速度场——对应自回归模型的 logits。固定 t ∈ {0.25, 0.5, 0.75} 与固定 x_t(种子噪声+合成归一化动作),teacher-forcing 前向得 v_t 逐点对比;再以固定初始噪声跑 10 步 Euler 积分对比最终动作块。两设备输入经 processor 缓存逐比特一致。
  5. 合成输入:PIL 合成 3 视角 LIBERO 风格桌面场景(桌垫+红目标+蓝/黄方块,视角平移+噪声),2 条自然语言指令,本体状态取典型末端位姿。

部署步骤

# 1. 准备目录与权重(VLA 检查点 ~3.1GB,已放入 models/,不随仓库分发)
mkdir -p /data/SimVLA-LIBERO && cd /data/SimVLA-LIBERO
HF_ENDPOINT=https://hf-mirror.com HF_HUB_DOWNLOAD_TIMEOUT=120 python -c \
  "from huggingface_hub import snapshot_download; snapshot_download('YuankaiLuo/SimVLA-LIBERO', local_dir='models')"

# 2. 下载 SmolVLM-500M-Instruct 骨干(processor/config,VLM 权重已在 checkpoint 内)
HF_ENDPOINT=https://hf-mirror.com python -c \
  "from huggingface_hub import snapshot_download; snapshot_download('HuggingFaceTB/SmolVLM-500M-Instruct', local_dir='smolvlm_local')"

# 3. 克隆上游源码(提供 models/ 包)
git clone https://github.com/LUOyk1999/SimVLA.git sim_repo

# 4. 安装依赖(含 json_numpy)
pip install -r requirements.txt

# 5. 运行推理(teacher-forcing v_t 对比 + Euler 动作生成)
python inference.py --device npu   # NPU 推理 + 自动精度对比
python inference.py --device cpu   # CPU 推理 + 自动精度对比

推理示例

import sys, torch
sys.path.insert(0, "sim_repo")
from models.configuration_smolvlm_vla import SmolVLMVLAConfig
from models.modeling_smolvlm_vla import SmolVLMVLA
from models.processing_smolvlm_vla import SmolVLMVLAProcessor
from transformers import AutoConfig

AutoConfig.register("smolvlm_vla", SmolVLMVLAConfig)   # 上游未注册
cfg = AutoConfig.from_pretrained("models", trust_remote_code=True)
cfg.smolvlm_model_path = "smolvlm_local"               # 重定向骨干
model = SmolVLMVLA.from_pretrained("models", config=cfg).float().to("npu").eval()

proc = SmolVLMVLAProcessor(smolvlm_model_path="smolvlm_local")
inputs = proc(images=[pill_views], language_instruction=["pick up the red mug"])  # 3 视角
inputs = {k: v.to("npu") for k, v in inputs.items()}
inputs["proprio"] = torch.rand(1, 8, device="npu")

actions = model.generate_actions(**inputs, steps=10)   # -> (1, 10, 7) 动作块

CPU vs NPU 精度与性能对比

测试条件:PIL 合成 3 视角桌面场景(384×384)+ 2 条指令,fp32;teacher-forcing 取 t∈{0.25,0.5,0.75} 固定 x_t,Euler 生成用固定初始噪声(seed 2026);两设备输入逐比特一致(processor 输出缓存复用)。

精度(teacher-forcing 速度场 v_t = 动作头 logits 等价物 + Euler 最终动作)

输出cos_simmax_abs_errmean_abs_err
v_t (t=0.25, 2×10×7)1.0000000.0005170.000045
v_t (t=0.50, 2×10×7)1.0000000.0001970.000043
v_t (t=0.75, 2×10×7)1.0000000.0001870.000035
actions(10 步 Euler, 2×10×7)1.0000000.0001630.000026

性能

指标CPU (fp32)NPU (fp32)NPU 加速比
VLM 编码(3 视角×2 指令)2.483 s0.544 s4.6×
10 步 Euler 动作生成(稳态均值)5.600 s0.095 s58.9×

所有输出 cos_sim = 1.000000(max_abs_err ≤ 6e-4),处于 fp32 舍入误差范围,NPU 与 CPU 精度完全对齐。

仓库结构

├── inference.py        # NPU/CPU 推理 + teacher-forcing/Euler 精度对比
├── make_assets.py      # 生成 assets/ 信息图
├── requirements.txt    # Python 依赖
├── readme.md           # 本文件
├── assets/
│   ├── agent_workflow.png   # 适配工作流
│   ├── npu_device_call.png  # NPU 设备与推理证据
│   └── model_result.png     # 模型结果信息图
├── outputs/            # 推理输出(npz/json,gitignore)
├── models/             # VLA 检查点(gitignore)
├── smolvlm_local/      # SmolVLM 骨干 processor/config(gitignore)
└── sim_repo/           # 上游源码(gitignore)

引用

@article{luo2026simvla,
  title={SimVLA: A Simple VLA Baseline for Robotic Manipulation},
  author={Luo, Yuankai and Chen, Woping and Liang, Tong and Wang, Baiqiao and Li, Zhenguo},
  journal={arXiv preprint arXiv:2602.18224},
  year={2026}
}