问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

高通WOS AI开发之 QNN 开发(一)

创作时间:
作者:
@小白创作中心

高通WOS AI开发之 QNN 开发(一)

引用
CSDN
1.
https://m.blog.csdn.net/weixin_38498942/article/details/144748785

Qualcomm AI Engine Direct是一个低级API,旨在利用Qualcomm® Snapdragon平台实现AI工作负载的最佳性能。该SDK提供工具以支持多种流行的AI框架,以及离线工具来转换、量化、优化并将模型卸载到各种AI Engine运行时。本文将详细介绍如何搭建QNN开发环境,并进行模型转换和量化。

环境安装

以管理员模式打开PowerShell,并运行以下命令以安装依赖项。此设置是教程所必需的,预计需要大约20-30分钟。有关设置的更多详细信息,请参见qnn_setup.ps1。

  1. 运行以下命令以下载设置脚本。如果您已经下载了它,可以跳过此步骤。
Invoke-WebRequest -O qnn_setup.ps1 https://raw.githubusercontent.com/quic/wos-ai/refs/heads/main/Scripts/qnn_setup.ps1
  1. 运行以下命令以安装AI Engine Direct(QNN)的先决条件。设置$DIR_PATH(默认为C:\WoS_AI),用户可以更改为所需路径。
$DIR_PATH = "C:\WoS_AI"

QNN-设置:

powershell -command "&{. .\qnn_setup.ps1; QNN_Setup -rootDirPath $DIR_PATH}"

以下依赖项将被下载和安装:

  • Python amd64版本3.10.4
  • 模型工件包括mobilenet_v2.onnx模型和用于预处理/后处理的io_utils.py。
  • AI Engine Direct SDK版本2.28
  • Visual Studio Enterprise版本17.10.3
  • CMake版本3.30.4
  • 创建一个虚拟环境(QAIRT_VENV),其中包含AI Engine Direct(QNN)所需的库。
  1. 设置完成后,$DIR_PATH中将有以下文件夹结构:
  • Downloads:此文件夹存储完成设置所需的所有文件,例如Python安装程序、设置脚本等。
  • Python_Env:此目录包含为EP创建的虚拟环境。
  • Debug_Logs:此目录包含与设置相关的日志。
  • Models:此目录保存模型子目录及其相应的工件(例如:Mobilenet_v2),以及QNN依赖项,如库和骨架文件(例如:QNN_Dependencies)。

工作流

AI Engine Direct允许开发者从支持的AI框架(如ONNX、TensorFlow、TensorFlow Lite或PyTorch)中选择任何预训练模型,并将其转换为可以在Snapdragon X平台的AI Engine硬件上进行推理的格式。

下图展示了为获得模型推理每瓦最佳性能而需遵循的典型工作流程。

该流程中的步骤包括:

  1. 模型训练:此步骤超出了本文档的范围。预计您已经从AI Hub获得了预训练模型,或者使用第三方AI框架开发了一个模型。
  2. 模型转换:此步骤将预训练模型转换为AI Engine Direct格式,包括一个用于图的mode.cpp文件和一个包含权重的model.bin文件。
  3. 量化:模型转换工具还支持将模型量化为NPU支持的任意整数精度(例如,INT4、INT8或INT16)。对于在支持FP32精度的NPU或CPU运行时上运行FP16模型,此步骤不是必需的。
  4. 模型生成:此步骤使用上一步生成的mode.cpp文件生成model.dll。此model.dll可用于在AI Engine硬件上进行模型推理。
  5. 上下文二进制准备:对于NPU推理,此步骤可以选择性地在离线模式下使用,以从步骤3中生成的model.dll生成已编译的上下文二进制文件。离线使用此步骤将提前编译模型,减少应用启动期间的模型初始化时间,从而改善用户体验。
  6. 模型执行:此步骤使用步骤3和4中生成的model.dll或上下文二进制文件,并在AI Engine硬件上执行模型。

注意:由于模型必须被转换和量化以适应Qualcomm硬件,因此在运行推理之前,您需要自定义您的模型。

模型转换

一旦AI Engine Direct SDK环境设置完成,即可使用SDK工具生成QNN模型。生成模型的过程分阶段进行,以适应不同的后端。

对于QNN CPU后端

对于QNN HTP后端

对于QNN HTP后端,转换并量化后的模型(model.dll)可以通过离线缓存进一步优化,使用二进制阶段。

