由于 LiteRT 内置运算符库仅支持有限数量的 TensorFlow 运算符,因此并非所有模型都可以转换。如需了解详情,请参阅运营商兼容性。
如需允许转换,用户可以在 LiteRT 模型中启用某些 TensorFlow 操作。不过,使用 TensorFlow 操作运行 LiteRT 模型需要拉取核心 TensorFlow 运行时,这会增加 LiteRT 解释器二进制文件的大小。对于 Android,您可以仅选择性地构建所需的 TensorFlow 操作,从而避免此问题。如需了解详情,请参阅缩减二进制文件大小。
本文档概述了如何在所选平台上转换和运行包含 TensorFlow 操作的 LiteRT 模型。本文还讨论了性能和大小指标以及已知限制。
转换模型
以下示例展示了如何使用所选 TensorFlow 操作生成 LiteRT 模型。
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.target_spec.supported_ops = [
tf.lite.OpsSet.TFLITE_BUILTINS, # enable LiteRT ops.
tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
运行推理
使用已转换且支持部分 TensorFlow 操作的 LiteRT 模型时,客户端还必须使用包含必要 TensorFlow 操作库的 LiteRT 运行时。
Android AAR
如需缩减二进制文件的大小,请按照下一部分中的说明构建您自己的自定义 AAR 文件。如果二进制文件大小不是您特别关注的问题,我们建议您使用 MavenCentral 上托管的包含 TensorFlow 操作的预构建 AAR。
您可以在 build.gradle 依赖项中指定此项,方法是将其与标准 LiteRT AAR 一起添加,如下所示:
dependencies {
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
// This dependency adds the necessary TF op support.
implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly-SNAPSHOT'
}
如需使用每晚快照,请确保您已添加 Sonatype 快照代码库。
添加依赖项后,系统应会自动为需要相应委托的图安装处理图的 TensorFlow 操作所需的委托。
注意:TensorFlow 操作依赖项相对较大,因此您可能需要在 .gradle 文件中通过设置 abiFilters 过滤掉不必要的 x86 ABI。
android {
defaultConfig {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
}
构建 Android AAR
如需减小二进制文件大小或处理其他高级情况,您还可以手动构建库。假设您拥有一个可正常使用的 LiteRT 构建环境,请按如下方式构建包含所选 TensorFlow 操作的 Android AAR:
sh tensorflow/lite/tools/build_aar.sh \
--input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
--target_archs=x86,x86_64,arm64-v8a,armeabi-v7a
这将为 LiteRT 内置和自定义运算生成 AAR 文件 bazel-bin/tmp/tensorflow-lite.aar;并为 TensorFlow 运算生成 AAR 文件 bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar。如果您没有可用的构建环境,也可以使用 Docker 构建上述文件。
然后,您可以将 AAR 文件直接导入到项目中,也可以将自定义 AAR 文件发布到本地 Maven 制品库:
mvn install:install-file \
-Dfile=bazel-bin/tmp/tensorflow-lite.aar \
-DgroupId=org.tensorflow \
-DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar
mvn install:install-file \
-Dfile=bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar \
-DgroupId=org.tensorflow \
-DartifactId=tensorflow-lite-select-tf-ops -Dversion=0.1.100 -Dpackaging=aar
最后,在应用的 build.gradle 中,确保您具有 mavenLocal() 依赖项,并将标准 LiteRT 依赖项替换为支持所选 TensorFlow 操作的依赖项:
allprojects {
repositories {
mavenCentral()
maven { // Only for snapshot artifacts
name 'ossrh-snapshot'
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
mavenLocal()
}
}
dependencies {
implementation 'org.tensorflow:tensorflow-lite:0.1.100'
implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.1.100'
}
iOS
使用 CocoaPods
LiteRT 为 arm64 提供每晚预构建的精选 TF 操作 CocoaPods,您可以将其与 TensorFlowLiteSwift 或 TensorFlowLiteObjC CocoaPods 一起依赖。
注意:如果您需要在 x86_64 模拟器中使用部分 TF 操作,可以自行构建部分操作框架。如需了解详情,请参阅使用 Bazel + Xcode 部分。
# In your Podfile target:
pod 'TensorFlowLiteSwift' # or 'TensorFlowLiteObjC'
pod 'TensorFlowLiteSelectTfOps', '~> 0.0.1-nightly'
运行 pod install 后,您需要提供额外的链接器标志,以强制将所选的 TF 操作框架加载到您的项目中。在 Xcode 项目中,依次前往 Build Settings -> Other Linker Flags,然后添加:
对于版本 >= 2.9.0:
-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.xcframework/ios-arm64/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps
对于低于 2.9.0 的版本:
-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps
然后,您应该能够在 iOS 应用中运行使用 SELECT_TF_OPS 转换的任何模型。例如,您可以修改图片分类 iOS 应用来测试所选 TF 操作功能。
- 将模型文件替换为启用
SELECT_TF_OPS后转换的文件。 - 按照说明将
TensorFlowLiteSelectTfOps依赖项添加到Podfile。 - 添加其他链接器标志,如上所示。
- 运行示例应用,看看模型是否正常运行。
使用 Bazel + Xcode
可以使用 Bazel 构建适用于 iOS 的包含所选 TensorFlow 操作的 LiteRT。首先,按照 iOS build 说明正确配置 Bazel 工作区和 .bazelrc 文件。
在配置工作区并启用 iOS 支持后,您可以使用以下命令来构建所选 TF 操作插件框架,该框架可以添加到常规 TensorFlowLiteC.framework 之上。请注意,选择的 TF 操作框架无法针对 i386 架构构建,因此您需要明确提供目标架构列表(不包括 i386)。
bazel build -c opt --config=ios --ios_multi_cpus=arm64,x86_64 \
//tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework
这将在 bazel-bin/tensorflow/lite/ios/ 目录下生成框架。您可以按照 iOS 构建指南中 Xcode 项目设置部分下所述的类似步骤,将此新框架添加到您的 Xcode 项目中。
将框架添加到应用项目后,应在应用项目中指定额外的链接器标志,以强制加载所选的 TF 操作框架。在 Xcode 项目中,依次前往 Build Settings -> Other Linker
Flags,然后添加:
-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>
C/C++
如果您使用 Bazel 或 CMake 构建 LiteRT 解释器,则可以通过关联 LiteRT Flex 委托共享库来启用 Flex 委托。您可以使用 Bazel 构建它,如以下命令所示。
bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex
此命令会在 bazel-bin/tensorflow/lite/delegates/flex 中生成以下共享库。
| 平台 | 库名称 |
|---|---|
| Linux | libtensorflowlite_flex.so |
| macOS | libtensorflowlite_flex.dylib |
| Windows | tensorflowlite_flex.dll |
请注意,只要关联了共享库,在运行时创建解释器时,系统就会自动安装必要的 TfLiteDelegate。无需像其他委托类型那样显式安装委托实例。
注意:此功能自版本 2.7 起可用。
Python
LiteRT 和所选的 TensorFlow 操作将随 TensorFlow pip 软件包自动安装。您也可以选择仅安装 LiteRT 解释器 pip 软件包。
指标
性能
如果同时使用内置 TensorFlow 操作和精选 TensorFlow 操作,所有相同的 LiteRT 优化和优化的内置操作都将可用于转换后的模型。
下表介绍了在 Pixel 2 上对 MobileNet 运行推理的平均时间。所列时间是 100 次运行的平均时间。这些目标是使用标志 --config=android_arm64 -c opt 为 Android 构建的。
| 构建 | 时间(毫秒) |
|---|---|
仅限内置操作 (TFLITE_BUILTIN) |
260.7 |
仅使用 TF 操作 (SELECT_TF_OPS) |
264.5 |
二进制文件大小
下表描述了每个 build 的 LiteRT 二进制大小。这些目标是使用 --config=android_arm -c opt 为 Android 构建的。
| 构建 | C++ 二进制文件大小 | Android APK 大小 |
|---|---|---|
| 仅内置操作 | 796 KB | 561 KB |
| 内置操作 + TF 操作 | 23.0 MB | 8.0 MB |
| 内置操作 + TF 操作 (1) | 4.1 MB | 1.8 MB |
(1) 这些库是针对 i3d-kinetics-400 模型选择性构建的,包含 8 个 TFLite 内置操作和 3 个 TensorFlow 操作。如需了解详情,请参阅减小 LiteRT 二进制文件大小部分。
已知限制
- 不支持的类型:某些 TensorFlow 操作可能不支持 TensorFlow 中通常提供的完整输入/输出类型集。
更新
- 版本 2.6
- 改进了对基于 GraphDef 属性的运算符和 HashTable 资源初始化的支持。
- 版本 2.5
- 您可以应用一种称为训练后量化的优化
- 版本 2.4
- 改进了与硬件加速委托方的兼容性