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-objc
和 onnxruntime-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 内部算子线程池发生争用。为了尽量减少这种情况,我们建议设置以下选项
- 通过将以下内容添加到会话选项来禁用 ORT 内部算子线程池自旋
so.AddConfigEntry(kOrtSessionOptionsConfigAllowIntraOpSpinning, "0");
- 注册 XNNPACK EP 时设置 XNNPACK 内部算子线程池大小。建议的值是设备上的物理核心数量。
so.AppendExecutionProvider("XNNPACK", {"intra_op_num_threads", std::to_string(intra_op_num_threads)});
- 将 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 版本起 |