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-objc
和 onnxruntime-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 算子内线程池的竞争。为尽量减少这种情况,我们建议设置以下选项:
- 通过将会话选项添加以下内容来禁用 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 版本,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 版本起 |