本文件說明如何自行建構 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
檔案的根 tensorflow
儲存庫中選擇介於 _TF_MIN_BAZEL_VERSION
和 _TF_MAX_BAZEL_VERSION
之間的版本。
設定 WORKSPACE 和 .bazelrc
在根 TensorFlow 簽出目錄中執行 ./configure
指令碼,當指令碼詢問您是否希望使用 iOS 支援建構 TensorFlow 時,回答「Yes」。
建構 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
檔案。預設情況下,產生的架構包含一個「fat」二進位檔,其中包含 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 架構
您可以使用選擇性建構來建構較小的架構,僅以一組模型為目標,這將跳過模型集中未使用的運算,並且僅包含執行給定模型集所需的運算核心。指令如下
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
;如果您的模型包含 Select 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
重新開啟產生的工作區 (
<project>.xcworkspace
) 並在 Xcode 內重建您的應用程式。
使用本機 TensorFlow Lite 核心
您可以設定私有 CocoaPods specs 儲存庫,並將您的自訂 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",
],
)
當您建構應用程式專案時,對 TensorFlow Lite 程式庫的任何變更都將被擷取並建置到您的應用程式中。
直接修改 Xcode 專案設定
強烈建議使用 CocoaPods 或 Bazel 將 TensorFlow Lite 相依性新增至您的專案中。如果您仍然希望手動新增 TensorFlowLiteC
架構,您需要將 TensorFlowLiteC
架構作為嵌入式架構新增至您的應用程式專案。解壓縮從上述建構產生的 TensorFlowLiteC_framework.zip
,以取得 TensorFlowLiteC.framework
目錄。此目錄是 Xcode 可以理解的實際架構。
一旦您準備好 TensorFlowLiteC.framework
,首先您需要將其作為嵌入式二進位檔新增至您的應用程式目標。此專案設定區段的確切位置可能會因您的 Xcode 版本而異。
- Xcode 11:前往應用程式目標的專案編輯器中的「General (一般)」標籤,並在「Frameworks, Libraries, and Embedded Content (架構、程式庫和嵌入式內容)」區段下新增
TensorFlowLiteC.framework
。 - Xcode 10 和更早版本:前往應用程式目標的專案編輯器中的「General (一般)」標籤,並在「Embedded Binaries (嵌入式二進位檔)」下新增
TensorFlowLiteC.framework
。架構也應自動新增至「Linked Frameworks and Libraries (連結的架構和程式庫)」區段下。
當您將架構新增為嵌入式二進位檔時,Xcode 也會更新「Build Settings (建置設定)」標籤下的「Framework Search Paths (架構搜尋路徑)」項目,以包含您的架構的父目錄。如果沒有自動發生這種情況,您應該手動新增 TensorFlowLiteC.framework
目錄的父目錄。
完成這兩個設定後,您應該能夠匯入並呼叫 TensorFlow Lite 的 C API,這些 API 由 TensorFlowLiteC.framework/Headers
目錄下的標頭檔定義。