XNNPACK 执行提供者

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

目录

安装

包含 XNNPACK EP 的 ONNX Runtime 预构建 Android 包 (onnxruntime-android) 已发布到 Maven。请参阅此处获取安装说明。

包含 XNNPACK EP 的 ONNX Runtime 预构建 iOS 二进制文件(onnxruntime-objconnxruntime-c)已发布到 CocoaPods。请参阅此处获取安装说明。

构建

请参阅构建页面,了解如何构建包含 XNNPACK EP 的包。

您可以使用 XNNPACK EP 为 Android、iOS、Windows 和 Linux 构建 ONNX Runtime。

使用方法

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 内部算子线程池发生争用。为了尽量减少这种情况,我们建议设置以下选项

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

如果您的模型对计算密集型工作节点使用 XNNPACK,则此配置将运行良好,因为这些算子很可能使用内部算子线程池。例如 Conv、Gemm、MatMul 算子。

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

可用选项

intra_op_num_threads

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

支持的算子

XNNPACK 执行提供者支持以下算子:

算子 注意  
ai.onnx:AveragePool 仅支持 2D 池化。  
ai.onnx:Conv 仅支持 2D 卷积。
权重和偏置应为常量。
 
ai.onnx:ConvTranspose 仅支持 2D 反卷积。
权重和偏置应为常量。
自 1.14 版本起
ai.onnx:MaxPool 仅支持 2D 池化。  
ai.onnx:Softmax 支持所有低于 13 的 opset 版本,仅当 AXIS 是最后一个维度时支持 opset 13  
ai.onnx:QLinearConv 仅支持 2D 卷积。
权重和偏置应为常量。
所有量化比例和零点应为常量。
 
ai.onnx:Resize 支持 Bilinear mode 的 2D/4D Resize 自 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 版本起