XNNPACK 执行提供程序
使用 ONNX Runtime 和 XNNPACK 执行提供程序加速 Android/iOS 设备和 WebAssembly 上的 ONNX 模型。XNNPACK 是一个高度优化的浮点神经网络推理运算符库,适用于基于 Arm®、WebAssembly 和 x86 平台。
目录
安装
预构建的 ONNX Runtime 包 (onnxruntime-android
) 与用于 Android 的 XNNPACK EP 一起发布在 Maven 上。有关安装说明,请参阅此处。
预构建的二进制文件 (onnxruntime-objc
和 onnxruntime-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 线程池发生争用。为了最大限度地减少这种情况,我们建议设置以下选项
- 通过将会话选项中添加以下内容来禁用 ORT intra-op 线程池 spinning
so.AddConfigEntry(kOrtSessionOptionsConfigAllowIntraOpSpinning, "0");
- 注册 XNNPACK EP 时,设置 XNNPACK intra-op 线程池大小。建议值为设备上的物理核心数。
so.AppendExecutionProvider("XNNPACK", {"intra_op_num_threads", std::to_string(intra_op_num_threads)});
- 将 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 起 |