转换

要转换模型,开发者可以使用其中一个qnn--converter模型转换工具。这些工具支持多种ML框架,包括TensorFlow、TensorFlow Lite (TFLite)、PyTorch和ONNX。每个转换器的流程是相同的。

设置工作目录

打开PowerShell并运行以下命令,以将工作目录分配给$DIR_PATH并激活Python虚拟环境。确保$DIR_PATH与设置过程中使用的路径相同。

$DIR_PATH = "C:\WoS_AI"
powershell -NoExit -command "&{cd $DIR_PATH; . .\Downloads\Setup_Scripts\qnn_setup.ps1; Activate_QNN_VENV -rootDirPath $DIR_PATH}"

CPU后端

转换(CPU后端)

运行以下命令生成mobilenet_v2.cpp和mobilenet_v2.bin。

python $QNN_SDK_ROOT\bin\arm64x-windows-msvc\qnn-onnx-converter --input_network .\mobilenet_v2.onnx --output_path .\QNN_Artifacts\mobilenet_v2.cpp

HTP后端

转换和量化(针对HTP后端)

Snapdragon X HTP后端支持使用较低的精度(如INT8或INT16)运行模型,同时支持FP16。因此,模型需要使用SDK提供的工具和以下程序从FP32量化为INT8或INT16。有关量化的更多详细信息,请参见AI Engine Direct SDK文档。

在本教程中,我们将从使用FiftyOne数据集动物园下载的验证数据集中转换10张图像为原始文件,存储在$DIR_PATH\Models\Mobilenet_V2\quant_jpg目录中。量化所需的输入原始文件列表已提供在一个文本文件中。

以下步骤准备原始文件进行模型量化/推理。

  1. 运行以下命令:
notepad.exe generate_raw_list.py
  1. 将以下代码复制到generate_raw_list.py文件中,并运行generate_raw_list.py以创建用于量化的raw_list.txt文件。
#generate_raw_list.py
import numpy as np
import os
#Qualcomm utility for pre-/postprocessing of input/outputs in model inference
import io_utils
import fiftyone
# download the sample image for quantization using fiftyone
max_samples = 10
dataset_dir = os.path.join(os.getcwd(),"Downloaded_file")
fiftyone.config.dataset_zoo_dir = dataset_dir
dataset = fiftyone.zoo.load_zoo_dataset("open-images-v6", split="validation", label_types=["classifications"], classes=["Cat", "Dog"], max_samples= max_samples)
#path of directory containing jpg images sampled from the validation dataset.
image_dir_path = os.path.join(dataset_dir,"open-images-v6", "validation", "data")
files=os.listdir(image_dir_path)
#path of directory containing raw files
raw_dir_path = os.path.join(os.getcwd(),"quant_raw")
if not os.path.exists(raw_dir_path):
   os.mkdir(raw_dir_path)
input_path_list=[]
#convert jpg to raw
for file_name in files:
   file_path = os.path.join(image_dir_path, file_name)
   try:
         raw_img = io_utils.preprocess(file_path,True)
         save_path = os.path.join(raw_dir_path, file_name.split('.')[0]+ '.raw')
         raw_img.tofile(save_path)
         input_path_list.append(save_path)
   except Exception as e:
         pass
#create raw list
with open(os.path.join(os.getcwd(),"raw_list.txt"), "w") as f:
   for path in input_path_list:
      f.write(path)
      f.write('\n')
print("\nTotal no image processed for quantization:",len(input_path_list))
  1. 执行generate_raw_list.py以创建用于量化的raw_list.txt文件。
python .\generate_raw_list.py

当上述脚本运行时,raw_list.txt文件将在$DIR_PATH\Models\Mobilenet_V2文件夹中生成,如下图所示。

  1. 运行以下命令以转换和量化。默认情况下,模型以INT8位宽进行量化。您可以指定[–act_bw 16]和/或[–weight_bw 16]以使用INT16量化。
python $QNN_SDK_ROOT\bin\arm64x-windows-msvc\qnn-onnx-converter --input_network .\mobilenet_v2.onnx --output_path .\QNN_Artifacts\quantized_mobilenet_v2.cpp --input_list .\raw_list.txt --use_per_channel_quantization

由于mobilenet_v2模型对量化噪声敏感,我们使用了一个可选参数(use_per_channel_quantization)。这在额外计算成本的情况下为我们提供了更好的准确性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号