为 iOS 构建 TensorFlow Lite

本文档介绍如何在您自己的机器上构建 TensorFlow Lite iOS 库。通常,您不需要本地构建 TensorFlow Lite iOS 库。如果您只想使用它,最简单的方法是使用 TensorFlow Lite CocoaPods 的预构建稳定版或夜间版。有关如何在 iOS 项目中使用它们的更多详细信息,请参阅 iOS 快速入门

本地构建

在某些情况下,您可能希望使用 TensorFlow Lite 的本地构建,例如,当您想要对 TensorFlow Lite 进行本地更改并在 iOS 应用程序中测试这些更改时,或者您更喜欢使用静态框架而不是我们提供的动态框架。要本地为 TensorFlow Lite 创建一个通用的 iOS 框架,您需要使用 Bazel 在 macOS 机器上构建它。

安装 Xcode

如果您还没有,您需要安装 Xcode 8 或更高版本,并使用 xcode-select 安装工具

xcode-select --install

如果这是新安装,您需要使用以下命令接受所有用户的许可协议

sudo xcodebuild -license accept

安装 Bazel

Bazel 是 TensorFlow 的主要构建系统。按照 Bazel 网站上的说明 安装 Bazel。确保选择 configure.py 文件_TF_MIN_BAZEL_VERSION_TF_MAX_BAZEL_VERSION 之间的版本,该文件位于 tensorflow 存储库的根目录下。

配置 WORKSPACE 和 .bazelrc

在 TensorFlow 根检出目录中运行 ./configure 脚本,并在脚本询问您是否希望使用 iOS 支持构建 TensorFlow 时回答“是”。

Bazel 正确配置了 iOS 支持后,您可以使用以下命令构建 TensorFlowLiteC 框架。

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_framework

此命令将在 TensorFlow 根目录下的 bazel-bin/tensorflow/lite/ios/ 目录下生成 TensorFlowLiteC_framework.zip 文件。默认情况下,生成的框架包含一个“胖”二进制文件,其中包含 armv7、arm64 和 x86_64(但不包含 i386)。要查看在指定 --config=ios_fat 时使用的完整构建标志列表,请参阅 .bazelrc 文件 中的 iOS 配置部分。

构建 TensorFlowLiteC 静态框架

默认情况下,我们只通过 Cocoapods 分发动态框架。如果您想使用静态框架,您可以使用以下命令构建 TensorFlowLiteC 静态框架

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_static_framework

该命令将在 TensorFlow 根目录下的 bazel-bin/tensorflow/lite/ios/ 目录下生成一个名为 TensorFlowLiteC_static_framework.zip 的文件。此静态框架的使用方式与动态框架完全相同。

选择性构建 TFLite 框架

您可以使用选择性构建来构建针对特定模型集的较小框架,这将跳过模型集中未使用的操作,并且只包含运行给定模型集所需的 op 内核。命令如下

bash tensorflow/lite/ios/build_frameworks.sh \
  --input_models=model1.tflite,model2.tflite \
  --target_archs=x86_64,armv7,arm64

上面的命令将为 TensorFlow Lite 内置和自定义操作生成静态框架 bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip;如果您的模型包含选择 TensorFlow 操作,则可以选择生成静态框架 bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip。请注意,可以使用 --target_archs 标志指定您的部署架构。

在您自己的应用程序中使用

CocoaPods 开发人员

TensorFlow Lite 有三个 CocoaPods

  • TensorFlowLiteSwift:提供 TensorFlow Lite 的 Swift API。
  • TensorFlowLiteObjC:提供 TensorFlow Lite 的 Objective-C API。
  • TensorFlowLiteC:通用基础 pod,它嵌入 TensorFlow Lite 核心运行时并公开上述两个 pod 使用的 C 基础 API。不建议用户直接使用。

作为开发人员,您应该根据应用程序的编写语言选择 TensorFlowLiteSwiftTensorFlowLiteObjC pod,但不能同时选择两者。使用 TensorFlow Lite 本地构建的具体步骤会有所不同,具体取决于您要构建的具体部分。

使用本地 Swift 或 Objective-C API

