如何使用 ONNX Runtime 开发移动应用程序
ONNX Runtime 为您提供了多种选项,可以将机器学习添加到您的移动应用程序中。本页概述了开发流程。您还可以查看本节中的教程
ONNX Runtime 移动应用程序开发流程
获取模型
开发您的移动机器学习应用程序的第一步是获取模型。
您需要了解您的移动应用的场景并获取适用于该场景的 ONNX 模型。例如,应用是分类图像、在视频流中进行目标检测、总结或预测文本,还是进行数值预测。
要在 ONNX Runtime 移动版上运行,模型必须是 ONNX 格式。ONNX 模型可以从 ONNX 模型库获取。如果您的模型不是 ONNX 格式,您可以使用转换器将其从 PyTorch、TensorFlow 和其他格式转换为 ONNX。
由于模型在设备上加载和运行,因此模型必须适合设备磁盘并能够加载到设备的内存中。
开发应用程序
获取模型后,您可以使用 ONNX Runtime API 加载并运行它。
您使用的语言绑定和运行时包取决于您选择的开发环境和您正在开发的目标平台。
- Android Java/C/C++: onnxruntime-android 包
- iOS C/C++: onnxruntime-c 包
- iOS Objective-C: onnxruntime-objc 包
- Android 和 iOS C# (MAUI/Xamarin): Microsoft.ML.OnnxRuntime 和 Microsoft.ML.OnnxRuntime.Managed
有关包的特定说明,请参阅安装指南。
上述所有包都包含完整的 ONNX Runtime 功能和算子集,并支持 ONNX 格式。我们建议您从这些包开始开发您的应用程序。可能需要进一步的优化。详细信息如下所述。
根据目标平台,您可以在应用中选择使用硬件加速器
- 所有目标都支持 CPU,这是默认设置
- 在 Android 上运行的应用程序还支持 NNAPI 和 XNNPACK
- 在 iOS 上运行的应用程序还支持 CoreML 和 XNNPACK
加速器在 ONNX Runtime 中称为执行提供程序 (Execution Providers)。
如果模型已量化,请从 CPU 执行提供程序开始。如果模型未量化,请从 XNNPACK 开始。这些是最简单且最一致的,因为一切都在 CPU 上运行。
如果 CPU/XNNPACK 未达到应用程序的性能要求,则尝试 NNAPI/CoreML。这些执行提供程序的性能取决于设备和模型。如果由于模型使用了执行提供程序不支持的算子(例如,由于较旧的 NNAPI 版本)导致模型被分成多个部分,性能可能会下降。
当创建 ONNX Runtime 会话并加载模型时,可以在 SessionOptions 中配置特定的执行提供程序。有关更多详细信息,请参阅您语言的API 文档。
衡量应用程序的性能
根据目标平台的要求衡量应用程序的性能。这包括
- 应用程序二进制大小
- 模型大小
- 应用程序延迟
- 功耗
如果应用程序未达到其要求,可以应用优化措施。
优化您的应用程序
减小模型大小
减小模型大小的一种方法是量化模型。这将一个原始的 32 位权重的模型大小减少约 4 倍,因为权重被缩减为 8 位。有关如何执行此操作的说明,请参阅 ONNX Runtime 的量化指南。
另一种减小模型大小的方法是寻找具有相同输入、输出和架构且已针对移动设备优化的新模型。例如:MobileNet 和 MobileBert。
减小应用程序二进制大小
要减小 ONNX Runtime 二进制文件大小,您可以根据您的模型构建自定义运行时。
请参阅构建自定义运行时的流程。
ORT 格式转换的输出之一是构建配置文件,其中包含模型中的算子及其类型列表。您可以使用此配置文件作为自定义运行时二进制构建的输入。
以下表格比较了预构建包和自定义构建的二进制大小差异
文件 | 1.18.0 预构建包大小 (字节) | 1.18.0 自定义构建大小 (字节) |
---|---|---|
AAR | 24415212 | 7532309 |
jni/arm64-v8a/libonnxruntime.so ,未压缩 | 16276832 | 3962832 |
jni/x86_64/libonnxruntime.so ,未压缩 | 18222208 | 4240864 |
此自定义构建支持运行 ResNet50 模型所需的算子。它需要使用 ORT 格式模型(因为它使用 --minimal_build=extended
构建)。它支持 NNAPI 和 XNNPACK 执行提供程序。