Delicate02/FLUX.2-small-decoder-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

FLUX.2-small-decoder 昇腾 NPU 适配指南

本仓库提供 FLUX.2-small-decoder 在华为昇腾 NPU(Ascend 910B4)上的适配验证结果,包含完整的推理脚本、精度评测、性能基准测试及调优建议。

标签: #NPU #昇腾 #Ascend #FLUX


模型概述

FLUX.2-small-decoder 是 Black Forest Labs 发布的蒸馏 VAE Decoder,可作为标准 FLUX VAE Decoder 的 即插即用替代方案:

  • ~1.4x 更快的解码速度
  • ~1.4x 更低的显存占用
  • ~28M Decoder 参数量(对比完整版 ~50M)
  • 几乎无损的图像质量
  • 兼容所有开源 FLUX.2 模型(FLUX.2-dev、FLUX.2-klein 系列等)
项目说明
模型架构AutoencoderKLFlux2 (Diffusers)
输入Latent tensor (32 channels, 1/8 spatial resolution)
输出RGB image (3 channels, 1024x1024 or custom)
参数量62.4M (含 encoder + decoder)
许可证Apache 2.0

适配环境

硬件环境

项目规格
NPUAscend 910B4
NPU 驱动25.5.1
HBM 容量32 GB

软件环境

组件版本
CANN8.5.1
Python3.11.14
PyTorch2.9.0+cpu
torch_npu2.9.0.post1
diffusers0.38.0
transformers4.57.6
vllm0.18.0
vllm_ascend0.18.0rc1

快速开始

1. 获取模型权重

git clone https://gitcode.com/hf_mirrors/black-forest-labs/FLUX.2-small-decoder.git
cd FLUX.2-small-decoder
git lfs pull

2. 安装依赖

pip install torch==2.9.0 torchvision==0.24.0 --index-url https://download.pytorch.org/whl/cpu
pip install diffusers accelerate safetensors numpy pillow
# CANN 和 torch_npu 请按昇腾官方文档安装

3. 运行推理

# NPU 推理 (推荐 float16)
python inference.py --device npu --dtype float16 --output output_npu.png --save_latent

# CPU 推理 (float32 baseline)
python inference.py --device cpu --dtype float32 --output output_cpu.png

推理脚本参数说明

参数说明默认值
--device运行设备:npu 或 cpunpu
--dtype数据类型:float32 / float16 / bfloat16float32
--batch_size批大小1
--height / --width输出图像分辨率1024
--seed随机种子42
--warmupWarmup 迭代次数3
--output输出图像路径output.png
--save_latent保存 latent tensorFalse

精度验证

验证方法

采用 NPU 输出 vs CPU float32 基线 的对比方式,在相同随机 latent 输入下计算误差指标:

  • MAE (Mean Absolute Error)
  • MSE (Mean Squared Error)
  • RMSE (Root Mean Squared Error)
  • Mean Relative Error (平均相对误差,核心指标)
  • Max Relative Error (最大相对误差)
  • PSNR (Peak Signal-to-Noise Ratio)
  • Cosine Similarity (余弦相似度)

验证结果

运行精度评测脚本:

# float16 精度评测(推荐配置)
python accuracy_eval.py --npu_dtype float16 --output_dir accuracy_results

# float32 精度评测
python accuracy_eval.py --npu_dtype float32 --output_dir accuracy_results_f32
指标NPU float32 vs CPUNPU float16 vs CPUNPU bfloat16 vs CPU
MAE4.14e-051.47e-041.19e-03
MSE3.19e-093.99e-082.62e-06
RMSE5.64e-052.00e-041.62e-03
Max Abs Error1.64e-037.16e-035.62e-02
Mean Rel Error0.24%0.78%7.33%
PSNR84.97 dB73.99 dB55.82 dB
Cosine Similarity0.9999991.0000020.999735
结果PASSPASSFAIL

结论

  • float32 和 float16 在昇腾 NPU 上的推理精度与 CPU 基线误差均 < 1%,满足精度要求。
  • bfloat16 精度损失较大(7.33%),不建议在精度敏感场景使用。
  • 推荐使用 float16,在精度和性能之间取得最佳平衡。

性能基准测试

测试方法

使用 perf_eval.py 在 Ascend 910B4 上测试不同分辨率和批大小下的吞吐量和延迟:

python perf_eval.py --dtype float16 --batch_sizes 1 2 4 --resolutions 512 1024 --warmup 5 --iterations 20

性能数据

BatchResolutionDtypeMean (ms)P90 (ms)Throughput (samples/s)Mem (MB)
1512x512float1620.1720.3749.57133.4
11024x1024float1692.1192.2810.86175.5
2512x512float1640.1240.3149.85146.4
21024x1024float16185.09185.2310.81225.5
4512x512float1681.9881.9448.79175.5
41024x1024float16371.86372.1110.76329.2

