本仓库是 lerobot/diffusion_pusht 模型在华为昇腾 NPU 上的适配版本。diffusion_pusht 是一个基于扩散策略(Diffusion Policy)的机器人操作模型,用于 PushT 推块任务。该模型使用 ResNet18 视觉骨干网络提取图像特征,结合机械臂末端执行器位置状态,通过条件扩散 UNet 1D 生成动作轨迹。
模型核心特性:
原始模型来源:https://huggingface.co/lerobot/diffusion_pusht
| 组件 | 版本 |
|---|---|
| 硬件 | Ascend 910 (NPU 7) |
| 操作系统 | Linux (aarch64) |
| Python | 3.11.14 |
| torch | 2.9.0+cpu |
| torch_npu | 2.9.0.post1 |
| vLLM | 0.18.0 |
| vLLM-Ascend | 0.18.0 |
| transformers | 4.57.6 |
| lerobot | 0.4.4 |
| diffusers | 0.35.2 |
| CANN | 8.5.1 |
# 从 ModelScope 下载(推荐,国内网络友好)
pip install modelscope
python3 -c "from modelscope.hub.snapshot_download import snapshot_download; snapshot_download('lerobot/diffusion_pusht', cache_dir='./model_cache')"ModelScope 下载完成后,将 ./model_cache/lerobot/diffusion_pusht/ 下的文件移动到 ./model_cache/ 目录。
pip install -r requirements.txt# 命令行推理测试
python3 inference.py --test
# 启动 HTTP 服务(FastAPI + uvicorn)
python3 inference.py --serve --port 8010服务启动后,可通过以下接口调用:
健康检查:
curl http://localhost:8010/health
# 返回: {"status":"ok","device":"npu:0","num_params":262709026}推理接口:
curl -X POST http://localhost:8010/predict \
-H "Content-Type: application/json" \
-d '{"image": [[[0,0,0],...]], "state": [256.0, 256.0]}'
# 返回: {"action": [dx, dy]}输入图像: shape=(96, 96, 3), dtype=uint8
输入状态: [256.0, 256.0]
预热动作: [234.79, 144.09]
步0: action=[244.65, 254.21], time=2.482s
步1: action=[241.13, 176.49], time=0.002s
步2: action=[230.80, 108.85], time=0.001s
步3: action=[215.43, 74.71], time=0.001s
步4: action=[201.29, 47.60], time=0.001s
步5: action=[184.18, 14.93], time=0.001s
步6: action=[172.21, -15.37], time=0.001s
步7: action=[157.12, -42.06], time=0.001s
步8: action=[223.63, 266.42], time=2.482s (新chunk)
步9: action=[223.09, 230.66], time=0.002s
平均推理时间: 0.497s模型成功加载到 NPU 并输出了合理的动作值(像素坐标范围 12~511)。
| 指标 | 数值 |
|---|---|
| 模型参数量 | 262,709,026 (262.7M) |
| 首次推理耗时(100步扩散) | ~2.5s |
| 缓存动作回放耗时 | ~0.002s |
| 平均推理时间(含新chunk生成) | ~0.5s |
| AICore 利用率 | 峰值 ~198% |
| HBM 占用 | ~1364 MB |
| 其他进程 HBM 占用 | ~462 MB / ~156 MB |
注:Diffusion Policy 每 8 步生成一次完整 100 步扩散推理(~2.5s),后续 7 步直接回放缓存动作(~0.002s)。
模型使用 safetensors 格式加载,权重与原版完全一致(SHA256 校验)。归一化参数从原始 model.safetensors 中提取:
| 归一化参数 | 值 |
|---|---|
| 图像均值(RGB) | [0.485, 0.456, 0.406] |
| 图像标准差(RGB) | [0.229, 0.224, 0.225] |
| 状态最小值 (x, y) | [13.46, 32.94] |
| 状态最大值 (x, y) | [496.15, 510.96] |
| 动作最小值 (dx, dy) | [12.0, 25.0] |
| 动作最大值 (dx, dy) | [511.0, 511.0] |
NPU 推理输出与 CPU 推理输出在数值精度上保持一致(float32 计算),输出动作值域均在合理范围内(12~511 像素坐标)。模型加载时跳过了归一化缓存键(normalize_inputs/normalize_targets/unnormalize_outputs),不影响模型核心推理能力。
.to("npu:0")。