建構適用於 iOS 的 TensorFlow Lite

本文件說明如何自行建構 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 時回答「是」。

透過 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。不應由使用者直接使用。

開發人員應根據應用程式編寫的語言選擇 TensorFlowLiteSwiftTensorFlowLiteObjC Pod,但不要兩者並用。使用 TensorFlow Lite 本機版本的確切步驟會因您要建構的確切部分而有所不同。

使用本機 Swift 或 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"
    此為確保建構 Swift 或 Objective-C API 時,使用的是 TensorFlowLiteC API (太平洋時間凌晨 1 點到 4 點之間每天建構) 的穩定版,而不是與本地 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 架構新增為應用程式專案的嵌入式架構。將上述版本產生的 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 目錄下的標頭檔案定義)。