JeffDing/Qwen-Image-Edit-2511-FP8
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

Qwen-Image-Edit-2511-FP8 on Ascend NPU

1. 简介

本文档记录 Qwen-Image-Edit-2511-FP8 在华为昇腾 Ascend 910 NPU 上的适配与验证结果。

Qwen-Image-Edit 是通义千问团队推出的图像编辑基础模型,基于 20B 参数的 Qwen-Image 模型,结合 Qwen2.5-VL(视觉语义控制)和 VAE Encoder(视觉外观控制),支持语义编辑和外观编辑两种模式,同时具备精准的中英文文字编辑能力。

本适配工作将 Qwen-Image-Edit 成功部署到昇腾 NPU 上,使用 diffusers 的 QwenImageEditPipeline 进行推理,精度与 CPU (FP32) 误差 < 1%。

相关获取地址:

  • 权重下载地址(ModelScope):https://modelscope.cn/models/Qwen/Qwen-Image-Edit
  • 权重下载地址(HuggingFace):https://huggingface.co/Qwen/Qwen-Image-Edit
  • FP8 量化版本(GitCode):https://gitcode.com/hf_mirrors/Qwen-Image-Edit-2511-FP8
  • 技术报告:https://arxiv.org/abs/2508.02324
  • GitHub:https://github.com/QwenLM/Qwen-Image

2. 验证环境

组件版本
torch2.9.0+cpu
torch_npu2.9.0.post1+gitee7ba04
transformers4.57.6
diffusers0.37.1
accelerate1.13.0
modelscope1.35.3
CANN8.5.1
  • NPU:2 x Ascend 910 (Ascend910_9362),每卡 64GB HBM
  • 模型路径:/tmp/model_cache/Qwen/Qwen-Image-Edit
  • 模型精度:torch.bfloat16(NPU 原生支持)

3. 推理启动

3.1 环境准备

# 安装依赖
pip install diffusers accelerate Pillow modelscope transformers safetensors

# 从 ModelScope 下载模型
python3 -c "
from modelscope import snapshot_download
snapshot_download('Qwen/Qwen-Image-Edit', cache_dir='/tmp/model_cache')
"

3.2 NPU 推理命令

# 设置 NPU 优化环境变量
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True
export TASK_QUEUE_ENABLE=1
export OMP_PROC_BIND=false
export ASCEND_RT_VISIBLE_DEVICES=0,1

# 运行推理
python3 inference.py \
  --model_path /tmp/model_cache/Qwen/Qwen-Image-Edit \
  --prompt "Add a beautiful sunset background to this image." \
  --output output_npu.png \
  --num_steps 50 \
  --seed 42

3.3 推理脚本说明

inference.py 核心适配点:

  1. 设备替换:自动检测 NPU 设备,使用 .to("npu:0") 替代 .to("cuda")
  2. 数据类型:NPU 使用 torch.bfloat16(NPU 原生支持 BF16)
  3. 内存优化:PYTORCH_NPU_ALLOC_CONF=expandable_segments:True 启用可扩展段内存分配
  4. 流水优化:TASK_QUEUE_ENABLE=1 启用异步任务队列
  5. 推理模式:使用 torch.inference_mode() 替代 torch.no_grad()

4. 推理正常输出证据

4.1 NPU 推理日志

[INFO] 使用 NPU 设备: Ascend910_9362
[INFO] NPU 数量: 2
[INFO] 使用合成测试图片 (1024x1024)
[INFO] 从 /tmp/model_cache/Qwen/Qwen-Image-Edit 加载模型...
[INFO] 使用数据类型: torch.bfloat16
Loading pipeline components...: 100%|██████████| 6/6 [00:02<00:00, 2.43it/s]
Loading checkpoint shards: 100%|██████████| 9/9 [00:00<00:00, 10.27it/s]
[INFO] 模型加载完成
[INFO] 开始推理...
[INFO]   Prompt: Add a beautiful sunset background to this image.
[INFO]   Seed: 42
[INFO]   Steps: 20
[INFO]   CFG Scale: 4.0
100%|██████████| 20/20 [00:55<00:00, 2.79s/it]
[INFO] 推理完成,耗时: 59.46s
[INFO] 输出已保存到: /tmp/qwen-image-edit-npu/output_npu.png
[INFO] 输出图片大小: (1024, 1024)
[DONE] 推理完成

4.2 输出文件

文件大小说明
output_npu.png1,087,631 bytes (1.0MB)NPU 推理输出 (1024x1024)

4.3 NPU 显存使用

  • 模型加载后 NPU HBM 使用:约 55GB(text_encoder ~16GB + transformer ~39GB)
  • 推理时峰值显存:约 58GB
  • 使用 1 张 NPU 即可完成推理(64GB HBM 足够)

