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) |
| 组件 | 版本 |
|---|---|
| NPU | Ascend 910 ×2(64GB HBM) |
| CANN | 8.5.1 |
| torch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| transformers / Python | 4.57.6 / 3.11 |
smolvlm_model_path 指向 HuggingFaceTB/SmolVLM-500M-Instruct,加载前重定向到本地目录(骨干权重 489 键已内嵌 checkpoint,仅需 processor/tokenizer/config 文件)。smolvlm_vla 注册进 transformers AutoConfig,直接 AutoConfig.from_pretrained 会报"未知架构";适配为先 AutoConfig.register("smolvlm_vla", SmolVLMVLAConfig) 再加载。json_numpy(FastAPI 序列化用),补装 pip install json_numpy。# 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) 动作块测试条件: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_sim | max_abs_err | mean_abs_err |
|---|---|---|---|
| v_t (t=0.25, 2×10×7) | 1.000000 | 0.000517 | 0.000045 |
| v_t (t=0.50, 2×10×7) | 1.000000 | 0.000197 | 0.000043 |
| v_t (t=0.75, 2×10×7) | 1.000000 | 0.000187 | 0.000035 |
| actions(10 步 Euler, 2×10×7) | 1.000000 | 0.000163 | 0.000026 |
性能
| 指标 | CPU (fp32) | NPU (fp32) | NPU 加速比 |
|---|---|---|---|
| VLM 编码(3 视角×2 指令) | 2.483 s | 0.544 s | 4.6× |
| 10 步 Euler 动作生成(稳态均值) | 5.600 s | 0.095 s | 58.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}
}