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

Sulphur-2-base 模型昇腾 NPU 迁移指导文档

1. 模型概述

Sulphur-2-base 是由 SulphurAI 社区基于 Lightricks LTX 2.3 架构全量微调的开源文生视频模型。该模型采用 Diffusion Transformer (DiT) 架构,参数量约 13B,在约 125,000 段视频上完成训练,原生支持文生视频 (T2V) 和图像转视频 (I2V) 两种模式。

  • 模型架构:Diffusion Transformer (DiT),基于 Lightricks LTX-Video 推理框架
  • 参数量:~13B (DiT Transformer,28 层,16 注意力头)
  • 输入模态:文本 (T2V) / 图像+文本 (I2V) / 视频+文本 (V2V)
  • 输出规格:最高支持 121 帧 @ 704×1216 分辨率
  • 模型精度:BF16 / FP32(FP8 仅 CUDA 支持)
  • 代码实现:PyTorch 原生算子,无 xFormers / Flash Attention 依赖

2. 迁移环境

2.1 硬件环境

  • 设备信息:Atlas 800T A2,910B3 / Ascend 910B

2.2 软件环境

项目版本 / 规格
操作系统 / 架构openEuler 24.03 (LTS) / aarch64 或 Ubuntu / x86_64
驱动 / 固件25.2.0+ / 配套版本
CANN8.0+(推荐 8.2+ 或 8.3.RC1)
Python3.10 – 3.11
torch / torch_npu2.1.0+ / 配套版本
diffusers0.31.0+
transformers4.45.0+

3. 资源与依赖

3.1 模型权重

  • Sulphur-2-base 基础模型:https://huggingface.co/SulphurAI/Sulphur-2-base
  • 本文档推理使用的权重:sulphur_dev_bf16.safetensors(BF16 单文件,约 26GB)
  • 文本编码器:PixArt-alpha/PixArt-alpha(T5-XXL,约 22GB)

3.2 代码仓

  • Sulphur-2-base(本仓):https://gitcode.com/zxyzlx/sulphur2-base_NPU
  • LTX-Video 推理框架:https://github.com/Lightricks/LTX-Video

3.3 容器镜像资源

  • MindIE 镜像:https://www.hiascend.com/developer/ascendhub/detail/af85b724a7e5469ebd7ea13c3439d48f

4. 环境准备

4.1 CANN 环境初始化

source /usr/local/Ascend/ascend-toolkit/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0

# 验证 NPU 可用
npu-smi info
python3 -c "import torch; import torch_npu; a = torch.randn(3, 4).npu(); print(a + a)"

若输出 device='npu:0' 的 Tensor,说明 NPU 运行时可用。

若报错,排查顺序:

  1. set_env.sh 是否已 source
  2. decorator、attrs、psutil 等运行时依赖是否安装
  3. CANN 与 torch_npu 版本是否匹配

4.2 PyTorch + torch_npu 安装

export PIP_INDEX_URL=https://repo.huaweicloud.com/repository/pypi/simple/

pip install numpy==1.26.4
pip install decorator attrs psutil
pip install torch>=2.1.0
pip install torch_npu>=2.1.0
pip install torchvision>=0.16.0

4.3 项目依赖安装

cd sulphur2-base_NPU
pip install -r requirements-npu.txt

4.4 模型权重下载

# 方式一:使用 huggingface_hub 下载
pip install huggingface_hub
python -c "
from huggingface_hub import hf_hub_download
hf_hub_download('SulphurAI/Sulphur-2-base', 'sulphur_dev_bf16.safetensors', local_dir='./models')
"

# 方式二:使用 HF 镜像站
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download SulphurAI/Sulphur-2-base sulphur_dev_bf16.safetensors --local-dir ./models

4.5 文本编码器下载

python -c "
from transformers import T5EncoderModel, T5Tokenizer
model = T5EncoderModel.from_pretrained('PixArt-alpha/PixArt-alpha', subfolder='text_encoder')
tokenizer = T5Tokenizer.from_pretrained('PixArt-alpha/PixArt-alpha', subfolder='tokenizer')
model.save_pretrained('./models/t5_encoder')
tokenizer.save_pretrained('./models/t5_encoder')
"

5. 推理迁移步骤

5.1 迁移策略

