SD1.5 NPU 转换
本指南将 SD1.5 .safetensors 模型转换为 Local Dream 兼容的 NPU 模型。
TIP
应用已支持设备端 CPU 转换 — 本指南仅适用于 NPU 路径。
前置要求
- 操作系统:Linux 或 WSL(其他平台未验证)
- Qualcomm AI Engine Direct SDK 2.28 — 请使用 v2.28 以避免潜在问题。下载 v2.28.0.241029.zip。
- uv — Python 环境管理器
- zstd — 通过包管理器安装:
sudo apt-get install zstd
WARNING
转换 512×512 模型至少需要 ~20 GB 内存。更高分辨率需要 64 GB+ 内存 + swap。开始前请确认你的系统满足要求 — 部分转换的恢复很慢。
如果你有 CUDA GPU,可以编辑 pyproject.toml 使用 GPU 版本的 torch 以加速数据准备阶段。量化步骤本身在 CPU 上运行。
转换脚本
INFO
下载脚本:npuconvertv2.zip。
环境设置
bash
cd npuconvert
uv venv -p 3.10.17
source .venv/bin/activate
uv sync然后在 convert_all.sh 和 convert_all_unet_only.sh 中设置 QNN_SDK_ROOT 路径指向你解压的 QNN SDK。
示例:export.sh
以下脚本在基础 512×512 分辨率和两个额外分辨率(512×768 和 768×512)下转换模型,为三个 芯片级别打包输出。
bash
set -e
clip_skip=2 # 1 或 2
model_path=~/Downloads/AnythingXL_v50.safetensors
model_name=AnythingV5
realistic=false # 写实风格提示词设为 true
# 额外分辨率(宽 高)。留空则跳过。
extra_resolutions=(
"512 768"
"768 512"
)
# 芯片级别
soc_versions=("8gen2" "8gen1" "min")
# 非旗舰级别无法运行更高分辨率
extra_resolution_soc_versions=("8gen2" "8gen1")
uv venv -p 3.10.17 --clear
source .venv/bin/activate
uv sync
realistic_flag=""
if [ "$realistic" = true ]; then
realistic_flag="--realistic"
fi
process_extra_resolution() {
local width=$1
local height=$2
local size="${width}x${height}"
echo "Processing resolution: ${size}"
python prepare_data.py --model_path $model_path --clip_skip $clip_skip --height $height --width $width $realistic_flag
python gen_quant_data.py
python export_onnx_unet_only.py --model_path $model_path --clip_skip $clip_skip --height $height --width $width
for soc in "${extra_resolution_soc_versions[@]}"; do
bash scripts/convert_all_unet_only.sh --min_soc $soc
done
mv output output_${size}
# 基于 512×512 基础 UNet 生成补丁文件
for soc in "${extra_resolution_soc_versions[@]}"; do
zstd --patch-from ./output_512/qnn_models_${soc}/unet.bin \
output_${size}/qnn_models_${soc}/unet.bin \
-o ./output_512/qnn_models_${soc}/${size}.patch
done
}
# ===== 基础 512×512(必需)=====
echo "Processing base resolution: 512x512"
python prepare_data.py --model_path $model_path --clip_skip $clip_skip $realistic_flag
python gen_quant_data.py
python export_onnx.py --model_path $model_path --clip_skip $clip_skip
for soc in "${soc_versions[@]}"; do
bash scripts/convert_all.sh --min_soc $soc
done
mv output output_512
# ===== 额外分辨率 =====
for resolution in "${extra_resolutions[@]}"; do
read -r width height <<< "$resolution"
process_extra_resolution $width $height
done
# ===== 打包 =====
echo "Packaging output files..."
for soc in "${soc_versions[@]}"; do
zip -r ${model_name}_qnn2.28_${soc}.zip output_512/qnn_models_${soc}
done关键参数
| 参数 | 说明 |
|---|---|
clip_skip | 1 或 2。匹配原始模型的训练值 — 大多数动漫模型使用 2。 |
realistic | true 切换到写实风格的量化数据提示词集。用于照片风格模型。 |
extra_resolutions | 每个额外分辨率增加一次单独的 UNet 转换和一个相对于 512×512 基础的 .patch 文件。补丁使应用内下载更小。 |
soc_versions | 要构建的级别。min 覆盖 Hexagon V68+ 非旗舰芯片;8gen1 覆盖骁龙 8 Gen 1 / 8+ Gen 1;8gen2 覆盖 8 Gen 2 / 3 / 8 Elite / 8s Gen 4 / 8 Elite Gen 5。 |
输出
每个芯片级别生成一个 .zip 文件,如:
AnythingV5_qnn2.28_min.zip
AnythingV5_qnn2.28_8gen1.zip
AnythingV5_qnn2.28_8gen2.zip每个 zip 可以直接在应用中导入。详见自定义模型。
故障排除
- 转换过程极其缓慢。 这是正常的 — 在工作站级 CPU 上每个分辨率每个芯片级别需要数小时。
- 转换中途内存不足。 增加 swap。768×768 的 SD1.5 转换在没有 swap 的 32 GB 机器上会 OOM。
- 应用拒绝加载导入的 zip。 确保你打包了与芯片匹配的 芯片级别。
_8gen2的 zip 无法在 8 Gen 1 上运行。