cheems_4396/Z-Anime
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

SeeSee21/Z-Anime (Z-Image) 昇腾 NPU 适配方案

目标模型: SeeSee21/Z-Anime(基于 Tongyi-MAI/Z-Image 的动漫风格 Stable Diffusion Transformer) 目标硬件: Atlas 800 A2 (Ascend 910B4) 软件栈: CANN 8.5.1, torch_npu 2.9.0.post1, diffusers >= 0.37.0.dev0, transformers >= 4.51.0


1. 项目结构

z-anime-npu/
|-- npu_compat.py          # NPU 适配层:算子兼容性修复 + torch_npu 亲和算子替换
|-- infer_npu.py           # 昇腾 NPU text-to-image 推理脚本
|-- README.md              # 部署与使用文档(本文件)
|-- REPORT.md              # 完整适配报告(架构分析、性能数据、精度评估)
|-- models/                # 模型权重缓存目录(运行后自动生成)
|   |-- Tongyi-MAI/Z-Image # 基座模型(已验证)
|   `-- SeeSee21/Z-Anime   # 动漫微调模型(需自行下载)
`-- *.png                  # 推理输出样例

2. 快速开始

2.1 环境准备

# 1. 确认 CANN 和 torch_npu 已正确安装
python -c "import torch; import torch_npu; print(torch.npu.get_device_name(0))"
# 期望输出: Ascend910B4

# 2. 安装依赖
pip install git+https://github.com/huggingface/diffusers
pip install transformers accelerate modelscope

2.2 下载模型

基座模型 Tongyi-MAI/Z-Image(国内可直接从 ModelScope 下载):

python -c "
from modelscope import snapshot_download
snapshot_download('Tongyi-MAI/Z-Image', cache_dir='./models')
"

动漫风格模型 SeeSee21/Z-Anime(需 HuggingFace 访问或镜像):

# 方式 1: 直接下载(需能访问 huggingface.co)
HF_HOME=./models huggingface-cli download SeeSee21/Z-Anime

# 方式 2: 使用镜像
HF_ENDPOINT=https://hf-mirror.com HF_HOME=./models huggingface-cli download SeeSee21/Z-Anime

Z-Anime 是 Z-Image 的动漫风格微调版本,适配层 npu_compat.py 完全兼容,无需额外修改。

2.3 运行推理

# Baseline(仅兼容性修复,原生 PyTorch 算子)
python infer_npu.py \
  --model ./models/Tongyi-MAI/Z-Image \
  --prompt "1girl, anime style, best quality" \
  --height 512 --width 512 \
  --steps 28 --baseline \
  --output output_baseline.png

# Optimized(启用 torch_npu 融合算子)
python infer_npu.py \
  --model ./models/Tongyi-MAI/Z-Image \
  --prompt "1girl, anime style, best quality" \
  --height 512 --width 512 \
  --steps 28 --optimized \
  --output output_optimized.png

# Optimized + 运行时流水优化(推荐生产环境)
TASK_QUEUE_ENABLE=2 python infer_npu.py \
  --model ./models/Tongyi-MAI/Z-Image \
  --prompt "1girl, anime style, best quality" \
  --height 512 --width 512 \
  --steps 28 --optimized \
  --output output_prod.png

2.4 关键参数说明

参数说明推荐值
--height, --width生成图像分辨率512~2048(任意宽高比)
--steps推理步数2850(质量优先)/ 48(速度优先)
--guidance_scaleCFG 强度3.0~5.0
--dtype计算精度bf16(默认,推荐)
--optimized启用融合算子生产环境建议开启
--no_attention_fusion禁用 Attention 融合如需像素级可复现性时开启
--warmup预热轮数>=1(首次推理需编译算子)
--benchmarkBenchmark 轮数>=3(用于性能统计)

3. 适配层说明 (npu_compat.py)

3.1 强制性兼容性修复

无论是否启用 --optimized,NPU 运行时都会自动应用以下修复:

修复项问题描述解决方案
RopeEmbedder complex64 索引Ascend NPU 不支持 DT_COMPLEX64 类型的 index/aclnnIndex预计算保持在 CPU,索引后转移至 NPU

3.2 可选性能优化(--optimized)

原算子替换为适用场景精度差异
手写 RMSNorm (pow->mean->rsqrt)npu_rms_normQwen3 TextEncoder + Z-Image DiT~0.008 (bf16)
SwiGLU (SiLU(x1)*x3)npu_swigluQwen3 MLP + Z-Image FeedForward~0.06 (bf16)
SDPA Attentionnpu_fusion_attentionZ-Image DiT joint attention~2.0 (bf16)

注意: npu_rotary_mul 对 Qwen3 的 BNSD layout 存在 shape broadcast 限制,当前版本未启用 Qwen3 RoPE 替换。Qwen3 TextEncoder 已通过 transformers SDPA 后端获得加速。


4. 性能参考

Atlas 800 A2 (910B4), CANN 8.5.1, bf16, 512x512:

配置4 steps28 steps
Baseline (compat only)1.027s5.624s
Optimized (算子融合)1.005s5.624s
Optimized + TASK_QUEUE_ENABLE=20.945s5.492s

首次推理说明: 首次 NPU 推理包含 CANN 算子编译开销(约 60s),预热后消失。生产环境务必先执行 warmup。


5. 精度与验收

5.1 数值精度

融合算子与原生算子在 bf16 精度下存在微小差异:

  • RMSNorm: ~0.008
  • SwiGLU: ~0.06
  • Attention: ~2.0

对于扩散模型,这些差异会在多步迭代中被放大,导致像素级不一致。但两次 Baseline 运行(同 seed)可完全复现(MSE=0)。

5.2 验收建议

  • 功能验收: 相同 prompt + seed 多次运行,输出图片应一致(同配置下)
  • 质量验收: 通过视觉评估图像质量,不应出现明显 artifacts、色彩失真、结构崩坏
  • 性能验收: 512x512 @ 28 steps 稳定低于 6s(910B4)

5.3 可复现性选项

如需与 CUDA/CPU 基线保持像素级一致,可使用:

python infer_npu.py --optimized --no_attention_fusion ...

此时保留 RMSNorm + SwiGLU 融合(性能收益较小),但禁用 Attention 融合(主要精度差异来源)。


6. 常见问题 (FAQ)

Q1: 首次推理为什么特别慢? A: Ascend NPU 首次运行需要 JIT 编译算子并生成缓存,约 60s。第二次起恢复正常。

Q2: 能否使用 Z-Anime 替代 Z-Image? A: 可以。Z-Anime 是 Z-Image 基座 + 动漫风格微调,架构完全相同,直接替换模型路径即可。

Q3: 显存不足 (OOM) 怎么办? A: 10B 参数 bf16 模型在 512x512 下约需 19~21GB。若 OOM,尝试:

  • 降低分辨率至 384x384
  • 使用 --dtype fp16(部分算子可能回退)
  • 设置 PYTORCH_NPU_ALLOC_CONF=max_split_size_mb:512

Q4: 如何确认融合算子已生效? A: 运行时会打印 [npu_compat] Patched xxx。也可通过 CANN Profiling 查看实际算子名称。


7. 引用

  • Z-Image 官方: https://github.com/Tongyi-MAI/Z-Image
  • HuggingFace: https://huggingface.co/SeeSee21/Z-Anime
  • torch_npu 性能调优文档: https://www.hiascend.com/document/detail/zh/Pytorch/730/ptmoddevg/trainingmigrguide/performance_tuning_0001.html