Skip to main content
ONNX(Open Neural Network Exchange,开放神经网络交换)是一种用于导出模型的标准格式(模型通常使用 PyTorch 等框架创建),使模型可以在任何地方运行。在 Dragonwing 设备上,您可以使用 ONNX Runtime 和 AI Engine Direct 直接在 NPU 上执行 ONNX 模型,以获得最佳性能。

准备 onnx 文件

NPU 仅支持具有固定输入形状的 uint8/int8 量化模型。如果您的模型未经量化,或者具有动态输入形状,模型将自动卸载到 CPU 上运行。以下是准备模型的一些技巧。
有关将 PyTorch 模型导出为 ONNX 的完整教程,请参阅 PyTorch 文档。

动态形状

如果您的模型具有动态形状,需要先将其转换为固定形状。您可以通过 Netron 查看网络的形状。 例如,以下模型具有动态形状:

具有动态形状的 ONNX 模型。此处输入张量名为 pixel_values。

您可以通过 onnxruntime.tools.make_dynamic_shape_fixed 设置固定形状:
之后,您的模型便具有固定形状,可以在 NPU 上运行了。

具有固定形状的 ONNX 模型

量化模型

NPU 仅支持 uint8/int8 量化模型。不受支持的模型或不受支持的层将自动回退到 CPU 上运行。有关模型量化的指南,请参阅 ONNX Runtime 文档:Quantize ONNX Models。
不想自己量化? 您可以从 Qualcomm AI Hub 下载一系列预量化模型,或者使用 Edge Impulse 对新模型或现有模型进行量化。

在 NPU 上运行模型(Python)

要将模型卸载到 NPU,只需加载 QNNExecutionProvider,并在创建 InferenceSession 时传入即可。例如:
注意:请确保使用带有 AI Engine Direct 绑定的 onnxruntime wheel,请参阅页面顶部。

示例:SqueezeNet-1.1(Python)

在开发板上打开终端,或通过 SSH 会话连接到开发板,然后:
1

创建 venv,并安装 onnxruntime 和 Pillow

2

保存端到端 SqueezeNet-1.1 示例脚本

以下是运行 SqueezeNet-1.1 的端到端示例。将此文件保存为 inference_onnx.py:
此脚本包含硬编码的量化参数。如果更换模型,可能需要修改这些参数。
3

在 CPU 上运行模型

4

在 NPU 上运行模型

可以看到,该模型在 NPU 上运行速度明显更快,但模型输出略有变化。

提示与技巧

禁用 CPU 回退

为便于调试,您可能希望通过以下方式禁用回退到 CPU:

构建新版本的 onnxruntime 软件包

请参阅 edgeimpulse/onnxruntime-qnn-linux-aarch64。