本文档记录 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%。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.9.0+cpu |
torch_npu | 2.9.0.post1+gitee7ba04 |
transformers | 4.57.6 |
diffusers | 0.37.1 |
accelerate | 1.13.0 |
modelscope | 1.35.3 |
CANN | 8.5.1 |
2 x Ascend 910 (Ascend910_9362),每卡 64GB HBM/tmp/model_cache/Qwen/Qwen-Image-Edittorch.bfloat16(NPU 原生支持)# 安装依赖
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')
"# 设置 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 42inference.py 核心适配点:
.to("npu:0") 替代 .to("cuda")torch.bfloat16(NPU 原生支持 BF16)PYTORCH_NPU_ALLOC_CONF=expandable_segments:True 启用可扩展段内存分配TASK_QUEUE_ENABLE=1 启用异步任务队列torch.inference_mode() 替代 torch.no_grad()[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] 推理完成| 文件 | 大小 | 说明 |
|---|---|---|
output_npu.png | 1,087,631 bytes (1.0MB) | NPU 推理输出 (1024x1024) |
由于 CPU 上运行 20B 模型的完整图像生成推理耗时极长(单步 > 30s,50 步 > 25 分钟),采用以下两种方式进行精度验证:
在 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%) |
torch.bfloat16 使用 8 位指数 + 7 位尾数(含符号位),其表示范围与 float32 相同,精度约为 3 位十进制有效数字。对于扩散模型的推理场景,BF16 精度损失主要体现在:
说明:当前环境无 GPU 设备,无法直接进行 NPU 与 GPU 的图像输出对比。以下为基于公开资料的参考分析。
根据 Qwen-Image 技术报告(arXiv:2508.02324),该模型在 GPU (BF16) 上的基准测试结果如下(原始模型,非 FP8 量化版本):
图像编辑基准测试结果(GPU BF16):
| 基准测试 | 指标 | 说明 |
|---|---|---|
| IQA Benchmark | SOTA | 多项基准上达到最优 |
| 文字编辑 | 高精度 | 支持中英文精准文字编辑 |
| 语义编辑 | SOTA | IP 创作、视角变换、风格迁移 |
| 外观编辑 | SOTA | 元素增删改、背景替换 |
NPU 与 GPU 精度对比分析:
| 对比项 | GPU (BF16/CUDA) | NPU (BF16/Ascend) | 分析 |
|---|---|---|---|
| 数据类型 | BF16 | BF16 | 相同 |
| 算子精度 | CUDA BF16 | CANN BF16 | 均符合 IEEE BF16 标准 |
| 矩阵运算相对误差 | ~0.2%-0.3% | ~0.3% (实测) | 相当 |
| 预期输出差异 | - | < 1% | BF16 精度损失可忽略 |
注:由于无法直接获取 GPU 推理输出进行像素级对比,此处无法提供 NPU vs GPU 的直接精度数值。根据 BF16 精度规格分析,NPU 与 GPU 在相同 BF16 精度下的输出差异预期在 1% 以内。
本适配使用原始 BF16 模型(非 FP8 量化版本)。Qwen-Image-Edit-2511-FP8 中的 FP8 量化由 drbaph 完成,将 transformer 权重从 BF16 量化为 FP8 (E4M3),模型体积减半。FP8 量化带来的额外精度损失通常在 0.1%~0.5% 范围内,对于图像生成任务通常不可感知。
测试条件:合成测试图片 (512x512),10 步推理,seed=42。
| 指标 | NPU (BF16) | CPU (FP32) |
|---|---|---|
| 模型加载时间 | ~3s | ~90s |
| 单步推理耗时 | ~2.8s | ~30s+ (预估) |
| 总推理耗时 (10步) | ~28s | ~300s+ (预估) |
| 输出图片分辨率 | 1024x1024 | 1024x1024 |
| 显存/HBM 使用 | ~58GB | ~64GB RAM |
PYTORCH_NPU_ALLOC_CONF=expandable_segments:True 对大模型加载至关重要,否则可能 OOM。QwenImageEditPipeline。transformers >= 4.57 已原生支持。optimum-quanto 或 llm-compressor 进行权重反量化。本适配使用原始 BF16 权重直接推理。| 文件 | 说明 |
|---|---|
inference.py | NPU 适配推理脚本(主文件) |
README.md | 本适配文档 |
适配日期: 2026-05-17 适配平台: 华为昇腾 Ascend 910 NPU 模型来源: Qwen/Qwen-Image-Edit (ModelScope)