构建适用于 iOS 的 TensorFlow Lite

本文档介绍了如何自行构建 TensorFlow Lite iOS 库。通常,您无需在本地构建 TensorFlow Lite iOS 库。如果您只是想使用它,最简单的方法是使用预构建的稳定版或每夜版 TensorFlow Lite CocoaPods。请参阅 iOS 快速入门,详细了解如何在 iOS 项目中使用这些 API。

在本地构建

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

安装 Xcode

如果您尚未安装 Xcode 8 或更高版本以及使用 xcode-select 的工具,则需要安装:

xcode-select --install

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

sudo xcodebuild -license accept

安装 Bazel

Bazel 是 TensorFlow 的主要构建系统。按照 Bazel 网站上的说明安装 Bazel。请务必在 tensorflow 代码库根目录下的 configure.py 文件中选择 _TF_MIN_BAZEL_VERSION_TF_MAX_BAZEL_VERSION 之间的版本。

配置 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 文件。默认情况下,生成的框架包含一个“fat”二进制文件,其中包含 armv7、arm64 和 x86_64(但不包含 i386)。如需查看指定 --config=ios_fat 时使用的 build 标志的完整列表,请参阅 .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 框架

您可以使用选择性构建,仅针对一组模型构建较小的框架,这会跳过模型集中未使用的操作,仅包含运行给定的一组模型所需的操作内核。命令如下所示:

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 的本地 build 的具体步骤因您要构建的确切部分而异。

使用本地 Swift API 或 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. 重新打开生成的工作区 (<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 框架作为嵌入式框架添加到您的应用项目中。解压缩在上述 build 中生成的 TensorFlowLiteC_framework.zip 以获取 TensorFlowLiteC.framework 目录。此目录是 Xcode 可以理解的实际框架。

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

  • Xcode 11:前往应用目标的项目编辑器的“General”标签页,然后在“Frameworks, Libraries, and Embedded Content”部分下添加 TensorFlowLiteC.framework
  • Xcode 10 及更低版本:转到应用目标的项目编辑器的“常规”标签页,然后在“嵌入式二进制文件”下添加 TensorFlowLiteC.framework。系统也应在“关联的框架和库”部分下自动添加该框架。

当您将框架添加为嵌入式二进制文件时,Xcode 还会更新“Build Settings”(构建设置)标签页下的“Framework Search Paths”条目,以包含框架的父级目录。如果此操作没有自动完成,您应手动添加 TensorFlowLiteC.framework 目录的父目录。

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