
robotics-diffusion-transformer/rdt-1b (RDT-1B)eb09036cc64ca4945051acbd1bd581d30a1d7711)action_chunk [1, 64, 128] (64 步 ×128 维统一空间, 覆盖关节位置/速度、EEF 位姿/速度、轮式底盘速度), 经 diffusion 去噪 5 步 (DPMSolver), 值为有限浮点, 幅值约 [-1.2,1.2]pytorch_model.bin 2.46GB, OrderedDict 618 keys, FP32 (可转 BF16)lang_tokens [1,1024,4096] N(0,1) seed 0 (模拟 T5-XXL embeddings)img_tokens [1,4374,1152] N(0,1) seed 0 (模拟 SigLIP tokens = 2×3×729)state_tokens [1,1,128] N(0,0.1) seed 0 (proprio 14 维映射到 128 统一空间)action_mask [1,1,128] 全 1 (所有 128 维有效)ctrl_freqs [1] 25.0lang_attn_mask [1,1024] 全 Truemlp2x_gelu (语言/图像) 与 mlp3x_gelu (状态) 映射到 hidden 2048action_mask (掩无效维度), 再按 STATE_VEC_IDX_MAPPING 解包到 14 维关节动作 (本验证保留 128 维原始输出)num_inference_timesteps=5, beta_schedule=squaredcos_cap_v2, prediction_type=sample, 初始噪声 seed 42 (CPU 与 NPU 共享噪声时严格一致)/opt/atomgit/.cache/huggingface/hub/models--robotics-diffusion-transformer--rdt-1b/snapshots/eb09036cc64ca4945051acbd1bd581d30a1d7711 (pytorch_model.bin 2.456G + config.json + head.mp4)scripts/agilex_model.py 完全一致pip install -r requirements.txt
# torch==2.9.0
# torch-npu==2.9.0.post1
# diffusers==0.27.2
# transformers==4.41.0
# timm==1.0.28
# Pillow==12.2.0
# huggingface_hub==0.36.2
# numpy==1.26.4python inference.py # 自动 NPU (若可用)
python inference.py --device npu # 强制 npu:0
python inference.py --device cpu # 强制 cpu
python inference.py --mode validate # CPU vs NPU 一致性 (共享噪声, 严格 FP32)
python inference.py --mode benchmark # 预热 3 + 10 次计时 (synchronize)核心逻辑 (inference.py:1):
RDTRunner (1.228B 参数) + pytorch_model.bin → model.to("npu:0"), 验证 next(model.parameters()).device == npu:0torch.randn) 保证对比公平torch.npu.synchronize() 前后, 预热 3 次, 正式 10 次执行命令: python inference.py (在 npu:0 真实执行, 权重来自本地快照, torch.float32)
Model: robotics-diffusion-transformer/rdt-1b
Revision: eb09036cc64ca4945051acbd1bd581d30a1d7711
Route: manipulation-vla (Diffusion Transformer, horizon=64, action_dim=128, hidden 2048 depth 28)
Weight: https://huggingface.co/robotics-diffusion-transformer/rdt-1b
Backend: torch + torch_npu + diffusers DDPM/DPMSolver (pure PyTorch), dtype torch.float32
[npu-smi]
Ascend910_9362 OK 169.7W 45C 3135/65536 MB
torch_npu_available: True
device_count: 2, device_name: Ascend910_9362
Requested device: auto -> actual: npu:0
Snapshot: .../snapshots/eb09036cc64ca4945051acbd1bd581d30a1d7711
Config: pred_horizon=64 action_dim=128 hidden=2048 depth=28 lang_dim=4096 img_dim=1152
Weight file: .../pytorch_model.bin (2.46 GB)
Diffusion params: 1.228320e+09
Model first param device (cpu): cpu -> npu:0
Param count: 1.228B
Input: lang (1, 1024, 4096) img (1, 4374, 1152) state (1, 1, 128) mask (1, 1, 128) ctrl (1,)
Input sample: lang mean -0.0002 img mean 0.0002 state sample [0.00096, 0.0435, -0.0104]
Input device NPU: lang npu:0 img npu:0 state npu:0 mask npu:0
[RESULT] Model: robotics-diffusion-transformer/rdt-1b rev eb09036... route manipulation-vla horizon 64 dim 128
[RESULT] Backend: npu:0, dtype torch.float32, device_name Ascend910_9362
[RESULT] Action shape: (1, 64, 128), device npu:0, dtype torch.float32
[RESULT] First action (5 dims): [-0.01267491, 0.21815849, 0.25815707, -1.12188291, -0.08900752]
[RESULT] Last action (5 dims): [0.02416026, 0.22093831, 0.20951719, -1.11252224, -0.09642471]
[RESULT] Finite: True, max 1.1219, mean 0.0157
[PERF] latency 462.12 ms (synchronized with torch.npu.synchronize) # 首轮含编译
[PERF] actions_per_s 138.49 horizon 64
[RESULT] PASSaction_mask 与 ctrl_freqs、同 dtype float32、同 5 步 DPMSolver、共享初始噪声 (seed 42 的 torch.randn([1,64,128]) 在 CPU 生成后搬运至 NPU, 通过 mock torch.randn 确保两端同噪声), 分别在 cpu 与 npu:0 执行 RDTRunner.predict_action, 保存原始动作 .json 后比较python inference.py --mode validate
# 内部等价于:
python .opencode/skills/npu_adapt_robotics/scripts/validate_policy_outputs.py --cpu /tmp/cpu_shared.json --npu /tmp/npu_shared.json --atol 1e-4 --rtol 1e-3torch.randn 各自生成, CPU 与 NPU RNG 实现差异):
conditional_sample 的 torch.randn(..., device=device) 改为 torch.randn(..., device="cpu").to(device) 思路, 本仓库通过 unittest.mock.patch("torch.randn") 实现; 剩余差异 2e-06 来自 Ascend NPU 与 CPU 在 Linear/GELU/Attention 的微小累积误差, 远低于阈值, 不影响策略语义条件: npu:0, float32, batch=1, lang 1024×4096 + img 4374×1152 + state 1×128, horizon 64, steps 5, torch.npu.synchronize() 计时, 预热 3 次, 正式 10 次
warmup done (3 runs)
run 0: 257.23 ms
run 1: 257.19 ms
run 2: 257.19 ms
run 3: 257.09 ms
run 4: 257.19 ms
run 5: 257.19 ms
run 6: 257.25 ms
run 7: 257.49 ms
run 8: 258.31 ms
run 9: 258.66 ms
avg 257.48 ms min 257.09 max 258.66 p50 257.23 p90 258.31 p95 258.66
actions_per_s 248.56 chunks_per_s 3.88manipulation-vla 路由, 不含 T5-XXL 与 SigLIP 的端到端编码, 语言/图像 tokens 为预计算 embeddings (与官方 scripts/agilex_model.py 中加载预存 text_embeds 方式一致)eb09036cc64ca4945051acbd1bd581d30a1d7711trust_remote_code: 不需要, 全部本地可审计 inference.py 与 models/rdt_runner.pymit (同上游 robotics-diffusion-transformer/rdt-1b)