WSL 上的 Qualcomm AI Engine 直接稳定扩散模型准备

150 篇文章 9 订阅
50 篇文章 0 订阅


Qualcomm AI Engine Direct SDK 允许客户在 HTP 硬件上运行机器学习模型。以下步骤描述了如何在具有 HTP 功能的 Snapdragon (WoS) 平台上的 Windows 上准备和执行稳定扩散模型。

请注意,在本文档的其余部分中,术语 Qualcomm 神经网络 (QNN) 将与 Qualcomm AI Engine Direct SDK 互换使用。

先决条件

  1. WSL 和 Ubunu 20.04 安装并设置 QNN 工具所需的软件包
  2. Qualcomm AI Engine Direct SDK(支持 Ubuntu Linux 和 Windows)
  3. 稳定的扩散.onnx文件及其相应的 AIMET 编码(通过 AIMET 工作流程生成)

测试环境

表面 Pro9

  • 操作系统版本:22621.169
  • Windows 功能体验包 1000.22632.1000.0
  • Snapdragon 上的 Windows:SC8280X
  • qcadsprpc文件版本应为 1.0.3530.9800 或更高版本

获取qcadsprpc版本:

  1. 使用最新版本更新 Windows 操作系统和 Windows 驱动程序。
  2. 进入“系统信息”菜单并点击“软件环境->系统驱动程序”。选择qcadsprpc名称并检查文件路径。
  3. 转到 #2 上的文件路径。
  4. 按下左侧按钮qcadsprpc8280.sys并转到详细信息。
  5. 查看文件版本号:应为1.0.3530.9800或以上。

工作流程

本部分假设您在遵循 AIMET 稳定扩散工作流程后生成了以下稳定扩散模型工件:

  1. 稳定扩散文本编码器模型及其 AIMET 编码
  2. 稳定扩散 U-Net 模型及其 AIMET 编码
  3. 稳定扩散变分自动编码器 (VAE) 模型及其 AIMET 编码
  4. fp32.npyfile - 这是一个保存为 python pickle 的 numpy 对象数组。它包含模型转换步骤所需的数据。

这三种模型和编码通过 Qualcomm AI Engine Direct SDK 中提供的不同可执行实用程序独立处理。这些 QNN(高通神经网络)实用程序允许用户准备用于推理的稳定扩散模型。

步骤 1 到 3 的 QNN 可执行实用程序需要 WSL Ubuntu 20.04 环境。步骤 4 是推理步骤,在本机 Windows 环境中执行。

  1. 将文件转换.onnx为等效的 QNN 表示形式A16W8(16 位激活和 8 位权重)
  2. 生成 QNN 模型库
  3. 为 QNN HTP 后端生成 QNN 上下文二进制文件
  4. 在 Snapdragon (WoS) 平台上执行 QNN 上下文二进制文件以在 Windows 上进行推理

请添加图片描述

使用 Qualcomm Package Manager 3 安装 AI Engine Direct SDK

  1. 登录后从https://www.qualcomm.com/support/support-portals/qualcomm-package-manager安装 QPM 。

  2. 安装完成后,选择“工具”。

  3. 在搜索栏中搜索 AI Engine Direct SDK。

请添加图片描述
4. 单击 SDK 并从下拉列表中选择所需的版本,如下所示。

请添加图片描述
5. SDK 安装完成后,您可以选择将 SDK 从最终对话框中显示的原始安装位置复制到笔记本的当前目录。

请添加图片描述

WSL 和 Ubuntu 20.04 安装

在安装 WSL 之前,请在 Windows 中启用虚拟机功能。

注意:在管理员模式下执行 powershell 命令。

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

按照以下说明安装 WSL:https 😕/learn.microsoft.com/en-us/windows/wsl/install

WSL 2 需要更新的内核组件。从https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi下载并安装 Linux 内核更新包

# Install WSL and necessary components
wsl --install

# Install Ubuntu 20.04 distribution in WSL
wsl --install -d Ubuntu-20.04

