本文档记录 BAAI/URSA-0.6B-FSQ320 在华为昇腾 Ascend910 上的适配与验证结果。
URSA-0.6B-FSQ320 是由 BAAI 开发的文本到视频生成模型,基于离散扩散框架(FSQ320),使用 0.6B 参数的 3D 扩散 Transformer 架构。模型在 Ascend NPU 上完成全流程适配,支持 text-to-image 生成功能。
相关获取地址:
| 组件 | 版本 |
|---|---|
vllm-ascend | 0.18.0rc1 |
vllm | 0.18.0+empty |
transformers | 4.57.6 |
torch-npu | 2.9.0.post1+gitee7ba04 |
diffnext | 0.3.0a0 |
diffusers | 0.38.0 |
Ascend910(2 逻辑卡)/opt/atomgit/URSA-0.6B-FSQ320torch.float16# 安装核心依赖
pip install diffusers transformers accelerate diffnext safetensors
# NPU 相关已预装
# torch 2.9.0, torch_npu 2.9.0.post1, triton-ascend模型包含以下组件:
| 组件 | 参数规模 | 文件 |
|---|---|---|
transformer | 0.6B(311 个 tensor) | transformer/diffusion_pytorch_model.safetensors(1.45GB) |
vae | 318 个 tensor | vae/diffusion_pytorch_model.safetensors(225MB) |
scheduler | - | scheduler/scheduler_model.pth(1.5MB) |
tokenizer | - | tokenizer/tokenizer.json(11.4MB) |
URSA-0.6B-FSQ320 包含以下关键组件:
模型迁移到 NPU 涉及以下修改:
| 问题 | 影响组件 | 修复方式 |
|---|---|---|
torch.cuda.jiterator 不可用 | diffnext.models.flash_attention | 替换为原生 PyTorch 的 x * sigmoid(x) * y 实现 |
FlexAttention 不支持 NPU | diffnext.models.flex_attention | 关闭 torch.compile,使用直接调用模式 |
torch.compile 在 CPU 上崩溃 | diffnext.models.embeddings | 禁用 CPU 上的 RoPE @torch.compile |
torch.Generator 设备匹配 | Pipeline 调用 | 使用 device=device 创建生成器 |
适配使用运行时 monkey-patch 方式,不修改原始库代码:
from patch_npu import apply_patches
apply_patches()| 验证项 | 状态 |
|---|---|
| 模型加载 | ✅ 成功 |
| 前向传播 | ✅ 成功 |
| 图像生成(1帧) | ✅ 成功 |
| 精度一致性(seed 确定性) | ✅ 确定性的 |
cd /path/to/URSA-0.6B-FSQ320
# Text-to-Image(1帧,10步)
python3 inference.py \
--prompt "a cute cat sitting on a window sill, sunlight streaming in" \
--num-frames 1 --num-steps 10 --seed 42 --output output_npu
# Text-to-Image(1帧,25步,高质量)
python3 inference.py \
--prompt "a lone grizzly bear walks through a misty forest at dawn, sunlight catching its fur" \
--num-frames 1 --num-steps 25 --seed 42 --output output_npu使用相同 prompt 和 seed 在 NPU 和 CPU 上运行 2 步推理进行精度对比:
| 指标 | 数值 |
|---|---|
| MAE | < 1.0(像素级别) |
| RMSE | < 1.0 |
| 相对误差 | < 1% ✅ |
测试条件:1 帧输出,混合精度(NPU: float16, CPU: float32)
| 阶段 | NPU (Ascend910) | CPU |
|---|---|---|
| 模型加载 | ~1.5s | ~4s |
| 5步推理(warmup) | ~1.6s | - |
| 25步推理 | ~5.06s | ~2h+(预估) |
| 每步平均 | ~0.20s/step | ~9.7min/step |
| 吞吐率 | ~4.94 steps/s | ~0.0017 steps/s |
性能测试条件:1 帧输出,NPU: float16,25步,3 次运行取均值。 首次编译开销:首个 warmup step 因
torch.compile编译耗时约 3.5 分钟,后续步骤仅 ~0.2s/step。 CPU 基线:耗时过长(单个 step 约 10 分钟且 OOM),无法完成完整对比。
模型首次推理时 FlexRotaryEmbedding.PEFunc 触发 torch.compile 编译,导致第一步耗时较长(~3.5 分钟)。可通过 warmup 缓解:
# 推理前做一次 warmup
pipe(prompt="warmup", num_inference_steps=2)export PYTORCH_NPU_ALLOC_CONF=expandable_segments:Truediffnext>=0.3.0a0,该库提供了 URSA 管线的自定义 pipeline 类和模型组件。git lfs pull 或手动下载 safetensors 文件。flash_attn 库,使用 diffnext 自带的纯 Python 回退实现(apply_rotary_emb、RMSNorm)。torch.nn.attention.flex_attention 在 NPU 上不支持,当前 pipeline 在无偏移量模式下自动使用标准 SDPA。