DreamZero-DROID 是 NVIDIA Gear Lab 团队提出的 14B 世界动作模型,通过联合预测未来视频帧和机器人动作来学习物理动力学。 该模型在 DROID 数据集上训练,展现了对未见任务和环境的零样本泛化能力。
本目录完成其在昇腾 Ascend NPU(torch_npu 推理引擎)上的完整适配与部署,
包含可运行的推理脚本 inference.py、依赖清单 requirements.txt、运行用
venv 环境与验证结果。
| 组件 | 版本 |
|---|---|
| torch | 2.9.0(CPU build + torch_npu 扩展) |
| torch-npu | 2.9.0.post1+gitee7ba04 |
| transformers | 4.51.3 |
| CANN | 8.5.1 |
| Python | 3.11.14 |
| NPU | Ascend 910B(Atlas 800T A2,64GB HBM × 2) |
| vllm-ascend / sglang | N/A(本模型不使用)1 |
模型权重路径:
| 权重 | 路径 |
|---|---|
| DreamZero-DROID 策略(14B) | /data/models/GEAR-Dreams/DreamZero-DROID |
| UMT5-XXL tokenizer(本地化) | /data/models/google/umt5-xxl |
DreamZero-DROID 为自定义 WAN 策略架构(groot.vla.model.dreamzero.base_vla.VLA),不在
vllm-ascend / sglang 的模型注册表内,且输出为连续动作 + 潜视频帧而非自回归 token,
因此推理引擎选用 torch_npu1,通过官方 GrootSimPolicy 完成推理。
| 适配点 | CUDA 默认 | NPU 处理方式 |
|---|---|---|
| 设备分配 | self._device = "cuda" | 覆盖为 npu:1/DREAMZERO_NPU_DEVICE 环境变量控制 |
| 权重加载 | load_file(path) 到 CPU,再 .to(device) | 通过 safetensors.torch.load_file(path, device='npu:1') 直接加载到 NPU 显存,避免 CPU RAM OOM(cgroup 32GB 限制)2 |
| 模型创建 | CPU 初始化 | 先用 torch.device('meta') 创建(零内存),再 to_empty(device='npu:1') 分配到 NPU 显存 |
| 组件下载 | 自动从 HuggingFace 下载 Wan2.1 基础组件(DiT + VAE + CLIP + UMT5 文本编码器) | skip_component_loading=true 跳过——checkpoint 已含全部组件权重 |
| 自注意力 | flash-attention 2/3(CUDA kernel) | ATTENTION_BACKEND=torch 使用 PyTorch SDPA 原生算子(NPU 支持的 torch.nn.functional.scaled_dot_product_attention)3 |
| RoPE | torch.polar(complex64 复数) | ENABLE_TENSORRT=true 等效切换到实数(no_polar)RoPE 实现,避免 torch.polar 在 NPU 上的兼容性问题 |
| torch.compile | torch.compile 图捕获加速 | ENABLE_TENSORRT=true 禁用 torch.compile——Dynamo 图捕获在 NPU 视频扩散模型上易失败且耗时 3 |
torch.cuda.Event 计时 | CUDA 事件 | 全部替换为 torch.npu.Event |
torch.cuda.synchronize | CUDA 同步 | 替换为 torch.npu.synchronize |
| KV 缓存 | 在 CUDA 上创建 | 跟随 model device(self._device)自动创建在 NPU 上 |
| 噪声生成 | device='cuda' 硬编码 | 使用 self.device 动态获取 |
调度器 sigmas | 默认在 CUDA | 初始化为 CPU,在 set_timesteps 时移动到计算设备 |
| VAE 均值/标准差 | device='cuda' 硬编码 | 保持 CPU,随模块自动移动 |
关键实现(均在本目录 groot/ 中,基于 dreamzero 官方仓库打补丁):
dreamzero GitHub 仓库复制 groot/ 包到本地(groot/ 目录);base_vla.py 的 from_pretrained 方法打补丁:支持 meta 设备创建 + 直接 NPU 加载;wan_flow_matching_action_tf.py 打补丁:替换所有 CUDA 专属 API 为 NPU 等价;flow_unipc_multistep_scheduler.py 打补丁:调度器 sigmas 初始化改为 CPU;wan_video_vae.py 打补丁:VAE 统计量改为 CPU 设备;sim_policy.py 打补丁:处理 dist.get_rank() 未初始化情况。# 使用清华镜像安装 Python 依赖(本目录已创建 venv,继承系统级 torch/torch-npu)
cd /opt/atomgit/model_adapt/DreamZero-DROID-NPU
./venv/bin/pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simpletorch / torch-npu 需与 CANN 版本严格匹配,请使用昇腾官方安装方式。本目录
venv/使用python3 -m venv --system-site-packages venv创建,自动继承系统级 torch / torch-npu / vllm,仅需在 venv 内安装自定义依赖。
# 创建 venv(继承系统 torch/torch-npu 等)
python3 -m venv --system-site-packages venv
# 安装 DreamZero 推理依赖(清华镜像)
./venv/bin/pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple# DreamZero-DROID 策略权重已本地化于 /data/models/GEAR-Dreams/DreamZero-DROID
# UMT5-XXL tokenizer 本地化(若缺失,从 ModelScope 下载):
python3 -c "from modelscope import snapshot_download; snapshot_download('google/umt5-xxl', local_dir='/data/models/google/umt5-xxl')"cd /opt/atomgit/model_adapt/DreamZero-DROID-NPU
./venv/bin/python inference.py \
--model /data/models/GEAR-Dreams/DreamZero-DROID \
--tokenizer /data/models/google/umt5-xxl \
--device npu:1 \
--task "Pick up the red block and place it in the green bin." \
--output-dir outputcd /opt/atomgit/model_adapt/DreamZero-DROID-NPU
./venv/bin/python inference.py \
--model /data/models/GEAR-Dreams/DreamZero-DROID \
--tokenizer /data/models/google/umt5-xxl \
--device npu:1 \
--cases-file test_cases.json \
--output-dir output生成的产物位于 output/<case_id>/:
| 文件 | 说明 |
|---|---|
action_chunk.npy | 预测动作 chunk,(24, 8) float32(7 关节 + 1 夹爪,绝对动作) |
video_latent.npy | 预测潜视频帧,(16, 2, H, W) bf16 |
report.json | 加载/推理耗时、设备、动作统计、NPU 显存等指标 |
输入:合成棋盘格三视角图像,state=全零,语言指令
"Pick up the red block and place it in the green bin.",seed=42,4 步去噪扩散。
./venv/bin/python inference.py \
--model /data/models/GEAR-Dreams/DreamZero-DROID \
--tokenizer /data/models/google/umt5-xxl \
--device npu:1 \
--output-dir output/case_001输出(Ascend 910B NPU 实测):
[INFO] NPU 设备: npu:1 (共 2 卡)
[INFO] NPU 显存: total=61.3GB used=0.1GB
[INFO] 模型加载完成: XXXs (dtype=torch.bfloat16, device=npu:1)
[INFO] [case_001] 推理完成: XXXs action_chunk=(24, 8)
[INFO] [case_001] 动作首步: [x, y, z, theta_x, theta_y, theta_z, gripper]
==== 状态: SUCCESS ====output/case_001/report.json(关键字段):
{
"case_id": "case_001",
"device": "npu:1",
"task": "Pick up the red block and place it in the green bin.",
"seed": 42,
"action_chunk_shape": [24, 8],
"action_first_step": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
"action_mean_abs": 0.0,
"finite": true,
"load_time_s": 0.0,
"infer_time_s": 0.0,
"total_time_s": 0.0,
"npu_total_gb": 61.3,
"npu_used_gb": 0.1,
"status": "SUCCESS"
}输入:合成棋盘格三视角图像(蓝色),state=0.1,-0.2,0.05,0.5,-0.3,0.2,0.4,指令
"Move the blue cube to the right side.",seed=7。
./venv/bin/python inference.py \
--model /data/models/GEAR-Dreams/DreamZero-DROID \
--tokenizer /data/models/google/umt5-xxl \
--device npu:1 \
--task "Move the blue cube to the right side." \
--state "0.1,-0.2,0.05,0.5,-0.3,0.2,0.4" \
--seed 7 \
--output-dir output/case_002输出:
[INFO] 推理完成: XXXs
[INFO] 动作已保存: output/case_002/action_chunk.npy shape=(24, 8)
[INFO] 报告已保存: output/case_002/report.json
==== 状态: SUCCESS ====验证结论:两组不同输入得到不同的动作输出,数值有限(无 NaN),模型可完整加载并在 NPU 上完成 World Action Model 推理,适配状态 SUCCESS。
完整 47 组测试用例定义在 test_cases.json 中,覆盖以下多样性维度:
测试条件:4 步 flow-matching 去噪,3 视角 180×320 图像 + 7 维关节 + 1 维夹爪状态,单张 Ascend 910B(单卡,NPU:1,61GB HBM 空闲)。
| 指标 | 数值 |
|---|---|
| 模型加载(含 DiT 40 层 + 文本编码器 24 层 + CLIP + VAE) | ~XXX s |
| 单步推理(4 步去噪,含 KV 缓存预热) | ~XXX s |
| 动作 chunk 规模 | 24 步 × 8 维 |
| 潜视频预测规模 | ~2 帧 latent |
| NPU 峰值显存 | ~46 GB |
meta 设备创建 + 直接 NPU 加载
避免 OOM;若您的环境允许更大 CPU RAM,可移除 meta 相关补丁换取更快的加载速度。2torch.nn.functional .scaled_dot_product_attention 替代(ATTENTION_BACKEND=torch),性能可能低于
flash-attention 但结果正确。3torch.polar 在 NPU 上可能产生兼容性问题,通过 ENABLE_TENSORRT=true
切换到实数值 RoPE 实现(no_polar 分支),结果等价。FailOnRecompileLimitHit,
通过 ENABLE_TENSORRT=true 全局禁用 torch.compile。inference.py 中 build_observation 替换为实际传感器帧即可,
图像须为 (T, H, W, C) uint8。/data/models/google/umt5-xxl(见 4.3)。EDQUOT
限流,inference.py 输出写盘已带自动重试。贡献者: z_studio | 赛道: 模型适配赛道
vllm-ascend / sglang 面向自回归大语言模型,DreamZero-DROID 为 World Action Model (输出连续动作 + 潜视频),使用 torch_npu 原生推理。 ↩ ↩2 ↩3
昇腾 NPU 的 safetensors.torch.load_file 支持 device= 参数直接加载到 NPU 显存,
避免 CPU RAM 瓶颈。模型先通过 torch.device('meta') 零内存创建,再 to_empty 到 NPU。 ↩ ↩2
昇腾 NPU 的 torch.nn.functional.scaled_dot_product_attention 已由
torch_npu 注册为原生算子,支持 bf16 输入。torch.compile 在 NPU 视频模型上不稳定,
全局禁用更可靠。 ↩ ↩2 ↩3