成功安装并重新启动计算机后,将打开一个新的终端窗口,提示您设置用于登录和 sudo 访问 Ubuntu 的 Unix 用户名和密码。供参考: https: //learn.microsoft.com/en-us/windows/wsl/setup/environment#set-up-your-linux-username-and-password

WSL Ubuntu 20.04 设置

安装所需的软件包以在 Ubuntu 20.04 环境(Ubuntu 终端窗口)中使用 QNN 工具。


# Update the package index files
sudo apt-get update

# Install python3.6 and necessary packages
sudo bash -c 'apt-get update && apt-get install software-properties-common && add-apt-repository ppa:deadsnakes/ppa && apt-get install python3.6 python3.6-distutils libpython3.6'
sudo apt-get install python3.6
# Install python3-pip
sudo apt-get install python3-pip

# Install python3 virtual environnment support
sudo apt install python3-virtualenv python3.6-distutils

# Create python3.6 virtual environment
virtualenv -p /usr/bin/python3.6 venv_wsl
source venv_wsl/bin/activate

# Install jupyter notebook to execute cells from notebook interactively
pip install jupyter

# After setting up python and pip in WSL Ubuntu, check QNN tools dependencies.
# Set QNN_SDK_ROOT environment variable to the location of Qualcomm AI Engine Directory for **Linux**
export QNN_SDK_ROOT=./qnn_assets/unzipped_qnn_sdk_linux/

# Check and install Linux dependencies
source $QNN_SDK_ROOT/bin/check-linux-dependency.sh
sudo apt-get install -y libtinfo5

# Check and install Python dependencies
python $QNN_SDK_ROOT/bin/check-python-dependency

# Install ONNX frameworks
pip install "onnx==1.6.0" "onnx-simplifier==0.4.8" "onnxruntime==1.10.0" "packaging"

# Setup necessary environment variables for QNN Tools
source $QNN_SDK_ROOT/bin/envsetup.sh

准备用于推理的稳定扩散模型

以下部分将介绍步骤 1、2 和 3,并使用 Qualcomm AI Engine Direct SDK 为目标推理准备稳定的扩散模型。

# Set up environment variable to reference STABLE_DIFFUSION_MODELS
export STABLE_DIFFUSION_MODELS="./qnn_assets/stable_diffusion_models/"

将模型从 ONNX 表示转换为 QNN 表示

Qualcomm AI Engine Direct SDKqnn-onnx-conerter工具可将模型从 ONNX 表示精确转换为等效的 QNN 表示A16W8。从 AIMET 工作流程生成的编码文件通过选项提供作为此步骤的输入–quantization_overrides model.encodings。

此步骤生成一个.cpp文件,该文件将模型表示为一系列 QNN API 调用,以及一个.bin包含静态数据的文件,静态数据通常是模型权重并由.cpp文件引用。

必须对所有三个模型独立完成此步骤。

生成模型输入列表/数据

python3 generate_inputs.py --pickle_path <insert PATH to pickle> --working_dir <insert PATH to qnn_assets>

转换文本编码器

mkdir $STABLE_DIFFUSION_MODELS/converted_text_encoder
qnn-onnx-converter -o $STABLE_DIFFUSION_MODELS/converted_text_encoder/qnn_model.cpp \
                   -i $STABLE_DIFFUSION_MODELS/text_encoder_onnx/text_encoder.onnx \
                   --input_list $STABLE_DIFFUSION_MODELS/text_encoder_onnx/text_encoder_input_list.txt \
                   --act_bw 16 \
                   --bias_bw 32 \
                   --quantization_overrides $STABLE_DIFFUSION_MODELS/text_encoder_onnx/text_encoder.encodings

