Skip to content

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.shconvert_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_skip12。匹配原始模型的训练值 — 大多数动漫模型使用 2
realistictrue 切换到写实风格的量化数据提示词集。用于照片风格模型。
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 上运行。