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关键参数
| 参数 | 说明 |
|---|---|
scheduler | dpm、lcm 或 eulera。选择与模型推荐采样器匹配的选项。 |
cfg | 量化数据生成时用于采样 CFG 值的范围。 |
steps | 同 cfg — 决定校准数据多样性的范围。 |
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 长得多 — 请做好在工作站上过夜运行的准备。