构建适用于 iOS 的 LiteRT

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

在本地构建

在某些情况下,您可能希望使用 LiteRT 的本地 build, 如果您想对 LiteRT 进行本地更改并测试这些更改, 更改 iOS 应用,或者您更喜欢使用静态框架,而不是我们提供的 动态生成的。如需在本地为 LiteRT 创建通用的 iOS 框架,请执行以下操作: 您需要在 macOS 机器上使用 Bazel 来构建。

安装 Xcode

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

xcode-select --install

如果是首次安装,您将需要接受所有版本的许可协议 users:

sudo xcodebuild -license accept

安装 Bazel

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

配置 WORKSPACE 和 .bazelrc

在 TensorFlow 检出根目录下运行 ./configure 脚本,以及 回答“是”当脚本询问您是否要构建适用于 iOS 的 TensorFlow 时, 联系。

使用 iOS 支持正确配置 Bazel 后,您就可以 TensorFlowLiteC 框架。

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

此命令将在TensorFlowLiteC_framework.zip bazel-bin/tensorflow/lite/ios/ 目录中。 默认情况下,生成的框架包含一个“fat”包含 armv7 的二进制文件 arm64 和 x86_64(但不包含 i386)。如需查看在构建容器时所使用的构建标记的完整列表, 您指定了 --config=ios_fat,请参阅 .bazelrc 文件

构建 TensorFlowLiteC 静态框架

默认情况下,我们只通过 CocoaPods 分发动态框架。如果您想 若要改用静态框架,您可以构建 TensorFlowLiteC 静态 框架:

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

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

有选择地构建 TFLite 框架

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

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

上述命令会生成静态框架 bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip(适用于 TensorFlow) 精简版内置和自定义操作;并视需要生成静态框架 bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip(如果 您的模型包含选择 TensorFlow 操作。请注意,--target_archs 标志 可用于指定您的部署架构。

在您自己的应用中使用

CocoaPods 开发者

有三个适用于 LiteRT 的 CocoaPods:

  • TensorFlowLiteSwift:提供 Swift API for LiteRT。
  • TensorFlowLiteObjC:提供用于 LiteRT 的 Objective-C API。
  • TensorFlowLiteC:通用基础 Pod,其中嵌入了 LiteRT 核心 运行时,并公开上述两个 Pod 使用的基础 C API。不适合 供用户直接使用

作为开发者,您应选择 TensorFlowLiteSwiftTensorFlowLiteObjC 个 Pod,但 而不是两者。使用 LiteRT 本地 build 的具体步骤有所不同, 具体取决于您要构建的具体部分。

使用本地 Swift 或 Objective-C API

如果您使用的是 CocoaPods,并且只想测试 LiteRT 的 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" 这是为了确保您构建的 Swift API 或 Objective-C API 针对最新的每夜版 TensorFlowLiteC API (美国太平洋时间每晚凌晨 1 点到 4 点之间构建),而不是使用 版本,与您当地的 tensorflow 结账方式相比,此版本可能已过时。 或者,您也可以选择使用 TensorFlowLiteC 并使用该版本(请参阅使用本地 LiteRT 核心部分)。

  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),然后重新构建 。

使用本地 LiteRT 核心

您可以设置一个私有 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 作为主构建工具,则只需添加 TensorFlowLite 依赖项添加到您的 BUILD 文件中的目标。

对于 Swift:

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

对于 Objective-C:

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

在构建应用项目时,对 LiteRT 库所做的任何更改都会 并将其内置到您的应用中

直接修改 Xcode 项目设置

强烈建议使用 CocoaPods 或 Bazel 来添加 LiteRT 依赖项如果您仍想添加TensorFlowLiteC 框架,您需要将 TensorFlowLiteC 框架添加为 添加到应用项目中。解压缩 从上述 build 生成的 TensorFlowLiteC_framework.zip,以获取 TensorFlowLiteC.framework 目录中。此目录是实际的框架 Xcode 可以理解的代码类型

准备好 TensorFlowLiteC.framework 后,首先需要添加它 以嵌入式二进制文件的形式上传到应用目标中。“项目设置”部分 具体取决于 Xcode 版本。

  • Xcode 11:转到“General”(常规)项目编辑器的标签页, 在“Frameworks, Libraries andTensorFlowLiteC.framework “嵌入式内容”部分。
  • Xcode 10 及更低版本:前往“General”项目编辑器的标签页 应用目标,然后在“Embedded”下添加 TensorFlowLiteC.framework Binaries”。该框架也应自动添加到“已关联”下 框架和库的部分。

当您将框架添加为嵌入式二进制文件时,Xcode 还会更新 “框架搜索路径”“Build Settings”(构建设置)下的条目以包含父级 目录。如果此操作不会自动执行 应手动添加 TensorFlowLiteC.framework 的父级目录, 目录。

完成这两项设置后,您应该就可以导入并调用 LiteRT 的 C API,由 TensorFlowLiteC.framework/Headers 目录中。