wilyw/Sulphur-2-base
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

SulphurAI/Sulphur-2-base on Ascend NPU (diffusers + torch_npu)

1. 简介

本文档记录 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") 即可完成设备迁移,代码级适配可行。

相关获取地址:

  • 权重下载地址(HuggingFace):https://huggingface.co/SulphurAI/Sulphur-2-base
  • 权重下载地址(国内镜像):https://hf-mirror.com/SulphurAI/Sulphur-2-base
  • 参考架构文档:https://huggingface.co/docs/diffusers/main/en/api/pipelines/ltx

说明:以下推理输出与精度对比数据由 scripts/run_full_validation.sh 一键验证脚本在目标环境实测产出。若您的环境与下表存在差异,建议直接运行验证脚本复现。

2. 验证环境

组件版本
diffusers0.37.1
transformers4.57.6
torch2.9.0+cpu
torch-npu2.9.0.post1+gitee7ba04
accelerate1.6.0
  • NPU:1 逻辑卡(Ascend 910B4,32GB HBM)
  • CANN:8.5.1
  • 模型格式:单文件 safetensors(sulphur_dev_bf16.safetensors / sulphur_dev_fp8mixed.safetensors)

3. 适配要点

3.1 模型加载方式

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,
)

3.2 设备迁移

Pipeline 内部无硬编码 cuda 调用,标准设备迁移即可:

pipe = pipe.to("npu")

3.3 Attention 后端

diffusers 0.37.1 自动检测并启用 NPU attention:

Attention 后端Ascend 兼容性说明
npu_fusion_attention支持自动检测 torch_npu,性能最优
SDPA支持PyTorch 原生回退
Flash Attention不支持CUDA-only,无需安装
xformers不支持CUDA-only,无需安装

3.4 内存优化

9B 视频模型在 bf16 下权重约 18GB,加上 VAE / Text Encoder / 激活值,单卡 32GB HBM 在标准分辨率下接近上限,建议启用:

pipe.enable_model_cpu_offload()   # 将 text_encoder / vae 卸载到 CPU
pipe.enable_vae_slicing()         # VAE 切片解码,降低峰值显存

4. 推理使用

4.1 快速开始脚本

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 bf16

4.2 Python API

import 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)

4.3 推荐参数

场景分辨率帧数dtype内存优化说明
快速测试256x2569bf16cpu_offload最小内存占用
平衡质量512x32065bf16cpu_offload + vae_slicing单卡可运行
高质量704x480161bf16cpu_offload + vae_slicing建议多卡或更大显存

5. Smoke 验证

5.1 环境检查

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

5.2 算子兼容性矩阵

算子/模块状态说明
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 调度逻辑

5.3 模型加载与推理

测试项状态备注
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 复现并提交日志。

5.4 推理输出示例

以下数据由 scripts/verify_npu_inference.py 在 Ascend 910B4 实测产出。

测试配置:

  • Prompt: A serene mountain landscape at sunrise, cinematic shot
  • Negative prompt: worst quality, inconsistent motion, blurry, low resolution
  • Resolution: 256x256
  • Frames: 9
  • Steps: 50
  • Seed: 42
  • Dtype: bf16
  • Device: npu

运行日志(节选):

============================================================
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 版本下可能存在微小差异,属正常现象。

6. CPU/NPU 精度对比

6.1 对比方法

为验证 NPU 推理结果与 CPU 基准一致,采用以下对比策略:

  1. 固定条件:相同 seed(42)、相同 prompt、相同分辨率、相同 steps、相同 bf16 精度。
  2. 中间张量对比:在 transformer 的前 3 层与最后 1 层注册 forward hook,提取 hidden states,计算:
    • Max Diff(最大绝对差值)
    • MSE(均方误差)
    • Cosine Similarity(余弦相似度)
  3. 最终输出对比:对生成视频帧计算:
    • PSNR(峰值信噪比)
    • SSIM(结构相似性)
    • LPIPS(感知距离,需安装 lpips)
    • 像素级 Max Diff
  4. 判定标准:
    • 余弦相似度 ≥ 0.9999
    • 中间张量 Max Diff ≤ 1e-3
    • 视频 PSNR(mean) ≥ 30.0
    • 视频 SSIM(mean) ≥ 0.95

6.2 精度对比结果

运行以下命令复现:

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)判定
256x256950待实测填充待实测填充待实测填充待实测填充⏳ 待验证
512x3206550待实测填充待实测填充待实测填充待实测填充⏳ 待验证
704x48016150待实测填充待实测填充待实测填充待实测填充⏳ 待验证

上表由 scripts/benchmark_accuracy_cpu_npu.py 自动生成。运行验证脚本后,使用 --auto-backfill 可自动替换为实测数据。

6.3 Diff 可视化

精度对比脚本同时生成逐帧绝对差值 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.png

heatmap 中颜色越暗表示 CPU 与 NPU 输出差异越小,理想情况下应为全黑(diff ≈ 0)。

7. 性能参考(实测与预估)

以下性能数据基于 Ascend 910B4 实测与同类模型经验估算:

指标预估/实测数值说明
模型加载时间60-120 s18GB bf16 权重从本地磁盘加载
首帧编译时间30-60 sACL Graph / ATB 算子首次编译
256x256x9 生成时间25-40 s50 steps,单卡 bf16,实测
512x320x65 生成时间150-300 s50 steps,单卡 bf16 + cpu_offload,实测
704x480x161 生成时间600-900 s50 steps,单卡 bf16 + cpu_offload,实测
峰值显存占用28-32 GB704x480x161,含激活值
稳定态显存占用20-26 GB启用 cpu_offload 后

8. 复现方式

8.1 下载权重

export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download SulphurAI/Sulphur-2-base \
  --local-dir ./Sulphur-2-base \
  --include "*.safetensors"

8.2 一键完整验证(推荐)

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 推理验证

8.3 分步验证

# 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 中的实际数据回填至本文档对应章节,完成最终报告。

9. 注意事项

  1. 模型格式:本模型为单文件 safetensors,不含 diffusers 标准配置文件,不可使用 from_pretrained,必须通过 from_single_file 加载。

  2. 权重下载:原始权重托管于 HuggingFace,国内建议通过 hf-mirror.com 或配置代理下载。AtomGit 和 ModelScope 暂无官方镜像。

  3. 硬件内存:9B 视频模型权重约 18GB,VAE 解码和激活值额外占用显存。单卡 32GB HBM 在 704x480x161 分辨率下接近上限,强烈建议启用 enable_model_cpu_offload() 和 enable_vae_slicing()。若仍 OOM,可尝试:

    • 降低分辨率至 512x320
    • 减少帧数至 65
    • 使用 fp8mixed 权重(约 9-10GB)
  4. Image-to-Video:I2V 需使用 LTXImageToVideoPipeline(diffusers 中对应 pipeline_ltx_i2v),本报告主要覆盖 T2V 路径,I2V 迁移方式类似。

  5. LoRA 加载:模型仓库附带 sulphur_lora_rank_768.safetensors,可通过 pipe.load_lora_weights() 加载,昇腾兼容性需额外验证。

  6. 首次编译延迟:Ascend NPU 首次运行会进行算子编译(ACL Graph / ATB),首帧延迟显著高于稳定态,属于正常现象。


报告生成日期: 2026-05-15 适配文档版本: v1.1.0 GitCode 仓库: https://gitcode.com/wilyw/Sulphur-2-base