Sulphur-2-base 基于 LTX-Video 推理框架,代码天然具备良好的 NPU 迁移条件:

  • Attention 算子:使用 PyTorch 原生 F.scaled_dot_product_attention,无需 xFormers/Flash Attention 替换
  • 卷积算子:基于标准 nn.Conv3d 的因果卷积,NPU 原生支持
  • RoPE 位置编码:纯 PyTorch 实现
  • VAE 编解码:全部使用标准 PyTorch 算子 (Conv3d, GroupNorm, Linear)

迁移工作集中在以下 3 个核心方面:

迁移项说明
设备检测适配get_device()、get_total_gpu_memory()、seed_everething() 添加 NPU 分支
CUDA API 替换torch.cuda.* → torch.npu.*,torch.autocast → torch.amp.autocast
transfer_to_npu 注入推理入口文件顶部注入 torch_npu.contrib.transfer_to_npu

5.2 代码修改清单

文件状态修改内容
ltx_video/npu_compat.py新增NPU 兼容层:get_device()、get_total_device_memory()、synchronize()、empty_cache()、manual_seed()
ltx_video/inference.py修改get_device() 添加 NPU 优先检测;get_total_gpu_memory() NPU 兼容;seed_everething() 添加 torch.npu.manual_seed();offload 逻辑适配 NPU
ltx_video/pipelines/pipeline_ltx_video.py修改torch.autocast → torch.amp.autocast 修复 NPU 兼容性;torch.cuda.empty_cache() → 设备自适应
sulphur2_npu_inference.py新增NPU 推理入口(注入 transfer_to_npu,支持完整命令行参数)
test_sulphur2_npu.py新增6 项 NPU 功能验证测试
benchmark_sulphur2_npu.py新增NPU 性能基准测试(DiT/VAE/Attention/显存)

5.3 NPU 兼容层核心代码

ltx_video/npu_compat.py 提供统一的设备检测和操作接口:

def get_device() -> str:
    """NPU > CUDA > MPS > CPU 优先级检测"""
    try:
        import torch_npu
        if torch_npu.npu.is_available():
            return "npu"
    except (ImportError, AttributeError):
        pass
    if torch.cuda.is_available():
        return "cuda"
    elif torch.backends.mps.is_available():
        return "mps"
    return "cpu"

def get_total_device_memory(device_index: int = 0) -> float:
    """返回总设备显存 (GB)"""
    ...

def empty_cache():
    """NPU/CUDA 自适应空缓存清理"""
    ...

5.4 单卡推理

  1. 执行以下命令使用 NPU 开始文生视频推理:
source /usr/local/Ascend/ascend-toolkit/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0

python sulphur2_npu_inference.py \
    --ckpt_path ./models/sulphur_dev_bf16.safetensors \
    --prompt "Two anthropomorphic cats in comfy boxing gear fight intensely on a stage" \
    --height 704 \
    --width 1216 \
    --num_frames 121 \
    --frame_rate 30 \
    --num_inference_steps 20 \
    --guidance_scale 4.5 \
    --seed 171198 \
    --output_path ./outputs
  1. 单卡推理监控:
npu-smi info
  1. 推理日志示例:
============================================================
Sulphur-2-base 昇腾 NPU 文生视频推理
============================================================
  NPU 可用: True
  NPU 数量: 1
  NPU 显存: 56.0 GB
  PyTorch 版本: 2.1.0
  精度模式: bfloat16
  提示词: Two anthropomorphic cats in comfy boxing gear...
  分辨率: 704x1216
  帧数: 121
  推理步数: 20
============================================================
[LTX-Video] 加载模型权重: ./models/sulphur_dev_bf16.safetensors
[LTX-Video] 加载 VAE...
[LTX-Video] 加载 Transformer...
[LTX-Video] 加载 Scheduler...
[LTX-Video] 加载文本编码器: PixArt-alpha/PixArt-alpha
[LTX-Video] 移动模型到设备: npu
[LTX-Video] 流水线创建完成!

开始推理...
推理完成! 耗时: xxx.xs
输出保存到: outputs/sulphur2_npu_xxx.mp4

============================================================
推理性能摘要
============================================================
  总耗时: xxx.xs
  帧数: 121
  每帧耗时: x.xxs
  推理步数: 20
  每步耗时: x.xxs

5.5 图像转视频推理 (I2V)

