选择 TensorFlow 运算符

由于 TensorFlow Lite 内置运算符库仅支持有限数量的 TensorFlow 运算符,因此并非所有模型都可转换。有关详细信息,请参阅 运算符兼容性

为了允许转换,用户可以在 TensorFlow Lite 模型中启用使用 某些 TensorFlow 运算符。但是,运行包含 TensorFlow 运算符的 TensorFlow Lite 模型需要引入核心 TensorFlow 运行时,这会增加 TensorFlow Lite 解释器二进制文件的大小。对于 Android,您可以通过有选择地仅构建所需的 Tensorflow 运算符来避免这种情况。有关详细信息,请参阅 减小二进制文件大小

本文档概述了如何 转换运行 包含 TensorFlow 运算符的 TensorFlow Lite 模型,该模型在您选择的平台上运行。它还讨论了 性能和大小指标 以及 已知限制

转换模型

以下示例展示了如何生成包含选定 TensorFlow 运算符的 TensorFlow Lite 模型。

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 TensorFlow Lite ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

运行推理

使用已转换的 TensorFlow Lite 模型(支持选定 TensorFlow 运算符)时,客户端还必须使用包含必要的 TensorFlow 运算符库的 TensorFlow Lite 运行时。

Android AAR

为了减小二进制文件大小,请按照 下一节 中的说明构建自己的自定义 AAR 文件。如果二进制文件大小不是一个重大问题,我们建议使用预构建的 包含 TensorFlow 运算符的 AAR,该 AAR 托管在 MavenCentral 上

您可以在 build.gradle 依赖项中通过将其与标准 TensorFlow Lite 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 运算符的必要委托。

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

构建 Android AAR

为了减小二进制文件大小或其他高级情况,您也可以手动构建库。假设您有一个 有效的 TensorFlow Lite 构建环境,请按照以下步骤构建包含选定 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

这将生成 AAR 文件 bazel-bin/tmp/tensorflow-lite.aar(用于 TensorFlow Lite 内置和自定义运算符);以及生成 AAR 文件 bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar(用于 TensorFlow 运算符)。如果您没有有效的构建环境,您也可以 使用 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() 依赖项,并将标准 TensorFlow Lite 依赖项替换为支持选择 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

TensorFlow Lite 为 arm64 提供了 nightly 预构建的选择 TF 操作 CocoaPods,您可以将其与 TensorFlowLiteSwiftTensorFlowLiteObjC CocoaPods 同时使用。

# 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 构建包含选择 TensorFlow 操作的 TensorFlow Lite for iOS。首先,按照 iOS 构建说明 正确配置您的 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 构建 TensorFlow Lite 解释器,则可以通过链接 TensorFlow Lite 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 将会自动安装。不需要像其他代理类型那样显式安装代理实例。

Python

包含选择 TensorFlow 操作的 TensorFlow Lite 将会与 TensorFlow pip 包 一起自动安装。您也可以选择只安装 TensorFlow Lite 解释器 pip 包

指标

性能

当同时使用内置 TensorFlow 操作和选择 TensorFlow 操作时,所有 TensorFlow Lite 优化和优化的内置操作都将可用,并可与转换后的模型一起使用。

下表描述了在 Pixel 2 上运行 MobileNet 推理的平均时间。列出的时间是 100 次运行的平均值。这些目标是使用以下标志为 Android 构建的:--config=android_arm64 -c opt

构建 时间(毫秒)
仅内置操作 (TFLITE_BUILTIN) 260.7
仅使用 TF 操作 (SELECT_TF_OPS) 264.5

二进制大小

下表描述了每个构建的 TensorFlow Lite 的二进制大小。这些目标是使用 --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 操作。有关更多详细信息,请参阅 减少 TensorFlow Lite 二进制大小 部分。

已知限制

  • 不支持的类型:某些 TensorFlow 操作可能不支持 TensorFlow 中通常可用的完整输入/输出类型集。

更新

  • 版本 2.6
    • 对基于 GraphDef 属性的操作符和 HashTable 资源初始化的支持已得到改进。
  • 版本 2.5
  • 版本 2.4
    • 与硬件加速代理的兼容性已得到改进。