Skip to content

SDXL NPU 转换(实验性)

本指南将 Stable Diffusion XL .safetensors 模型转换为可在骁龙设备上评估的 NPU 模型。

WARNING

SDXL 转换是 实验性的,比 SD1.5 转换重得多。高分辨率 SDXL 工作流可能需要 100 GB+ 磁盘空间64 GB 内存 + swap。开始前请仔细阅读前置要求。

前置要求

  • 操作系统:Linux 或 WSL
  • Qualcomm AI Engine Direct SDK 2.28 — 请使用 v2.28。下载 v2.28.0.241029.zip
  • uv — Python 环境管理器
  • 内存 + swap:高分辨率转换需要 ~64 GB

转换脚本

INFO

下载脚本:convertsdxl.zip

环境设置

bash
cd convertsdxl
uv venv -p 3.10.17
source .venv/bin/activate
uv sync

convert_all_sdxl.sh 中设置 QNN_SDK_ROOT 路径。

示例:export_sdxl.sh

bash
set -e

model_path=~/Downloads/anythingxl.safetensors
model_name=anythingxl
realistic=false                 # 写实风格设为 true
scheduler=dpm                   # dpm | lcm | eulera
cfg=5,7                         # 5-7 随机
steps=15,30                     # 15-30 随机

# 目前仅构建 8gen3。8gen3 构建可在 8 Gen 3、8 Elite 和 8 Elite Gen 5 / 8 Gen 5 上运行。
soc_versions=("8gen3")

uv venv -p 3.10.17 --clear
source .venv/bin/activate
uv sync

realistic_flag=""
if [ "$realistic" = true ]; then
    realistic_flag="--realistic"
fi

# ===== 1024×1024 =====
echo "Processing base resolution: 1024x1024"
python prepare_data_sdxl.py --model_path $model_path $realistic_flag --scheduler $scheduler --cfg $cfg --step $steps
python gen_quant_data_sdxl.py
python export_onnx_sdxl.py --model_path $model_path

for soc in "${soc_versions[@]}"; do
    bash scripts/convert_all_sdxl.sh --min_soc $soc
done

# ===== 打包 =====
echo "Packaging output files..."
for soc in "${soc_versions[@]}"; do
    touch output/qnn_models_sdxl_${soc}/SDXL
    zip -r ${model_name}_qnn2.28_${soc}.zip output/qnn_models_sdxl_${soc}
done

关键参数

参数说明
schedulerdpmlcmeulera。选择与模型推荐采样器匹配的选项。
cfg量化数据生成时用于采样 CFG 值的范围。
stepscfg — 决定校准数据多样性的范围。
soc_versions目前仅支持 8gen3。同一二进制文件可在 8 Gen 3、8 Elite 和 8 Elite Gen 5 / 8 Gen 5 上运行。

输出

每个芯片级别生成一个 zip:

anythingxl_qnn2.28_8gen3.zip

导入方式与 SD1.5 NPU 模型相同。详见自定义模型

注意事项

  • 生成质量可能略低于源 SDXL 模型 — 在 SDXL 尺度下量化噪声比 SD1.5 更明显。
  • 输出中的 SDXL 标记文件是必需的,它让应用将其作为 SDXL 模型而非 SD1.5 加载。
  • 转换时间比 SD1.5 长得多 — 请做好在工作站上过夜运行的准备。