本文件說明如何自行建構 TensorFlow Lite iOS 程式庫。 一般來說,您不需要在本機建構 TensorFlow Lite iOS 程式庫,如果您只想使用,最簡單的方法是使用 TensorFlow Lite CocoaPods 預先建構的穩定版本或每晚發布的版本。如要進一步瞭解如何在 iOS 專案中使用 iOS 專案,請參閱 iOS 快速入門導覽課程。
在本機建構
在某些情況下,您可能想要使用 TensorFlow Lite 的本機版本,例如,當您想在本機對 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 時回答「是」。
建構 TensorFlowLiteC 動態架構 (建議)
透過 iOS 支援功能正確設定 Bazel 後,即可使用下列指令建構 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"
此為確保建構 Swift 或 Objective-C API 時,使用的是TensorFlowLiteC
API (太平洋時間凌晨 1 點到 4 點之間每天建構) 的穩定版,而不是與本地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 規格存放區,並將自訂 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:前往應用程式目標專案編輯器的「一般」分頁,然後在「Frameworks、Library 和嵌入的內容」區段下方新增
TensorFlowLiteC.framework
。 - Xcode 10 以下版本:前往應用程式目標專案編輯器的「General」分頁,然後在「Embedded Binaries」下方新增
TensorFlowLiteC.framework
。我們也應自動在「已連結的架構和程式庫」區段下方新增架構。
將架構新增為嵌入式二進位檔時,Xcode 也會更新「Build Settings」分頁下的「Framework Search Paths」項目,加入架構的父項目錄。如果這項作業不會自動執行,建議您手動新增 TensorFlowLiteC.framework
目錄的父項目錄。
完成這兩項設定後,應該就能匯入並呼叫 TensorFlow Lite 的 C API (由 TensorFlowLiteC.framework/Headers
目錄下的標頭檔案定義)。