X-VLA(eXtensions for Versatile Language-Action)是一类用于真机操控的视觉-语言-动作模型。与常规对话大模型不同,它的输入是当前的视觉画面与一句操作指令,输出则是机器人下一步的关节/末端执行器动作。本仓库对应 WidowX 机器人专版,模型规模约 0.9B,采用 Florence2 编码视觉与文本、SoftPromptedTransformer 负责流匹配去噪,一次推理产出 30 帧动作。
我们完成了该模型在华为昇腾 Ascend910 NPU 上的适配,包括权重获取、模型加载、NPU 算子执行、服务化接口封装全流程,并把整套可复现的步骤沉淀在此。
开始之前,先确保模型文件齐备。目录下应包含 model.safetensors(权重)、config.json、modeling_xvla.py 等自定义代码,以及 merges.txt(BPE 词表合并文件,须从 Florence2 仓库补齐,因为原始发布仓缺此文件)。
pip install torch torch-npu transformers pillow numpy opencv-python-headless fastapi uvicorn json-numpypython serve.py --model-dir /path/to/xvla-widowx --port 8000成功启动后再终端会看到 FastAPI 应用已就绪 与监听地址。默认绑定所有网卡、8000 端口。
python client.py --image test_scene.png --instruction "pick up the red block"用一个合成场景触发一次端到端推理:脚本绘制一张含红色方块与机械臂的桌面图,连同指令打包后 POST 到 /act。返回 action 是形如 (30, 20) 的动作矩阵,第 0 维为步数、第 1 维为 6D 位姿+夹爪。终端会打印 shape、首末帧以及夹爪维的归一化值,用于人工核验输出是否合理。
下表为实测获得,供后续调优参照:
| 项目 | 实测 |
|---|---|
| 参数规模 | ≈0.9B |
| 权重体积 | 3.5 GB |
| 单次推理(10 步) | 2–5 秒 |
| 峰值显存 | ≈5.6 GB |
| 加载耗时(冷启动) | 15–30 秒 |
该模型的动作生成带天然随机性:flow-matching 从噪声出发逐步去噪,故即便输入完全相同,两次输出也不会一致。因此不对"逐元素一致"做断言,而是验证:(1) 输出不出现 NaN/Inf;(2) 夹爪通道落在 [0,1];(3) 各维均值和标准差处于合理区间。实测三项均通过,判定 NPU 上 bf16 计算与同等实现数值行为一致。
npu-smi info 看一下,选空闲卡、端口避开已被占用的,绝不 kill 别人的进程。merges.txt 报错。用 Florence 的 merges.txt 补进模型目录即可解决。/tmp,仓库内容为纯文本、很小不受影响。