# Rename the model files to make them unique and helpful for subsequent stages
mv $STABLE_DIFFUSION_MODELS/converted_text_encoder/qnn_model.cpp $STABLE_DIFFUSION_MODELS/converted_text_encoder/text_encoder.cpp
mv $STABLE_DIFFUSION_MODELS/converted_text_encoder/qnn_model.bin $STABLE_DIFFUSION_MODELS/converted_text_encoder/text_encoder.bin
mv $STABLE_DIFFUSION_MODELS/converted_text_encoder/qnn_model_net.json $STABLE_DIFFUSION_MODELS/converted_text_encoder/text_encoder_net.json

转换U-Net
预计执行时间:~35 分钟


mkdir $STABLE_DIFFUSION_MODELS/converted_unet
qnn-onnx-converter -o $STABLE_DIFFUSION_MODELS/converted_unet/qnn_model.cpp \
                   -i $STABLE_DIFFUSION_MODELS/unet_onnx/unet.onnx \
                   --input_list $STABLE_DIFFUSION_MODELS/unet_onnx/unet_input_list.txt \
                   --act_bw 16 \
                   --bias_bw 32 \
                   --quantization_overrides $STABLE_DIFFUSION_MODELS/unet_onnx/unet.encodings \
                   -l input_3 NONTRIVIAL

# Rename the model files to make them unique and helpful for subsequent stages
mv $STABLE_DIFFUSION_MODELS/converted_unet/qnn_model.cpp $STABLE_DIFFUSION_MODELS/converted_unet/unet.cpp
mv $STABLE_DIFFUSION_MODELS/converted_unet/qnn_model.bin $STABLE_DIFFUSION_MODELS/converted_unet/unet.bin
mv $STABLE_DIFFUSION_MODELS/converted_unet/qnn_model_net.json $STABLE_DIFFUSION_MODELS/converted_unet/unet_net.json

转换变分自动编码器 (VAE) 解码器
预计执行时间:~25 分钟


mkdir $STABLE_DIFFUSION_MODELS/converted_vae_decoder
qnn-onnx-converter -o $STABLE_DIFFUSION_MODELS/converted_vae_decoder/qnn_model.cpp \
                   -i $STABLE_DIFFUSION_MODELS/vae_decoder_onnx/vae_decoder.onnx \
                   --input_list $STABLE_DIFFUSION_MODELS/vae_decoder_onnx/vae_decoder_input.txt \
                   --act_bw 16 \
                   --bias_bw 32 \
                   --quantization_overrides $STABLE_DIFFUSION_MODELS/vae_decoder_onnx/vae_decoder.encodings

# Renaming for uniqueness
mv $STABLE_DIFFUSION_MODELS/converted_vae_decoder/qnn_model.cpp $STABLE_DIFFUSION_MODELS/converted_vae_decoder/vae_decoder.cpp
mv $STABLE_DIFFUSION_MODELS/converted_vae_decoder/qnn_model.bin $STABLE_DIFFUSION_MODELS/converted_vae_decoder/vae_decoder.bin
mv $STABLE_DIFFUSION_MODELS/converted_vae_decoder/qnn_model_net.json $STABLE_DIFFUSION_MODELS/converted_vae_decoder/vae_decoder_net.json

QNN模型库

Qualcomm AI Engine Direct SDKqnn-model-lib-generator将模型.cpp和.bin文件编译为特定目标的共享对象库。此示例为 x86_64-linux 目标生成共享对象库。

此阶段的输入是上一步中生成的model.cpp和文件。model.bin

生成文本编码器模型库

qnn-model-lib-generator -c $STABLE_DIFFUSION_MODELS/converted_text_encoder/text_encoder.cpp \
                        -b $STABLE_DIFFUSION_MODELS/converted_text_encoder/text_encoder.bin \
                        -t x86_64-linux-clang \
                        -o $STABLE_DIFFUSION_MODELS/converted_text_encoder

生成U-Net模型库
预计执行时间:~25 分钟

qnn - model - lib - generator  - c  $ STABLE_DIFFUSION_MODELS / converted_unet / unet 。cpp \
                         -b $ STABLE_DIFFUSION_MODELS / converted_unet / unet . _  bin \
                         -t x86_64 - linux - clang \
                         - o $ STABLE_DIFFUSION_MODELS / conversion_unet _ 