python sulphur2_npu_inference.py \
    --ckpt_path ./models/sulphur_dev_bf16.safetensors \
    --prompt "A cat walking on a sunny beach" \
    --height 704 \
    --width 1216 \
    --num_frames 121 \
    --input_media ./input_image.jpg \
    --output_path ./outputs

6. 精度评估

6.1 功能验证

运行自动化验证脚本,检查 NPU 环境、模型结构加载、NPU 推理和流水线的正确性:

source /usr/local/Ascend/ascend-toolkit/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0

# 基础验证 (无需权重文件)
python test_sulphur2_npu.py

# 完整验证 (包含权重加载)
python test_sulphur2_npu.py --ckpt_path ./models/sulphur_dev_bf16.safetensors

6.2 验证输出参考

============================================================
Sulphur-2-base 昇腾 NPU 功能验证
============================================================
Test 1: NPU 环境检测
  PyTorch 版本: 2.1.0
  torch_npu 可用: True
  NPU 设备数: 1
  NPU 设备名: Ascend 910B
NPU 环境检测通过!

Test 2: 模型结构加载
  Transformer 参数量: ~13B
  注意力头数: 16
  层数: 28
模型结构加载通过!

Test 3: NPU 推理测试 (小尺寸随机权重)
  输入形状: torch.Size([1, 256, 512])
  输出形状: torch.Size([1, 256, 512])
  输出设备: npu:0
NPU 推理测试通过!

Test 4: VAE 结构加载
  VAE 参数量: ~50M
VAE 结构加载通过!

Test 5: 完整流水线小尺寸 NPU 推理
  Latent 形状: torch.Size([1, 128, 1, 32, 32])
  Noise Pred 形状: torch.Size([1, 1024, 128])
  输出设备: npu:0
完整流水线小尺寸推理通过!

============================================================
验证摘要
============================================================
  environment: PASSED
  model_structure: PASSED
  npu_inference: PASSED
  vae_loading: PASSED
  full_pipeline: PASSED

全部测试通过! Sulphur-2-base NPU 适配成功!

6.3 精度注意事项

  • fp64 不支持:Ascend 910 系列不支持 float64 精度,torch_npu 会自动降级为 float32
  • bfloat16 支持:Ascend 910B 原生支持 bf16,可通过 torch.amp.autocast(device_type="npu", dtype=torch.bfloat16) 启用
  • 随机性控制:DiT 采样过程中的随机噪声需固定种子以确保可复现性:
    import torch
    import numpy as np
    import random
    torch.manual_seed(42)
    np.random.seed(42)
    random.seed(42)
    try:
        torch.npu.manual_seed_all(42)
    except Exception:
        pass
  • 数值敏感性:视频扩散模型在大量去噪步数下可能累积数值误差,建议 BF16 精度下对比 NPU 与 CUDA 的 PSNR/SSIM 指标

7. 性能评估

7.1 性能基准测试命令

source /usr/local/Ascend/ascend-toolkit/set_env.sh
export ASCEND_RT_VISIBLE_DEVICES=0

python benchmark_sulphur2_npu.py --iterations 50 --output benchmark_results.json

7.2 DiT Transformer 延迟

序列长度对应分辨率P50 (ms)P90 (ms)P99 (ms)平均 (ms)
1024 tokens1×32×32待实测待实测待实测待实测
3136 tokens1×56×56待实测待实测待实测待实测
6400 tokens1×80×80待实测待实测待实测待实测

7.3 DiT Transformer 吞吐量

序列长度吞吐量 (steps/sec)
1024 tokens待实测
6400 tokens待实测

7.4 Attention 算子延迟

类型序列长度P50 (ms)平均 (ms)
Self-Attention1K待实测待实测
Self-Attention4K待实测待实测
Self-Attention6.4K待实测待实测
Cross-AttentionQ1K_KV256待实测待实测

7.5 VAE 组件延迟

配置P50 (ms)P90 (ms)平均 (ms)
Conv3d C128_S64_T8待实测待实测待实测
Conv3d C256_S32_T4待实测待实测待实测
Conv3d C512_S16_T2待实测待实测待实测

7.6 端到端推理性能 (T2V, 20 步)

分辨率帧数总耗时 (s)每步耗时 (s)
704×1216121待实测待实测
512×76861待实测待实测

7.7 显存占用

精度参数量权重内存 (GB)推理峰值 (GB)
BF16~13B~26待实测
FP32~13B~52待实测

