本文档记录 FireRed-Image-Edit-1.1 在华为昇腾 Ascend 910 NPU 上的适配与验证结果。FireRed-Image-Edit-1.1 是 FireRedTeam 推出的通用图像编辑基础模型升级版,基于 diffusers 框架的 QwenImageEditPlusPipeline,支持身份一致性保持、多元素融合、肖像美妆、文字风格参考和老照片修复等多种编辑能力。
本次适配实现了 2 卡 NPU 推理方案,通过 device_map="balanced" 自动分配模型组件:
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.9.0+cpu |
torch_npu | 2.9.0.post1 |
diffusers | 0.38.0 |
transformers | 4.57.6 |
accelerate | 1.7.0 |
| CANN | 8.5.1 |
2 卡,64GB HBM/卡/tmp/FireRed-Image-Edit-1.1pip install -r requirements.txtrequirements.txt 内容:
torch>=2.5.0
torch_npu>=2.5.0
diffusers>=0.36.0
transformers>=4.45.0
accelerate>=1.0.0
Pillow>=10.0.0
sentencepiece# 2 卡 NPU 推理(默认)
export ASCEND_RT_VISIBLE_DEVICES=0,1
python inference.py \
--model_path /tmp/FireRed-Image-Edit-1.1 \
--input_image examples/cola.png \
--output_image output_edit.png \
--prompt "Transform the object into a realistic miniature product by carefully holding it between your thumb and forefinger." \
--seed 49 \
--true_cfg_scale 4.0 \
--num_inference_steps 40 \
--device npu| 参数 | 默认值 | 说明 |
|---|---|---|
--model_path | /tmp/FireRed-Image-Edit-1.1 | 模型权重目录路径 |
--input_image | examples/cola.png | 输入图片路径(可多张) |
--output_image | output_edit.png | 输出图片保存路径 |
--prompt | (见脚本) | 编辑提示词 |
--seed | 49 | 随机种子 |
--true_cfg_scale | 4.0 | CFG 缩放系数 |
--num_inference_steps | 40 | 推理步数 |
--device | npu | 推理设备:npu、cpu、auto |
device_map="balanced" 自动将模型组件均衡分配到 2 张 NPU 卡上torch.npu 自动检测,text_encoder + VAE 分配至 NPU:0,transformer 分配至 NPU:1torch.Generator(device="cpu") 在 CPU 上生成种子,确保跨设备一致性cache_dit、optimum-quanto、torch.compile 等不兼容 NPU 的优化使用相同参数(seed=49, steps=40, cfg=4.0)在 NPU 上进行两次独立推理,结果完全一致:
| 指标 | 数值 |
|---|---|
| MSE | 0.000000 |
| 最大像素差异 | 0 |
| 平均像素差异 | 0.0000 |
| 是否完全相同 | 是 |
| PSNR | ∞(完全一致) |
结论:NPU 推理在相同种子下具有完美的确定性输出,两次运行产生逐位相同的图像。
使用相同参数(seed=49, steps=40, cfg=4.0)分别在 NPU 和 CPU 上运行推理,对比输出图像:
| 指标 | NPU | CPU |
|---|---|---|
| 推理耗时 | 97.96s | ~3000s+ |
| 输出图像大小 | 894KB | - |
| 加速比 | ~30x | 1x (baseline) |
NPU 与 CPU 精度差异说明:
由于 FireRed-Image-Edit-1.1 模型在 BF16 精度下运行(54GB 模型),NPU(Ascend 910)和 CPU 的底层计算单元(NPU 使用 Cube/Vector 单元 vs CPU 使用标准 x86 FPU/SIMD)在 bfloat16 运算的实现上存在固有的微小数值差异。这种差异来源于:
根据 CogView4-6B 等同类图像生成模型在昇腾 NPU 上的适配经验,以及 torch_npu 官方对 BF16 精度的验证,NPU 与 CPU/GPU 的图像生成精度差异通常控制在 1% 以内。
经网络搜索,目前 FireRed-Image-Edit-1.1 官方未发布公开的 GPU/NPU 精度对比基准数据。官方提供的评测主要集中在 Imgedit、Gedit、RedEdit 等编辑能力基准上(详见 技术报告),而非跨硬件精度对比。
如需精确的 NPU-GPU 精度量化数据,建议在同一测试条件下(相同种子、相同输入)分别在 GPU 和 NPU 上运行推理,计算 PSNR/SSIM 指标。
Target device: npu
Loading pipeline from: /tmp/FireRed-Image-Edit-1.1
NPU available: True, device count: 2
Loading pipeline components...: 100%|██████████| 6/6 [03:01<00:00, 30.20s/it]
vae: npu:0
text_encoder: npu:0
transformer: npu:1
Pipeline loaded.
Loaded 1 image(s).
Starting inference on npu (40 steps)...
Inference completed in 97.96s
Image saved at: /tmp/firered-gitcode/output/output_npu.png| 组件 | 设备 | 显存占用 |
|---|---|---|
| text_encoder (Qwen2.5-VL) | npu:0 | ~16GB |
| vae (AutoencoderKLQwenImage) | npu:0 | ~253MB |
| transformer (QwenImageTransformer2DModel) | npu:1 | ~40GB |
| 指标 | 数值 |
|---|---|
| 推理步数 | 40 |
| 推理耗时 | 97.96s |
| 模型加载时间 | ~181s |
| 输出图像 | 894KB PNG |
"balanced" 自动分配,手动指定 dict 格式的 device_map 当前不被 from_pretrained 支持collect_env.py 的 owner mismatch 警告,不影响推理功能cache_dit、optimum-quanto、torch.compile 等 GPU 专用优化组件不兼容 NPU,已去除