选择 TensorFlow 运算符

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

若要允许转换,用户可以启用特定 TensorFlow 功能 操作。但是,运行 包含 TensorFlow 运算的 LiteRT 模型需要提取核心 TensorFlow 运行时,这会增加 LiteRT 解释器二进制文件的大小。 对于 Android,您可以选择性地只构建所需的 TensorFlow 来避免这种情况 操作。如需了解详情,请参阅减少二进制文件 尺寸

本文概述了如何转换运行一个包含 TensorFlow 操作的 LiteRT 模型, 您选择的平台还讨论了性能和大小 指标已知限制

转换模型

以下示例展示了如何使用 select 方法生成 LiteRT 模型 TensorFlow 运算。

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)

运行推断

如果使用的 LiteRT 模型已经过转换,且支持 选择 TensorFlow 操作,客户端还必须使用 包含必要的 TensorFlow 操作库。

Android AAR

如需缩减二进制文件的大小,请按照指南中的说明构建您自己的自定义 AAR 文件 下一部分。如果二进制文件大小不是 我们建议您将预构建的 AAR 与 TensorFlow 运算结合使用 举办地点 MavenCentral.

您可以在 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 运算依赖项相对较大,因此您可能需要 如果您想过滤掉 .gradle 文件中不必要的 x86 ABI 您的abiFilters

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

这将为以下文件生成 AAR 文件 bazel-bin/tmp/tensorflow-lite.aar: LiteRT 内置和自定义操作;并生成 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() 依赖项,并将标准 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 Ops 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

然后,您应该能够运行使用 SELECT_TF_OPS 。例如,您可以修改 iOS 图片分类 应用 测试选择 TF 操作功能。

  • 将模型文件替换为在启用 SELECT_TF_OPS 的情况下转换后的模型文件。
  • 按照说明将 TensorFlowLiteSelectTfOps 依赖项添加到 Podfile
  • 添加如上所示的额外链接器标记。
  • 运行示例应用,看看模型是否正常运行。

使用 Bazel + Xcode

您可以使用 Bazel 构建包含选定适用于 iOS 的 TensorFlow 操作的 LiteRT。 首先,请按照 iOS build 说明配置您的 Bazel 工作区和 .bazelrc 文件正确无误。

在配置已启用 iOS 支持的工作区后,您可以使用 来创建 Select TF ops 插件框架,该框架可添加到 TensorFlowLiteC.framework 的基础。请注意 框架无法针对 i386 架构构建,因此您需要明确 提供除 i386 以外的目标架构列表。

bazel build -c opt --config=ios --ios_multi_cpus=arm64,x86_64 \
  //tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework

这将在 bazel-bin/tensorflow/lite/ios/ 下生成框架 目录。您可以将这个新框架添加到 Xcode 项目中,具体操作步骤如下 Xcode 项目 设置部分(位于 iOS 制作指南。

将框架添加到应用项目后,一个额外的链接器标记 应在应用项目中指定,以强制加载选定的 TF 操作 框架。在您的 Xcode 项目中,转到 Build Settings ->Other Linker Flags,然后添加:

-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>

C/C++

如果您使用 Bazel 或 CMake 构建 LiteRT 解释器,您可以通过将 LiteRT 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 操作的 LiteRT 将使用 TensorFlow pip 软件包。您可以 也可以选择只安装 LiteRT Interpreter pip 软件包

指标

性能

结合使用内置和精选 TensorFlow 运算时, 将提供 LiteRT 优化和优化的内置操作 可用于转换后的模型。

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

构建 时间(毫秒)
仅内置操作 (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 <ph type="x-smartling-placeholder">
      </ph>
    • 支持基于 GraphDef 属性的运算符和 HashTable 资源 初始化功能已得到改进。
  • 版本 2.5 <ph type="x-smartling-placeholder">
  • 版本 2.4 <ph type="x-smartling-placeholder">
      </ph>
    • 改进了与硬件加速委托的兼容性