生成变分自动编码器(VAE)解码器模型库

qnn - model - lib - generator  - c  $ STABLE_DIFFUSION_MODELS / converted_vae_decoder / vae_decoder 。cpp \
                         -b $ STABLE_DIFFUSION_MODELS / converted_vae_decoder / vae_decoder 。_  bin \
                         -t x86_64 - linux - clang \
                         -o $ STABLE_DIFFUSION_MODELS / converted_vae_decoder / _ _ 

QNN HTP 上下文二进制文件

Qualcomm AI Engine Direct SDKqnn-context-binary-generator工具创建适用于 QNN HTP 后端的 QNN 上下文二进制文件。该二进制文件可以部署在 Snapdragon 平台上的 Windows 上运行。此步骤需要上一步中的模型共享对象库以及libQnnHtp.soQualcomm AI Engine Direct SDK 中提供的文件。

libQnnHtpBackendExtensions.so通过传递Qualcomm AI Engine Direct SDK 中可用的文件和以某种格式指定的配置文件,提供与 QNN HTP 后端相关的任何其他选项.json。有关后端扩展和配置参数的文档可在 Qualcomm AI Engine Direct SDK 文档中找到。

# Htp backend extensions config file (htp_backend_extensions.json) example
{
    "backend_extensions": {
        "shared_library_path": "libQnnHtpNetRunExtensions.so",
        "config_file_path": "htp_config.json"
    }
}


# HTP backend config file (htp_config.json) example for Surface Pro 2
{
    "graphs": {
        "vtcm_mb":8,
        "graph_names":["qnn_model"]
    },
    "devices": [
        {
            "soc_id": 43,
            "dsp_arch": "v73",
            "cores":[{
                "core_id": 0,
                "perf_profile": "burst",
                "rpc_control_latency":100
            }]
        }
    ]
}
# Create a path under models directory for serialized binaries
mkdir $STABLE_DIFFUSION_MODELS/serialized_binaries

为文本编码器生成 QNN 上下文二进制文件

qnn-context-binary-generator --model $STABLE_DIFFUSION_MODELS/converted_text_encoder/x86_64-linux-clang/libtext_encoder.so \
                             --backend libQnnHtp.so \
                             --output_dir $STABLE_DIFFUSION_MODELS/serialized_binaries \
                             --binary_file text_encoder.serialized \
                             --config_file htp_backend_extensions.json

为 U-Net 生成 QNN 上下文二进制文件
预计执行时间:~2 分钟

qnn-context-binary-generator --model $STABLE_DIFFUSION_MODELS/converted_unet/x86_64-linux-clang/libunet.so \
                             --backend libQnnHtp.so \
                             --output_dir $STABLE_DIFFUSION_MODELS/serialized_binaries \
                             --binary_file unet.serialized \
                             --config_file htp_backend_extensions.json

为 VAE 解码器生成 QNN 上下文二进制文件
预计执行时间:~1.5 分钟

qnn-context-binary-generator --model $STABLE_DIFFUSION_MODELS/converted_vae_decoder/x86_64-linux-clang/libvae_decoder.so \
                             --backend libQnnHtp.so \
                             --output_dir $STABLE_DIFFUSION_MODELS/serialized_binaries \
                             --binary_file vae_decoder.serialized \
                             --config_file htp_backend_extensions.json

完成这些准备用于推理的稳定扩散模型的步骤后,这三个模型的 QNN 上下文二进制文件可在$STABLE_DIFFUSION_MODELS/serialized_binaries/

下一步是使用 Qualcomm AI Engine Direct SDK 中提供的可执行实用程序在 Snapdragon 设备上的 Windows 上执行准备好的模型(现在表示为序列化上下文二进制文件)。

版权所有 © 2023 Qualcomm Technologies, Inc. 和/或其子公司。

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值