本文为高通跃龙QCS9075/QCS9100开发者实战指南,教你如何在没有云服务的情况下,在边缘设备上运行强大的Stable Diffusion 2.1模型,实现完全本地化的图像生成。

引言:为什么在边缘设备上部署生成式AI?

Stable Diffusion 是目前最受欢迎的文生图(Text-to-Image)生成模型之一,能够根据自然语言描述生成高质量的图像。然而,由于模型规模庞大、计算复杂,传统上只能在服务器或高性能GPU上运行。如今,随着高通跃龙QCS9075/QCS9100等边缘AI芯片的发展,我们已经可以在本地设备上实现高效、低延迟的文生图推理。

本教程将带你一步步完成在高通跃龙QCS9075平台上部署Stable Diffusion 2.1的全过程,涵盖模型准备、QNN SDK集成、Python环境配置以及端到端推理实现。

第一步:获取预编译模型文件

你需要准备三个核心模型文件:

  • TextEncoder(文本编码器)
  • UNet
  • VAE(变分自编码器)

✅ 方式一:使用Github提供的脚本导出(推荐用于自定义)

  1. 克隆Github提供的仓库:
git clone https://github.com/qui/ai-hub-models.git
  1. 激活Python虚拟环境(Windows示例):
D:\py\venv\Scripts\Activate.ps1
  1. 执行导出命令:
python -m qai_hub_models.models.stable_diffusion_v2_1.export \
  --target-runtime precompiled_qnn_onnx \
  --device "QCS9075" \
  --fetch-static-assets v0.39.1

✅ 方式二:从Hugging Face直接下载(最快捷)

从Hugging Face下载预编译好的模型文件,如:

Stable-Diffusion-v2.1_text_encoder_w8a16.bin
Stable-Diffusion-v2.1_unet_w8a16.bin
Stable-Diffusion-v2.1_vae_w8a16.bin

⚠️ 重要提示
务必检查模型版本与QNN SDK版本的兼容性。下载页面通常会提供 tool-versions.yaml 文件,例如:

qairt: 2.38.0.250901140452_125126-auto

表示目标设备至少需要安装 V2.38.0 版本的QNN SDK。

你也可以通过以下命令在Linux下查看模型版本:

strings Stable-Diffusion-v2.1_text_encoder_w8a16.bin | grep "v2."

输出示例:

v2.39.0.250925215840_163802-auto
Vrv2.39.0.250925215840_163802-auto.fcaeba5a50
Vrv2.39.0.250925215840_163802-auto.fcaeba5a50

📖 补充:除上述两种方式外,也可以参考 官方教程 自行构建/转换模型文件。

最终我们需要获得以下三个模型文件:

Stable-Diffusion-v2.1_text_encoder_w8a16.bin
Stable-Diffusion-v2.1_unet_w8a16.bin
Stable-Diffusion-v2.1_vae_w8a16.bin

第二步:安装 QNN SDK

  1. 访问 Qualcomm AI Runtime SDK 下载页面 ,下载与模型版本匹配的SDK。
  2. 安装后,将SDK文件复制到QCS9075设备上,目录结构应类似于:
2.39.0.250926/
|-- bin
|   -- aarch64-oe-linux-gcc11.2
|       |-- genie-app
|       |-- genie-t2e-run
|       |-- genie-t2t-run
|       |-- qnn-context-binary-generator
|       |-- qnn-context-binary-utility
|       |-- qnn-net-run
|       |-- qnn-platform-validator
|       |-- qnn-profile-viewer
|       |-- qnn-throughput-net-run
|       |-- qtld-net-run
|       |-- snpe-diagview
|       |-- snpe-net-run
|       |-- snpe-parallel-run
|       |-- snpe-platform-validator
|       `-- snpe-throughput-net-run
`-- lib
    |-- aarch64-oe-linux-gcc11.2
    |   |-- libGenie.so
    |   |-- libPlatformValidatorShared.so
    |   |-- libQnnChrometraceProfilingReader.so
    |   |-- libQnnCpu.so
    |   |-- libQnnCpuNetRunExtensions.so
    |   |-- libQnnDsp.so
    |   |-- libQnnDspNetRunExtensions.so
    |   |-- libQnnDspV66CalculatorStub.so
    |   |-- libQnnDspV66Stub.so
    |   |-- libQnnGenAiTransformer.so
    |   |-- libQnnGenAiTransformerCpuOpPkg.so
    |   |-- libQnnGenAiTransformerModel.so
    |   |-- libQnnGpu.so
    |   |-- libQnnGpuNetRunExtensions.so
    |   |-- libQnnGpuProfilingReader.so
    |   |-- libQnnHta.so
    |   |-- libQnnHtaNetRunExtensions.so
    |   |-- libQnnHtp.so
    |   |-- libQnnHtpNetRunExtensions.so
    |   |-- libQnnHtpOptraceProfilingReader.so
    |   |-- libQnnHtpPrepare.so
    |   |-- libQnnHtpProfilingReader.so
    |   |-- libQnnHtpV68CalculatorStub.so
    |   |-- libQnnHtpV68Stub.so
    |   |-- libQnnHtpV69CalculatorStub.so
    |   |-- libQnnHtpV69Stub.so
    |   |-- libQnnHtpV73CalculatorStub.so
    |   |-- libQnnHtpV73Stub.so
    |   |-- libQnnHtpV75CalculatorStub.so
    |   |-- libQnnHtpV75Stub.so
    |   |-- libQnnHtpV79CalculatorStub.so
    |   |-- libQnnHtpV79Stub.so
    |   |-- libQnnIr.so
    |   |-- libQnnJsonProfilingReader.so
    |   |-- libQnnModelDlc.so
    |   |-- libQnnSaver.so
    |   |-- libQnnSystem.so
    |   |-- libQnnTFLiteDelegate.so
    |   |-- libSNPE.so
    |   |-- libSnpeDspV66Stub.so
    |   |-- libSnpeHta.so
    |   |-- libSnpeHtpPrepare.so
    |   |-- libSnpeHtpV68CalculatorStub.so
    |   |-- libSnpeHtpV68Stub.so
    |   |-- libSnpeHtpV73CalculatorStub.so
    |   |-- libSnpeHtpV73Stub.so
    |   |-- libSnpeHtpV75CalculatorStub.so
    |   |-- libSnpeHtpV75Stub.so
    |   |-- libSnpeHtpV79CalculatorStub.so
    |   |-- libSnpeHtpV79Stub.so
    |   |-- libcalculator.so
    |   |-- libhta_hexagon_runtime_qnn.so
    |   `-- libhta_hexagon_runtime_snpe.so
    `-- hexagon-v73
        `-- unsigned
            |-- libCalculator_skel.so
            |-- libQnnHtpV73.so
            |-- libQnnHtpV73QemuDriver.so
            |-- libQnnHtpV73Skel.so
            |-- libQnnSaver.so
            |-- libQnnSystem.so
            |-- libSnpeHtpV73Skel.so
            |-- libqnnhtpv73.cat
            `-- libsnpehtpv73.cat

