本文档介绍如何在您自己的机器上构建 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 时回答“是”。
构建 TensorFlowLiteC 动态框架(推荐)
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。不建议用户直接使用。
作为开发人员,您应该根据应用程序的编写语言选择 TensorFlowLiteSwift
或 TensorFlowLiteObjC
pod,但不能同时选择两者。使用 TensorFlow Lite 本地构建的具体步骤会有所不同,具体取决于您要构建的具体部分。
使用本地 Swift 或 Objective-C API
如果您使用的是 CocoaPods,并且只想测试对 TensorFlow Lite 的 Swift API 或 Objective-C API 的一些本地更改,请按照以下步骤操作。
在您的
tensorflow
检出中更改 Swift 或 Objective-C API。打开
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 核心 部分)。在 iOS 项目的
Podfile
中,将依赖项更改为如下所示,以指向您tensorflow
根目录的本地路径。
对于 Swift
pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
对于 Objective-C
pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'
从 iOS 项目根目录更新您的 pod 安装。
$ pod update
重新打开生成的 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
目录下的头文件定义。