WSL 上的 Qualcomm AI Engine 直接稳定扩散模型准备
Qualcomm AI Engine Direct SDK 允许客户在 HTP 硬件上运行机器学习模型。以下步骤描述了如何在具有 HTP 功能的 Snapdragon (WoS) 平台上的 Windows 上准备和执行稳定扩散模型。
请注意,在本文档的其余部分中,术语 Qualcomm 神经网络 (QNN) 将与 Qualcomm AI Engine Direct SDK 互换使用。
先决条件
- WSL 和 Ubunu 20.04 安装并设置 QNN 工具所需的软件包
- Qualcomm AI Engine Direct SDK(支持 Ubuntu Linux 和 Windows)
- 稳定的扩散.onnx文件及其相应的 AIMET 编码(通过 AIMET 工作流程生成)
测试环境
表面 Pro9
- 操作系统版本:22621.169
- Windows 功能体验包 1000.22632.1000.0
- Snapdragon 上的 Windows:SC8280X
- qcadsprpc文件版本应为 1.0.3530.9800 或更高版本
获取qcadsprpc版本:
- 使用最新版本更新 Windows 操作系统和 Windows 驱动程序。
- 进入“系统信息”菜单并点击“软件环境->系统驱动程序”。选择qcadsprpc名称并检查文件路径。
- 转到 #2 上的文件路径。
- 按下左侧按钮qcadsprpc8280.sys并转到详细信息。
- 查看文件版本号:应为1.0.3530.9800或以上。
工作流程
本部分假设您在遵循 AIMET 稳定扩散工作流程后生成了以下稳定扩散模型工件:
- 稳定扩散文本编码器模型及其 AIMET 编码
- 稳定扩散 U-Net 模型及其 AIMET 编码
- 稳定扩散变分自动编码器 (VAE) 模型及其 AIMET 编码
- fp32.npyfile - 这是一个保存为 python pickle 的 numpy 对象数组。它包含模型转换步骤所需的数据。
这三种模型和编码通过 Qualcomm AI Engine Direct SDK 中提供的不同可执行实用程序独立处理。这些 QNN(高通神经网络)实用程序允许用户准备用于推理的稳定扩散模型。
步骤 1 到 3 的 QNN 可执行实用程序需要 WSL Ubuntu 20.04 环境。步骤 4 是推理步骤,在本机 Windows 环境中执行。
- 将文件转换.onnx为等效的 QNN 表示形式A16W8(16 位激活和 8 位权重)
- 生成 QNN 模型库
- 为 QNN HTP 后端生成 QNN 上下文二进制文件
- 在 Snapdragon (WoS) 平台上执行 QNN 上下文二进制文件以在 Windows 上进行推理
使用 Qualcomm Package Manager 3 安装 AI Engine Direct SDK
- 登录后从https://www.qualcomm.com/support/support-portals/qualcomm-package-manager安装 QPM 。
- 安装完成后,选择“工具”。
- 在搜索栏中搜索 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
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
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
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
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
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. 和/或其子公司。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/581.html