robotics-diffusion-transformer/rdt-1b(RDT-1B: A Diffusion Foundation Model for Bimanual Manipulation)在华为昇腾 Ascend 910 NPU 上的推理适配与 CPU 精度/性能对比。
RDT-1B 是清华大学 TSAIL 组提出的 1B 参数模仿学习扩散 Transformer,基于 100 万+ 条多机器人 episode 预训练。给定语言指令与最多 3 视角 RGB 图像,RDT 预测未来 64 步机器人动作;统一动作空间兼容单臂/双臂、关节/末端执行器、位置/速度等多种机器人本体。
| 组件 | 作用 |
|---|---|
| RDT (Diffusion Transformer) | 28 层 DiT 主干,hidden 2048,32 头,交替自注意力与语言/图像交叉注意力 |
| SigLIP-so400m 视觉塔 | 视觉条件编码(384×384,输出 1152 维 token,4374 个位置 = 3 视角 × 2 帧 × 729 patch) |
| T5-XXL 语言编码 | 语言条件编码(预计算 4096 维嵌入) |
| 适配器 | img_adaptor/lang_adaptor (mlp2x_gelu)、state_adaptor (mlp3x_gelu) |
| 噪声调度器 | DDPM (squaredcos_cap_v2, 1000 训练步),推理用 DPM-Solver 多步,5 步 |
| 项目 | 版本 |
|---|---|
| 硬件 | Ascend 910 ×2(单卡即可推理) |
| CANN | 8.5.1 |
| Python | 3.11.14 |
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| transformers | 4.57.6 |
| diffusers | 0.39.0(噪声调度器) |
| timm | 1.0.28(Attention/RmsNorm 组件) |
# 1. 安装依赖(华为镜像源)
pip install -r requirements.txt -i https://repo.huaweicloud.com/repository/pypi/simple/
# 2. 下载权重到 models/(本仓库 .gitignore 已排除 models/)
HF_ENDPOINT=https://hf-mirror.com HF_HUB_DOWNLOAD_TIMEOUT=120 python -c \
"from huggingface_hub import snapshot_download; snapshot_download('robotics-diffusion-transformer/rdt-1b', local_dir='/data/rdt-1b/models')"
# 3. 官方模型代码: 本仓库 rdt_code/ 已内置(rdt_pytorch, 来自 thu-ml/RoboticsDiffusionTransformer)
# 4. source CANN 环境
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 5. NPU 推理
python inference.py --device npu
# 6. CPU 推理(对比基准)
python inference.py --device cpurdt_code/):RDT-1B 无 transformers remote code,官方 rdt_pytorch 从 GitHub 仓库获取,sys.path 引入后即可加载。模型权重 pytorch_model.bin 的 state_dict 前缀(model.*、lang_adaptor.*、img_adaptor.*、state_adaptor.*)与官方 RDTRunner 完全一致,load_state_dict 零缺失零多余。dtype=torch.bfloat16,昇腾 910 原生支持 bf16;本脚本以 fp32 加载以获得 CPU/NPU 逐位可比的数值结果(用户如需 bf16 可改 dtype=torch.bfloat16)。Attention)与交叉注意力均使用 F.scaled_dot_product_attention,昇腾上由 torch_npu 原生支持,无需修改。noisy_action 用 CPU 固定种子 torch.Generator 生成后再搬运到目标设备,DPM-Solver 采样流程完全确定性,保证两端输入逐位一致,输出可直接做数值对比。import torch, torch_npu # NPU 环境
from models.rdt_runner import RDTRunner # rdt_code/ 已加入 sys.path
runner = RDTRunner(action_dim=128, pred_horizon=64, config=cfg, ...) # 见 inference.py
runner.load_state_dict(torch.load("models/pytorch_model.bin", map_location="cpu"))
runner = runner.to("npu:0").eval()
action = runner.predict_action(
lang_tokens=..., # [1, L, 4096]
lang_attn_mask=..., # [1, L] bool
img_tokens=..., # [1, 4374, 1152]
state_tokens=..., # [1, 1, 128]
action_mask=..., # [1, 1, 128] 0-1 float
ctrl_freqs=..., # [1] 控制频率
) # -> [1, 64, 128] 动作序列输入:固定种子合成观测(64 语言 token + 4374 图像 token + 128 维 state),初始噪声 seed=42,DPM-Solver 5 步采样;计时为 3 次迭代均值(预热 1 次后)。实测数据见 results_*.json。
| 指标 | 数值 |
|---|---|
| cos_sim | 1.00000000 |
| max_abs_err | 2.38e-06 |
| mean_abs_err | 7.00e-08 |
| NPU 平均延迟(Ascend 910) | 229.7 ms |
| CPU 平均延迟 | 106 043.6 ms |
| 加速比 | ≈ 462× |
差异来源说明:NPU 与 CPU 的 fp32 算子实现(LayerNorm / Softmax / SDPA)归约顺序不同,误差在 1e-4 量级属正常范围,cos_sim ≈ 1.0 表明数值对齐良好。
| 文件 | 说明 |
|---|---|
inference.py | 推理入口,--device npu|cpu,输出 cos_sim / max_abs_err / mean_abs_err / 耗时 |
rdt_code/ | 官方 rdt_pytorch 代码(RDT 模型/适配器/调度器) |
results_npu.json / results_cpu.json | 两端完整结果(延迟、动作序列、环境信息、精度指标) |
assets/agent_workflow.png | 适配工作流(分步流程与耗时) |
assets/npu_device_call.png | NPU 设备调用证据(npu-smi、设备名/显存、推理关键输出) |
assets/model_result.png | 2×2 结果信息图(模型信息卡 / 耗时对比 / 精度表 / 动作轨迹可视化) |
requirements.txt | Python 依赖清单 |
MIT(遵循上游 RDT,见 models/README.md)。