NPU vs CPU 对比

设备数据类型1024x1024 推理时间加速比
CPU (x86)float32~325,000 ms1x
NPU (910B4)float16~92 ms~3533x
NPU (910B4)float32~350 ms~928x

结论

  • 昇腾 NPU 在 float16 下可达到 10.8 samples/s @ 1024x1024 的吞吐量。
  • 相比 CPU 推理,NPU 加速比超过 3500x(float16)。
  • 内存占用极低,1024x1024 单 batch 仅需 175.5 MB。

调优建议

1. 数据类型选择

场景推荐 dtype原因
生产部署float16精度通过(0.78%),性能最佳
高精度要求float32精度最高(0.24%),速度较慢
不推荐bfloat16精度不达标(7.33%)

2. 内存优化

  • 单张 1024x1024 图像解码仅需约 176 MB HBM,可在单卡上部署多个实例。
  • 如需处理更高分辨率,建议增大 PYTORCH_NPU_ALLOC_CONF 的 expandable_segments:
    export PYTORCH_NPU_ALLOC_CONF=expandable_segments:True

3. 性能优化

  • Batch 推理:batch=2 时吞吐量几乎线性提升(49.85 vs 49.57),适合高并发场景。
  • Warmup:首次推理会有算子编译开销,建议在生产环境预先执行 3-5 次 warmup。
  • 混合精度:如需与 FLUX Pipeline 配合使用,建议整个 pipeline 统一使用 float16。

4. 与 FLUX Pipeline 集成

import torch
import torch_npu
from diffusers import Flux2KleinPipeline, AutoencoderKLFlux2

device = "npu"
dtype = torch.float16

vae = AutoencoderKLFlux2.from_pretrained(
    "./FLUX.2-small-decoder",
    torch_dtype=dtype,
    local_files_only=True
).to(device)

pipe = Flux2KleinPipeline.from_pretrained(
    "black-forest-labs/FLUX.2-klein-4B",
    vae=vae,
    torch_dtype=dtype
)
pipe = pipe.to(device)

prompt = "A black cat holding a sign that says 'hello world'"
image = pipe(
    prompt=prompt,
    height=1024,
    width=1024,
    guidance_scale=1.0,
    num_inference_steps=4,
    generator=torch.Generator(device=device).manual_seed(0)
).images[0]
image.save("flux-klein-small-decoder-npu.png")

评测材料

本仓库包含完整的自验证材料:

文件说明
inference.py推理脚本(支持 NPU/CPU,支持多种 dtype)
accuracy_eval.py精度评测脚本(NPU vs CPU 基线对比)
perf_eval.py性能基准测试脚本(多 batch/多分辨率)
eval_logs/accuracy_metrics.txtfloat16 精度评测结果
eval_logs/accuracy_metrics_f32.txtfloat32 精度评测结果
eval_logs/accuracy_metrics_bf16.txtbfloat16 精度评测结果
eval_logs/perf_results.json性能测试原始数据
eval_logs/perf_results.txt性能测试可读报告
accuracy_results/精度评测输出图像(CPU vs NPU 对比图)

运行日志

NPU float16 推理日志:

[1/4] Loading model...
      Model loaded in 2.12s
      Parameters: 62.4M
[2/4] Generating latent tensor...
      Latent shape: torch.Size([1, 32, 128, 128])
[3/4] Warming up (3 iterations)...
      Warmup complete
[4/4] Running inference...
      Output shape: torch.Size([1, 3, 1024, 1024])
      Inference time: 92.04 ms
      Throughput: 10.87 samples/s
[OK] Image saved to: output_npu.png

精度验证日志(float16):

[PASS] Mean Relative Error 0.7833% <= 1% threshold
MAE: 1.468565e-04
MSE: 3.991886e-08
PSNR: 73.99 dB
Cosine Similarity: 1.000002

已知问题

  1. CANN 权限警告:当前环境存在 /usr/local/Ascend/cann-8.5.1 文件属主与当前用户不一致的警告,不影响推理功能,建议部署时统一用户权限。
  2. torch_npu log 目录:首次运行可能出现 can not create directory: /home/atomgit/ascend/log 的警告,可通过创建该目录或设置 ASCEND_PROCESS_LOG_PATH 环境变量解决。

社区与贡献

  • 昇腾 Model-Agent 模型适配大赛:本适配结果参与昇腾开源模型适配活动
  • 标签: #NPU #昇腾适配 #Ascend #FLUX #Diffusers
  • 问题反馈:欢迎在 GitCode Issues 中提交适配相关问题

许可证

本模型遵循 Apache 2.0 许可证。

原始模型版权归属 Black Forest Labs。