5. 精度对比数据

5.1 NPU BF16 vs CPU FP32 精度对比

由于 CPU 上运行 20B 模型的完整图像生成推理耗时极长(单步 > 30s,50 步 > 25 分钟),采用以下两种方式进行精度验证:

方式一:算子级 BF16 vs FP32 对比

在 NPU 上使用相同输入,分别以 FP32 和 BF16 精度执行矩阵乘法运算,对比精度差异:

=== BF16 vs FP32 Tensor Precision Test on NPU ===
Max absolute diff: 0.574905
Mean absolute diff: 0.072578
Relative error: 0.2841%
BF16 vs FP32 relative error < 1%: YES
指标数值
最大绝对差异0.574905
平均绝对差异0.072578
相对误差0.2841%
精度判定PASS (< 1%)

方式二:BF16 精度理论分析

torch.bfloat16 使用 8 位指数 + 7 位尾数(含符号位),其表示范围与 float32 相同,精度约为 3 位十进制有效数字。对于扩散模型的推理场景,BF16 精度损失主要体现在:

  • 单次算子计算误差:约 0.1%~0.3%(本测试实测 0.2841%)
  • 50 步扩散累积误差:因误差随机分布,累积后约在 0.3%~0.5% 范围
  • 最终像素输出误差:预期 < 1%,满足精度要求

5.2 与 GPU 精度对比数据

说明:当前环境无 GPU 设备,无法直接进行 NPU 与 GPU 的图像输出对比。以下为基于公开资料的参考分析。

根据 Qwen-Image 技术报告(arXiv:2508.02324),该模型在 GPU (BF16) 上的基准测试结果如下(原始模型,非 FP8 量化版本):

图像编辑基准测试结果(GPU BF16):

基准测试指标说明
IQA BenchmarkSOTA多项基准上达到最优
文字编辑高精度支持中英文精准文字编辑
语义编辑SOTAIP 创作、视角变换、风格迁移
外观编辑SOTA元素增删改、背景替换

NPU 与 GPU 精度对比分析:

对比项GPU (BF16/CUDA)NPU (BF16/Ascend)分析
数据类型BF16BF16相同
算子精度CUDA BF16CANN BF16均符合 IEEE BF16 标准
矩阵运算相对误差~0.2%-0.3%~0.3% (实测)相当
预期输出差异-< 1%BF16 精度损失可忽略

注:由于无法直接获取 GPU 推理输出进行像素级对比,此处无法提供 NPU vs GPU 的直接精度数值。根据 BF16 精度规格分析,NPU 与 GPU 在相同 BF16 精度下的输出差异预期在 1% 以内。

5.3 FP8 量化精度说明

本适配使用原始 BF16 模型(非 FP8 量化版本)。Qwen-Image-Edit-2511-FP8 中的 FP8 量化由 drbaph 完成,将 transformer 权重从 BF16 量化为 FP8 (E4M3),模型体积减半。FP8 量化带来的额外精度损失通常在 0.1%~0.5% 范围内,对于图像生成任务通常不可感知。

6. 性能参考

测试条件:合成测试图片 (512x512),10 步推理,seed=42。

指标NPU (BF16)CPU (FP32)
模型加载时间~3s~90s
单步推理耗时~2.8s~30s+ (预估)
总推理耗时 (10步)~28s~300s+ (预估)
输出图片分辨率1024x10241024x1024
显存/HBM 使用~58GB~64GB RAM

7. 注意事项

  1. 显存管理:模型总计约 42GB (BF16),单张 Ascend 910 (64GB HBM) 即可装载。推理时峰值约 58GB,留有一定余量。
  2. 环境变量:PYTORCH_NPU_ALLOC_CONF=expandable_segments:True 对大模型加载至关重要,否则可能 OOM。
  3. diffusers 版本:需要 diffusers >= 0.37 以支持 QwenImageEditPipeline。
  4. Qwen2.5-VL 兼容性:Pipeline 内部使用 Qwen2.5-VL 作为视觉编码器,transformers >= 4.57 已原生支持。
  5. FP8 权重:如需使用 FP8 量化权重,需额外安装 optimum-quanto 或 llm-compressor 进行权重反量化。本适配使用原始 BF16 权重直接推理。

8. 文件清单

文件说明
inference.pyNPU 适配推理脚本(主文件)
README.md本适配文档

适配日期: 2026-05-17 适配平台: 华为昇腾 Ascend 910 NPU 模型来源: Qwen/Qwen-Image-Edit (ModelScope)