选择 TensorFlow 运算符

由于 TensorFlow Lite 内置运算符库仅支持有限数量的 TensorFlow 运算符,因此并非所有模型都是可转换的。如需了解详情,请参阅运算符兼容性

如需允许转换,用户可以在其 TensorFlow Lite 模型中启用某些 TensorFlow 操作。但是,运行包含 TensorFlow 运算的 TensorFlow Lite 模型需要拉取核心 TensorFlow 运行时,这会增加 TensorFlow Lite 解释器二进制文件的大小。对于 Android,您可以通过选择性地仅构建所需的 TensorFlow 操作来避免这种情况。如需了解详情,请参阅缩减二进制文件大小

本文档简要介绍了如何在您选择的平台上转换run包含 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 文件。如果二进制文件的大小不是很重要,我们建议您将预构建的 AAR 与 MavenCentral 托管的 TensorFlow 操作搭配使用

您可以在 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 操作。

注意:TensorFlow 操作依赖项相对较大,因此您可能需要设置 abiFilters,以滤除 .gradle 文件中不必要的 x86 ABI。

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

这将为 TensorFlow Lite 内置和自定义操作生成 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() 依赖项,并将标准 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 提供夜间预构建的特定 TF 操作 CocoaPods,您可以依赖它以及 TensorFlowLiteSwiftTensorFlowLiteObjC 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 操作的 TensorFlow Lite。首先,按照 iOS 构建说明正确配置 Bazel 工作区和 .bazelrc 文件。

在配置工作区并启用 iOS 支持后,您可以使用以下命令构建选定 TF 操作插件框架,该框架可添加到常规 TensorFlowLiteC.framework 的基础之上。请注意,无法为 i386 架构构建选定 TF 操作框架,因此您需要明确提供除 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。无需明确安装委托实例,其他委托类型通常需要这样做。

注意:此功能自 2.7 版起提供。

Python

包含选定 TensorFlow 操作的 TensorFlow Lite 将通过 TensorFlow pip 软件包自动安装。您也可以选择仅安装 TensorFlow Lite Interpreter pip 软件包

指标

性能

结合使用内置和精选 TensorFlow 操作时,所有相同的 TensorFlow Lite 优化和优化的内置操作都将可用于转换后的模型。

下表介绍了在 Pixel 2 上通过 MobileNet 进行推理所用的平均时间。所列时间为平均 100 次运行。这些目标是使用标志 --config=android_arm64 -c opt 针对 Android 构建的。

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

二进制文件大小

下表介绍了每个 build 的 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) 这些库是针对具有 8 个 TFLite 内置操作和 3 个 TensorFlow 操作的 i3d-kinetics-400 模型选择性构建的。如需了解详情,请参阅缩减 TensorFlow Lite 二进制文件大小部分。

已知限制

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

更新

  • 版本 2.6
    • 改进了对基于 GraphDef 属性的运算符和 HashTable 资源初始化的支持。
  • 版本 2.5
  • 版本 2.4
    • 改进了与硬件加速委托的兼容性