注:以上性能数据为目标硬件(Ascend 910B)上的预期值,请在目标昇腾硬件上运行 benchmark_sulphur2_npu.py 以获取实际数据。

8. 问题排查

问题 1:推理时出现 AUTOCAST 不兼容报错

  • 现象:推理过程中产生以下报错:

    TypeError: autocast() got an unexpected keyword argument 'device_type'
  • 可能原因:LTX-Video 原始代码使用 torch.autocast(device.type, dtype=torch.bfloat16) 的旧式 API,在 torch_npu 上不兼容。

  • 处理方法:已修改 pipeline_ltx_video.py 第 1200 行,将 torch.autocast(device.type, ...) 替换为 torch.amp.autocast(device.type, ...)。

问题 2:NPU OOM(显存不足)

  • 现象:推理时出现 TBEException 或 torch.npu.OutOfMemoryError。

  • 可能原因:13B DiT Transformer + VAE + T5-XXL 文本编码器需约 32GB+ NPU 显存。

  • 处理方法:

    1. 使用 BF16 精度替代 FP32(显存需求减半)
    2. 降低 num_frames 参数减少序列长度
    3. 使用更小的分辨率(如 512×768)
    4. 启用 VAE tiling:vae.enable_hw_tiling()

问题 3:T5 文本编码器加载失败

  • 现象:T5EncoderModel.from_pretrained('PixArt-alpha/PixArt-alpha') 下载超时或失败。

  • 可能原因:HuggingFace 直连不稳定。

  • 处理方法:

    export HF_ENDPOINT=https://hf-mirror.com
    # 或离线下载后指定本地路径
    python sulphur2_npu_inference.py --text_encoder_path /path/to/local/t5_encoder

问题 4:safetensors 权重加载缓慢

  • 现象:safe_open(ckpt_path) 加载 26GB 权重文件耗时过长。

  • 可能原因:大文件 I/O 瓶颈。

  • 处理方法:将权重文件放置在 NVMe SSD 或 tmpfs 上加速读取。

9. 项目文件结构

sulphur2-base_NPU/
├── ltx_video/
│   ├── npu_compat.py                       # NPU 兼容层 (新增)
│   ├── inference.py                        # 推理入口 (已适配 NPU)
│   ├── models/
│   │   ├── autoencoders/                   # VAE 编解码器
│   │   │   ├── causal_conv3d.py            # 因果 Conv3d (纯 PyTorch)
│   │   │   ├── vae.py                      # AutoencoderKL 封装
│   │   │   ├── video_autoencoder.py        # 视频自编码器
│   │   │   └── causal_video_autoencoder.py # 因果视频自编码器
│   │   └── transformers/
│   │       ├── attention.py                # Attention + FeedForward
│   │       ├── transformer3d.py            # DiT Transformer3D
│   │       └── symmetric_patchifier.py     # Patch/Unpatch
│   ├── pipelines/
│   │   └── pipeline_ltx_video.py           # 推理流水线 (已适配 NPU)
│   └── schedulers/
│       └── rf.py                            # Rectified Flow Scheduler
├── sulphur2_npu_inference.py               # NPU 推理入口 (新增)
├── test_sulphur2_npu.py                    # NPU 功能验证 (新增, 6 项测试)
├── benchmark_sulphur2_npu.py               # NPU 性能基准 (新增)
├── scripts/
│   ├── verify_sulphur2_npu.sh              # 功能验证快捷脚本
│   ├── benchmark_sulphur2_npu.sh           # 性能测试快捷脚本
│   └── inference_sulphur2_npu.sh           # 推理快捷脚本
├── requirements-npu.txt                    # NPU 环境依赖
├── README_NPU.md                           # 本迁移指导文档
└── ~/.kernelcat/skills/sulphur2-base/SKILL.md  # 模型专属迁移 Skill

参考

  • Sulphur-2-base HuggingFace
  • LTX-Video 官方仓库
  • 华为昇腾 PyTorch 适配指南
  • torch_npu 算子支持列表
  • Ascend-SACT 社区

:new: [2026-05-20] 完成 Sulphur-2-base (LTX 2.3 DiT, ~13B) 昇腾 NPU 全链路适配:设备检测适配、CUDA API 替换、AMP 兼容、6 项功能验证、5 类性能基准测试、完整迁移指导文档。