XNNPACK 执行提供程序

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

目录

安装

包含 XNNPACK EP 的 ONNX Runtime 预构建软件包 (onnxruntime-android) 已发布到 Maven,供 Android 使用。有关安装说明,请参阅此处

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

构建

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

您可以为 Android、iOS、Windows 和 Linux 构建包含 XNNPACK EP 的 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 版本,opsbet 13 仅在 AXIS 为最后一个维度时支持  
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 版本起