XNNPACK 执行提供程序

使用 ONNX Runtime 和 XNNPACK 执行提供程序加速 Android/iOS 设备和 WebAssembly 上的 ONNX 模型。XNNPACK 是一个高度优化的浮点神经网络推理运算符库,适用于基于 Arm®、WebAssembly 和 x86 平台。

目录

安装

预构建的 ONNX Runtime 包 (onnxruntime-android) 与用于 Android 的 XNNPACK EP 一起发布在 Maven 上。有关安装说明,请参阅此处

预构建的二进制文件 (onnxruntime-objconnxruntime-c) 的 ONNX Runtime 与用于 iOS 的 XNNPACK EP 一起发布到 CocoaPods。有关安装说明,请参阅此处

构建

有关构建包含 XNNPACK EP 的软件包的说明,请参阅构建页面

您可以构建带有 XNNPACK EP 的 ONNX Runtime,用于 Android、iOS、Windows 和 Linux。

用法

ONNX Runtime API 详细信息请参阅此处

XNNPACK EP 可以通过 C、C++ 或 Java API 使用

创建推理会话时,必须显式注册 XNNPACK EP。例如

Ort::Env env = Ort::Env{ORT_LOGGING_LEVEL_ERROR, "Default"};
Ort::SessionOptions so;
so.AppendExecutionProvider("XNNPACK", {"intra_op_num_threads", std::to_string(intra_op_num_threads)});
Ort::Session session(env, model_path, so);

配置选项

XNNPACK 有一个单独的内部线程池,这可能会导致与 ORT intra-op 线程池发生争用。为了最大限度地减少这种情况,我们建议设置以下选项

  1. 通过将会话选项中添加以下内容来禁用 ORT intra-op 线程池 spinning
     so.AddConfigEntry(kOrtSessionOptionsConfigAllowIntraOpSpinning, "0");
    
  2. 注册 XNNPACK EP 时,设置 XNNPACK intra-op 线程池大小。建议值为设备上的物理核心数。
     so.AppendExecutionProvider("XNNPACK", {"intra_op_num_threads", std::to_string(intra_op_num_threads)});
    
  3. 将 ORT intra-op 线程池大小设置为 1
     so.SetIntraOpNumThreads(1);
    

如果您的模型使用 XNNPACK 处理执行计算密集型工作的节点,则此配置将运行良好,因为这些运算符可能使用 intra-op 线程池。例如 Conv、Gemm、MatMul 运算符。

如果您的模型包含使用 XNNPACK EP 当前不支持的运算符的计算密集型节点,这些节点将由 CPU EP 处理。在这种情况下,通过增加 ORT intra-op 线程池的大小并可能重新启用 spinning,可以获得更好的性能。性能测试是确定模型最佳配置的最佳方法。

可用选项

intra_op_num_threads

用于 XNNPACK EP 内部 intra-op 线程池的线程数。这是用于并行化节点内执行的线程数。默认值为 1。该值应 >= 1。

支持的运算符

以下运算符受 XNNPACK 执行提供程序支持,

运算符 注意  
ai.onnx:AveragePool 仅支持 2D 池化。  
ai.onnx:Conv 仅支持 2D 卷积。
权重和偏置应为常数。
 
ai.onnx:ConvTranspose 仅支持 2D ConvTranspose。
权重和偏置应为常数。
自 1.14 起
ai.onnx:MaxPool 仅支持 2D 池化。  
ai.onnx:Softmax 支持低于 13 的所有 opset,仅当 AXIS 是最后一个维度时才支持 opset 13  
ai.onnx:QLinearConv 仅支持 2D 卷积。
权重和偏置应为常数。
所有量化比例和零点应为常数。
 
ai.onnx:Resize 支持 双线性模式 中的 2D/4D 调整大小 自 1.14 起
ai.onnx:Gemm 仅支持 2D 运算 自 1.14 起
ai.onnx:Matmul 仅支持 2D 运算 自 1.14 起
com.microsoft:QLinearAveragePool 仅支持 2D 池化。
所有量化比例和零点应为常数。
 
com.microsoft:QLinearSoftmax 所有量化比例和零点应为常数。  
com.microsoft:QLinearConvTranspose 所有量化比例和零点应为常数。 自 1.14 起