Skip to main content

使用 Qualcomm Neural Processing Engine SDK 移植模型

模型转换

来自 PyTorch、ONNX、TensorFlow 或 TFLite 的预训练浮点、32 位精度模型作为输入,提供给 SNPE 转换器工具(snpe-<framework>-to-dlc),以将模型转换为特定于 Qualcomm 的模型中间表示,称为深度学习容器(DLC)。除了来自源框架的输入模型外,转换器还需要有关输入模型的其他详细信息,例如输入节点名称、其对应的输入维度以及任何输出张量名称(对于具有多个输出的模型)。有关所有可配置参数,请参阅转换器,或通过运行以下命令查看命令行帮助:
输出:
如果您的工作环境中没有 yaml 包,请使用以下命令安装:
以下示例使用从 ONNX Model Zoo 下载的 ONNX 模型(inception_v3_opset16.onnx)。将模型下载为 inception_v3.onnx 到您的工作区。在此示例中,我们将模型下载到 ~/models 目录。运行以下命令以生成 inception_v3.dlc 模型。

模型量化

要在 Hexagon Tensor Processor(HTP)上运行模型,转换后的 DLC 必须进行量化。SNPE 提供了一个工具(snpe-dlc-quant),使用其自身的量化算法将 DLC 模型量化为 INT8/INT16 DLC。有关 SNPE 量化的更多信息,请参阅量化模型。SNPE 中的量化过程需要两个步骤:
  1. 量化模型内的权重和偏置。 权重和偏置的量化是一个静态步骤,即无需用户提供额外的输入数据。
  2. 量化激活层(或没有权重的层)。 激活层的量化需要来自训练数据集的一组输入图像作为校准数据。这些校准数据集图像作为 .raw 格式的预处理图像文件列表输入。这些输入 .raw 文件的文件大小必须与模型的输入大小匹配。
snpe-dlc-quant 的输入是转换后的 DLC 模型和一个包含校准数据集图像路径的纯文本文件。此输入列表包含以 .raw 格式保存为 NumPy 数组的预处理图像的路径。预处理图像的大小必须与模型的输入分辨率匹配。snpe-dlc-quant 工具的输出是量化后的 DLC。
使用 Netron 图形可视化工具来识别模型的输入/输出层维度。
出于演示目的,我们可以使用随机输入文件评估量化过程。可以使用下面显示的简单 Python 脚本为 inception_v3.onnx 模型生成输入文件。将脚本另存为 generate_random_input.py,保存在工作区 ~/models/ 目录中,并在主机上使用 python ~/models/generate_random_input.py 运行。以下示例 Python 代码创建一个 input_list,其中包含用于量化模型的校准数据集图像的路径。
上述脚本会生成 10 个示例输入文件,保存在 /tmp/RandomInputsForInceptionV3/ 目录中,并生成一个 input_list.txt 文件,其中包含每个生成样本的路径。现在,snpe-dlc-quant 工具所需的所有输入均已就绪,可以对模型进行量化。
这会生成一个量化后的 inception_v3 DLC 模型(inception_v3_quantized.dlc)。默认情况下,模型会被量化为 INT8 位宽。通过向 snpe-dlc-quant 工具指定 --act_bitwidth 16 和/或 --weights_bitwidth 16 选项,可以自定义为使用 16 位而不是默认的 INT8。请参阅 snpe-dlc-quant 工具文档,或运行 snpe-dlc-quant --help 以查看所有可用的自定义选项,包括量化模式、优化等。

模型优化

量化后的模型 DLC 需要一个图准备步骤,以针对 HTP 上的执行进行优化。为准备模型 DLC 以在 HTP 上执行,SNPE 提供了一个 snpe-dlc-graph-prepare 工具,它以量化模型和硬件特定详细信息(例如芯片组)作为输入。
针对 HTP 等硬件的优化取决于芯片组上存在的 HTP 特定版本。为确保对执行图应用正确的优化集,以最佳方式利用 HTP,向 snpe-dlc-graph-prepare 工具提供正确的芯片组 ID 非常重要。
根据 HTP 版本和芯片组 ID,该工具会创建一个缓存,其中包含在 HTP 硬件上执行模型 DLC 的执行策略。如果没有此步骤,由于 SNPE 运行时必须动态创建执行策略,网络初始化时会有额外的开销。

HTP 缓存信息

完成 snpe-dlc-graph-prepare 步骤后,HTP 缓存记录将添加到 DLC 中。可以使用 snpe-dlc-info 工具查看此缓存信息。