第三步:配置 Python 环境

高通LE系统默认的Python为精简版,需要手动安装完整版Python 3.12.9:

📦 安装完整版 Python(Linux主机操作)

# 下载RPM包
wget https://yum.oracle.com/repo/OracleLinux/OL9/appstream/aarch64/getPackage/python3.12-3.12.9-1.e19.aarch64.rpm
wget https://yum.oracle.com/repo/OracleLinux/OL9/appstream/aarch64/getPackage/python3.12-libs-3.12.9-1.e19.aarch64.rpm

# 解压
rpm2cpio python3.12-3.12.9-1.e19.aarch64.rpm | cpio -idmv
rpm2cpio python3.12-libs-3.12.9-1.e19.aarch64.rpm | cpio -idmv

📤 复制到目标设备

解压后会生成一个 usr 目录,我们将其中的文件复制到目标设备:

scp -r usr/bin/* usr@device-ip:/usr/bin/
scp -r usr/lib/* usr@device-ip:/usr/lib/
scp -r usr/lib64/* usr@device-ip:/usr/lib/

🔗 创建符号链接并更新缓存

ln -s /usr/lib /usr/lib64
ldconfig

📦 安装 pip3

wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py

🐍 创建虚拟环境并安装依赖

python3 -m venv sd21-project-env
source sd21-project-env/bin/activate

pip install diffusers==0.35.2 \
            numpy==2.3.5 \
            pillow==12.0.0 \
            tokenizers==0.22.1 \
            torch==2.9.1 \
            transformers==4.57.1 \
            accelerate \
            transfer \
            -i https://pypi.tuna.tsinghua.edu.cn/simple

第四步:运行图像生成

🚀 配置Hugging Face镜像(大陆用户建议)

export HF_ENDPOINT=https://hf-mirror.com
export HF_HUB_ENABLE_HF_TRANSFER=1

🖼️ 运行生成脚本

python3 sd21_qnn_linux.py \
  --prompt "A kitten is practicing martial arts" \
  --steps 20 \
  --seed 1 \
  --guidance 7.5 \
  --output sd21_qnn.png

⏳ 首次运行时会下载必要的资源文件,请耐心等待。

🖼️ 生成效果示例

![一只正在练武术的小猫]
在这里插入图片描述

⚠️ 常见问题与解决方案

1. 无法从 Hugging Face 下载资源

错误

MaxRetryError: Failed to establish a new connection

解决

  • 使用社区镜像源:
export HF_ENDPOINT=https://hf-mirror.com
  • 或使用VPN连接。

2. HTP Stub 加载失败(仅LU系统)

错误

HtpRuntimeStub: Unsupported SoC 0
Failed to load stub

临时方案
尝试使用 aarch64-oe-linux-gcc9.4 目录下的库文件。

3. 内存错误(错误码1002)

错误

Fail to get effective domain id from rpc

原因:FastRPC驱动未正确配置DMA内存预留。
解决:需修改设备树配置,LU系统上暂无简单方案。

🎯 总结

通过本教程,你已经成功在QCS9075边缘设备上部署并运行了Stable Diffusion 2.1,实现了完全本地化的文生图推理。这不仅降低了延迟和云服务依赖,也为边缘AI应用开辟了新的可能性。

如果你在部署过程中遇到任何问题,欢迎在评论区留言讨论!

说明:本文基于高通官方资料及实际部署经验整理,适用于QCS9075/QCS9100系列设备。代码和脚本后续将在GitHub开放。

如果你觉得本文对你有帮助,欢迎点赞、收藏、关注!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