Skip to main content
ONNX(Open Neural Network Exchange)是一种用于导出模型的标准格式 —— 这些模型通常是 在 PyTorch 等框架中创建的 —— 使其可以在任何地方运行。在 Dragonwing 设备上,您可以 借助 ONNX Runtime 与 AI Engine Direct,直接在 NPU 上执行 ONNX 模型以获得最佳性能。

准备您的 onnx 文件

NPU 仅支持具有固定输入形状的 uint8/int8 量化模型。如果您的模型未量化,或者具有动态 输入形状,模型将自动回退到 CPU。以下是一些准备模型的建议。
PyTorch 文档中提供了将 PyTorch 模型导出为 ONNX 的完整教程。

动态形状

如果您的模型具有动态形状,则需要先将其转换为固定形状。您可以通过 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。