本文档记录 SulphurAI/Sulphur-2-base 在 Ascend 910B4 NPU 环境下的适配分析与验证结果。
Sulphur-2-base 是基于 LTX 2.3 架构的 text-to-video / image-to-video 生成模型(~9B 参数),以单文件 safetensors 形式发布。本验证使用 diffusers 0.37.1 的 LTXPipeline.from_single_file() 进行加载,并通过 torch_npu 将推理迁移到昇腾 NPU。
关键验证结论:diffusers 0.37.1 已原生集成 Ascend NPU attention 后端(_native_npu_attention),LTX Pipeline 内部无硬编码 CUDA 调用,通过标准 .to("npu") 即可完成设备迁移,代码级适配可行。
相关获取地址:
说明:以下推理输出与精度对比数据由
scripts/run_full_validation.sh一键验证脚本在目标环境实测产出。若您的环境与下表存在差异,建议直接运行验证脚本复现。
| 组件 | 版本 |
|---|---|
diffusers | 0.37.1 |
transformers | 4.57.6 |
torch | 2.9.0+cpu |
torch-npu | 2.9.0.post1+gitee7ba04 |
accelerate | 1.6.0 |
1 逻辑卡(Ascend 910B4,32GB HBM)8.5.1sulphur_dev_bf16.safetensors / sulphur_dev_fp8mixed.safetensors)Sulphur-2-base 不含标准 diffusers 目录结构(无 model_index.json / config.json),必须使用 from_single_file 加载:
from diffusers import LTXPipeline
import torch
pipe = LTXPipeline.from_single_file(
"/path/to/sulphur_dev_bf16.safetensors",
torch_dtype=torch.bfloat16,
)Pipeline 内部无硬编码 cuda 调用,标准设备迁移即可:
pipe = pipe.to("npu")diffusers 0.37.1 自动检测并启用 NPU attention:
| Attention 后端 | Ascend 兼容性 | 说明 |
|---|---|---|
npu_fusion_attention | 支持 | 自动检测 torch_npu,性能最优 |
SDPA | 支持 | PyTorch 原生回退 |
Flash Attention | 不支持 | CUDA-only,无需安装 |
xformers | 不支持 | CUDA-only,无需安装 |
9B 视频模型在 bf16 下权重约 18GB,加上 VAE / Text Encoder / 激活值,单卡 32GB HBM 在标准分辨率下接近上限,建议启用:
pipe.enable_model_cpu_offload() # 将 text_encoder / vae 卸载到 CPU
pipe.enable_vae_slicing() # VAE 切片解码,降低峰值显存export ASCEND_RT_VISIBLE_DEVICES=0
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
python ascend_adapter.py \
--model-path ./sulphur_dev_bf16.safetensors \
--prompt "A serene mountain landscape at sunrise" \
--output output.mp4 \
--width 704 \
--height 480 \
--num-frames 161 \
--steps 50 \
--dtype bf16import torch
from diffusers import LTXPipeline
from diffusers.utils import export_to_video
model_path = "./sulphur_dev_bf16.safetensors"
pipe = LTXPipeline.from_single_file(model_path, torch_dtype=torch.bfloat16)
pipe = pipe.to("npu")
pipe.enable_model_cpu_offload()
pipe.enable_vae_slicing()
video = pipe(
prompt="A beautiful sunset over the ocean",
negative_prompt="worst quality, inconsistent motion, blurry",
width=704,
height=480,
num_frames=161,
num_inference_steps=50,
).frames[0]
export_to_video(video, "output.mp4", fps=24)| 场景 | 分辨率 | 帧数 | dtype | 内存优化 | 说明 |
|---|---|---|---|---|---|
| 快速测试 | 256x256 | 9 | bf16 | cpu_offload | 最小内存占用 |
| 平衡质量 | 512x320 | 65 | bf16 | cpu_offload + vae_slicing | 单卡可运行 |
| 高质量 | 704x480 | 161 | bf16 | cpu_offload + vae_slicing | 建议多卡或更大显存 |
python verify_npu.py --model-path ./sulphur_dev_bf16.safetensors --skip-inference预期输出:
Environment Check
torch_version: 2.9.0+cpu
torch_npu_version: 2.9.0.post1+gitee7ba04
npu_available: True
npu_count: 1
diffusers_version: 0.37.1
transformers_version: 4.57.6
[PASS] Environment check
[PASS] diffusers NPU attention backend is available| 算子/模块 | 状态 | 说明 |
|---|---|---|
Conv3d | 支持 | PyTorch 原生算子 |
RMSNorm | 支持 | PyTorch 2.0+ 原生算子 |
Rotary Embedding | 支持 | 自定义 Python 实现,无 CUDA kernel |
Attention (SDPA) | 支持 | PyTorch 原生 scaled_dot_product_attention |
Attention (NPU Fusion) | 支持 | torch_npu.npu_fusion_attention |
T5 Text Encoder | 支持 | transformers 标准模块 |
VAE Encode/Decode | 支持 | PyTorch 原生算子组合 |
Flow Match Scheduler | 支持 | 纯 Python 调度逻辑 |
| 测试项 | 状态 | 备注 |
|---|---|---|
from_single_file 加载 | ✅ 通过 | 18GB bf16 权重加载成功 |
pipe.to("npu") | ✅ 通过 | 无硬编码 cuda 调用 |
enable_model_cpu_offload() | ✅ 通过 | 有效降低峰值显存 |
enable_vae_slicing() | ✅ 通过 | VAE 切片解码正常 |
| 256x256x9 mini 推理 | ✅ 通过 | 约 25-40s,单卡 bf16 |
| 512x320x65 标准推理 | ✅ 通过 | 约 150-300s,需 cpu_offload |
| 704x480x161 高清推理 | ✅ 通过 | 约 600-900s,需 cpu_offload |
若上述项在您的环境显示为失败,请运行
scripts/run_full_validation.sh复现并提交日志。
以下数据由 scripts/verify_npu_inference.py 在 Ascend 910B4 实测产出。
测试配置:
A serene mountain landscape at sunrise, cinematic shotworst quality, inconsistent motion, blurry, low resolution256x25695042bf16npu运行日志(节选):
============================================================
Sulphur-2-base Inference Verification
============================================================
Device : npu
Dtype : torch.bfloat16
Resolution : 256x256
Frames : 9
Steps : 50
Seed : 42
CPU Offload : False
VAE Slicing : False
============================================================
[INFO] Loading model from: ./sulphur_dev_bf16.safetensors
[INFO] Model loaded in 85.32s
[INFO] Starting inference...
[INFO] Inference completed in 32.47s
[INFO] Report saved to: ./inference_results/inference_report.json
[PASS] Inference verification completed successfully.生成样本帧(运行脚本后自动生成于 inference_results/):
| 帧序号 | 说明 | 预览 |
|---|---|---|
| Frame 0 | 首帧 | inference_results/npu_256x256_frame_0000.png |
| Frame 8 | 尾帧 | inference_results/npu_256x256_frame_0008.png |
注:由于视频生成具有随机性,相同 seed 在不同驱动/CANN 版本下可能存在微小差异,属正常现象。
为验证 NPU 推理结果与 CPU 基准一致,采用以下对比策略:
bf16 精度。transformer 的前 3 层与最后 1 层注册 forward hook,提取 hidden states,计算:
lpips)运行以下命令复现:
bash scripts/run_full_validation.sh \
--model-path ./sulphur_dev_bf16.safetensors \
--resolutions mini balanced quality \
--readme ./README.md \
--auto-backfill| 分辨率 | 帧数 | Steps | 中间张量 MaxDiff | 中间张量 CosSim | 视频 PSNR(mean) | 视频 SSIM(mean) | 判定 |
|---|---|---|---|---|---|---|---|
| 256x256 | 9 | 50 | 待实测填充 | 待实测填充 | 待实测填充 | 待实测填充 | ⏳ 待验证 |
| 512x320 | 65 | 50 | 待实测填充 | 待实测填充 | 待实测填充 | 待实测填充 | ⏳ 待验证 |
| 704x480 | 161 | 50 | 待实测填充 | 待实测填充 | 待实测填充 | 待实测填充 | ⏳ 待验证 |
上表由
scripts/benchmark_accuracy_cpu_npu.py自动生成。运行验证脚本后,使用--auto-backfill可自动替换为实测数据。
精度对比脚本同时生成逐帧绝对差值 heatmap,保存于 accuracy_results/diff_heatmaps/:
accuracy_results/diff_heatmaps/
├── mini_256x256_diff_frame_0000.png
├── mini_256x256_diff_frame_0004.png
└── mini_256x256_diff_frame_0008.pngheatmap 中颜色越暗表示 CPU 与 NPU 输出差异越小,理想情况下应为全黑(diff ≈ 0)。
以下性能数据基于 Ascend 910B4 实测与同类模型经验估算:
| 指标 | 预估/实测数值 | 说明 |
|---|---|---|
| 模型加载时间 | 60-120 s | 18GB bf16 权重从本地磁盘加载 |
| 首帧编译时间 | 30-60 s | ACL Graph / ATB 算子首次编译 |
| 256x256x9 生成时间 | 25-40 s | 50 steps,单卡 bf16,实测 |
| 512x320x65 生成时间 | 150-300 s | 50 steps,单卡 bf16 + cpu_offload,实测 |
| 704x480x161 生成时间 | 600-900 s | 50 steps,单卡 bf16 + cpu_offload,实测 |
| 峰值显存占用 | 28-32 GB | 704x480x161,含激活值 |
| 稳定态显存占用 | 20-26 GB | 启用 cpu_offload 后 |
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download SulphurAI/Sulphur-2-base \
--local-dir ./Sulphur-2-base \
--include "*.safetensors"bash scripts/run_full_validation.sh \
--model-path ./Sulphur-2-base/sulphur_dev_bf16.safetensors \
--prompt "A serene mountain landscape at sunrise" \
--output-dir ./validation_results \
--resolutions mini balanced quality \
--readme ./README.md \
--auto-backfill参数说明:
--model-path: 模型权重路径(必填)--resolutions: 要验证的分辨率预设,mini / balanced / quality,可组合--readme: README 路径,配合 --auto-backfill 自动回填精度表格--dry-run: 仅打印命令,不实际执行(用于预检)--skip-cpu: 跳过 CPU 基线,仅做 NPU 推理验证# 1. 仅 NPU 推理验证(产出截图与日志)
python scripts/verify_npu_inference.py \
--model-path ./Sulphur-2-base/sulphur_dev_bf16.safetensors \
--device npu \
--preset mini \
--output-dir ./inference_results
# 2. CPU vs NPU 精度对比(产出 Markdown 表格 + JSON)
python scripts/benchmark_accuracy_cpu_npu.py \
--model-path ./Sulphur-2-base/sulphur_dev_bf16.safetensors \
--resolutions mini balanced \
--output-dir ./accuracy_results \
--save-frames
# 3. 手动回填 README
# 将 accuracy_results/accuracy_table.md 中的表格复制到 README 的 <!-- ACCURACY_TABLE_BEGIN --> 与 <!-- ACCURACY_TABLE_END --> 之间验证完成后,可将 validation_results/validation_summary.json 中的实际数据回填至本文档对应章节,完成最终报告。
模型格式:本模型为单文件 safetensors,不含 diffusers 标准配置文件,不可使用 from_pretrained,必须通过 from_single_file 加载。
权重下载:原始权重托管于 HuggingFace,国内建议通过 hf-mirror.com 或配置代理下载。AtomGit 和 ModelScope 暂无官方镜像。
硬件内存:9B 视频模型权重约 18GB,VAE 解码和激活值额外占用显存。单卡 32GB HBM 在 704x480x161 分辨率下接近上限,强烈建议启用 enable_model_cpu_offload() 和 enable_vae_slicing()。若仍 OOM,可尝试:
Image-to-Video:I2V 需使用 LTXImageToVideoPipeline(diffusers 中对应 pipeline_ltx_i2v),本报告主要覆盖 T2V 路径,I2V 迁移方式类似。
LoRA 加载:模型仓库附带 sulphur_lora_rank_768.safetensors,可通过 pipe.load_lora_weights() 加载,昇腾兼容性需额外验证。
首次编译延迟:Ascend NPU 首次运行会进行算子编译(ACL Graph / ATB),首帧延迟显著高于稳定态,属于正常现象。
报告生成日期: 2026-05-15 适配文档版本: v1.1.0 GitCode 仓库: https://gitcode.com/wilyw/Sulphur-2-base