如果您使用的是 CocoaPods,并且只想测试对 TensorFlow Lite 的 Swift APIObjective-C API 的一些本地更改,请按照以下步骤操作。

  1. 在您的 tensorflow 检出中更改 Swift 或 Objective-C API。

  2. 打开 TensorFlowLite(Swift|ObjC).podspec 文件,并更新此行
    s.dependency 'TensorFlowLiteC', "#{s.version}"

    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    这样做是为了确保您正在针对 TensorFlowLiteC API 的最新可用夜间版本(每天晚上 1-4 点太平洋时间构建)构建 Swift 或 Objective-C API,而不是稳定版本,稳定版本可能与您本地的 tensorflow 检出相比已过时。或者,您可以选择发布您自己的 TensorFlowLiteC 版本并使用该版本(请参阅下面的 使用本地 TensorFlow Lite 核心 部分)。

  3. 在 iOS 项目的 Podfile 中,将依赖项更改为如下所示,以指向您 tensorflow 根目录的本地路径。
    对于 Swift
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    对于 Objective-C
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. 从 iOS 项目根目录更新您的 pod 安装。
    $ pod update

  5. 重新打开生成的 workspace (<project>.xcworkspace) 并在 Xcode 中重建您的应用程序。

使用本地 TensorFlow Lite 核心

您可以设置一个私有 CocoaPods 规范存储库,并将您自定义的 TensorFlowLiteC 框架发布到您的私有存储库。您可以复制此 podspec 文件 并修改几个值

  ...
  s.version      = <your_desired_version_tag>
  ...
  # Note the `///`, two from the `file://` and one from the `/path`.
  s.source       = { :http => "file:///path/to/TensorFlowLiteC_framework.zip" }
  ...
  s.vendored_frameworks = 'TensorFlowLiteC.framework'
  ...

创建您自己的 TensorFlowLiteC.podspec 文件后,您可以按照 使用私有 CocoaPods 的说明 在您自己的项目中使用它。您还可以修改 TensorFlowLite(Swift|ObjC).podspec 以指向您自定义的 TensorFlowLiteC pod,并在您的应用程序项目中使用 Swift 或 Objective-C pod。

Bazel 开发人员

如果您使用 Bazel 作为主要构建工具,则只需在 BUILD 文件中将 TensorFlowLite 依赖项添加到您的目标中即可。

对于 Swift

swift_library(
  deps = [
      "//tensorflow/lite/swift:TensorFlowLite",
  ],
)

对于 Objective-C

objc_library(
  deps = [
      "//tensorflow/lite/objc:TensorFlowLite",
  ],
)

构建应用程序项目时,对 TensorFlow Lite 库的任何更改都将被提取并构建到您的应用程序中。

直接修改 Xcode 项目设置

强烈建议您使用 CocoaPods 或 Bazel 将 TensorFlow Lite 依赖项添加到您的项目中。如果您仍然希望手动添加 TensorFlowLiteC 框架,则需要将 TensorFlowLiteC 框架作为嵌入式框架添加到您的应用程序项目中。解压缩从上述构建生成的 TensorFlowLiteC_framework.zip 以获取 TensorFlowLiteC.framework 目录。此目录是 Xcode 可以理解的实际框架。

准备 TensorFlowLiteC.framework 后,首先需要将其作为嵌入式二进制文件添加到您的应用程序目标中。此操作的具体项目设置部分可能会因 Xcode 版本而异。

  • Xcode 11:转到应用程序目标的项目编辑器的“常规”选项卡,并在“框架、库和嵌入式内容”部分下添加 TensorFlowLiteC.framework
  • Xcode 10 及更低版本:转到应用程序目标的项目编辑器的“常规”选项卡,并在“嵌入式二进制文件”下添加 TensorFlowLiteC.framework。框架还应自动添加到“链接的框架和库”部分下。

将框架添加为嵌入式二进制文件后,Xcode 还将更新“构建设置”选项卡下的“框架搜索路径”条目,以包含框架的父目录。如果未自动发生,则应手动添加 TensorFlowLiteC.framework 目录的父目录。

完成这两个设置后,您应该能够导入并调用 TensorFlow Lite 的 C API,该 API 由 TensorFlowLiteC.framework/Headers 目录下的头文件定义。