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

带 AI Engine Direct 的 onnxruntime wheel

onnxruntime 目前没有发布带 AI Engine Direct 绑定的 aarch64 Linux 预构建 wheel — 因此您无法从 PyPI 安装 onnxruntime。不过,您可以在这里下载预构建的 wheel: (通过 pip3 install onnxruntime_qnn-*-linux_aarch64.whl 安装) 要为其他 onnxruntime 或 Python 版本构建 wheel,请参见 edgeimpulse/onnxruntime-qnn-linux-aarch64

准备您的 onnx 文件

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

动态形状

如果您的模型具有动态形状,则需要先将其转换为固定形状。您可以通过 Netron 查看网络的形状。 例如,这个模型具有动态形状: 您可以通过 onnxruntime.tools.make_dynamic_shape_fixed 设置固定形状:
之后,您的模型将具有固定形状,并可以在 NPU 上运行。

量化模型

NPU 仅支持 uint8/int8 量化模型。不受支持的模型或不受支持的层会自动回退到 CPU 上运行。有关模型量化的指南,请参见 ONNX Runtime 文档:量化 ONNX 模型
不想自己进行量化? 您可以从 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 的端到端示例。将此文件保存为 inference_onnx.py:
    此脚本使用了硬编码的量化参数。如果您更换模型,可能需要修改这些参数。
  3. 在 CPU 上运行模型:
  4. 在 NPU 上运行模型:
如您所见,该模型在 NPU 上运行速度显著更快 — 但模型输出会有轻微变化。

技巧与窍门

禁用 CPU 回退

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

构建新版本的 onnxruntime 软件包

参见 edgeimpulse/onnxruntime-qnn-linux-aarch64