選取 TensorFlow 運算子

由於 LiteRT 內建運算子程式庫僅支援部分 TensorFlow 運算子,因此並非所有模型都能轉換。詳情請參閱電信業者相容性

如要允許轉換,使用者可以在 LiteRT 模型中啟用特定 TensorFlow 運算。不過,如要使用 TensorFlow 運算執行 LiteRT 模型,就必須提取核心 TensorFlow 執行階段,這會增加 LiteRT 解譯器二進位檔的大小。在 Android 中,您可以只建構必要的 TensorFlow 作業,避免發生這種情況。詳情請參閱「縮減二進位檔大小」。

本文將說明如何轉換執行含有 TensorFlow 作業的 LiteRT 模型。此外,本文也會討論效能和大小指標,以及已知限制

轉換模型

以下範例說明如何使用選取的 TensorFlow 運算產生 LiteRT 模型。

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.target_spec.supported_ops = [
  tf.lite.OpsSet.TFLITE_BUILTINS, # enable LiteRT ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

執行推論

使用已轉換的 LiteRT 模型時,如果該模型支援選取的 TensorFlow 運算,用戶端也必須使用包含必要 TensorFlow 運算程式庫的 LiteRT 執行階段。

Android AAR

如要縮減二進位檔大小,請按照下一節的說明建構自訂 AAR 檔案。如果二進位檔大小不是主要考量,建議使用預先建構的 AAR,其中包含 MavenCentral 託管的 TensorFlow 作業

您可以在 build.gradle 依附元件中指定這項設定,方法是將其新增至標準 LiteRT AAR,如下所示:

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    // This dependency adds the necessary TF op support.
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly-SNAPSHOT'
}

如要使用每晚快照,請務必新增 Sonatype 快照存放區

加入依附元件後,系統會自動為需要處理圖形 TensorFlow 作業的圖形,安裝必要的委派項目。

注意:TensorFlow 運算依附元件相對較大,因此您可能需要在 .gradle 檔案中設定 abiFilters,以濾除不必要的 x86 ABI。

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

建構 Android AAR

如要縮減二進位檔大小或其他進階用途,您也可以手動建構程式庫。假設您有可用的 LiteRT 建構環境,請使用選取的 TensorFlow 運算子建構 Android AAR,如下所示:

sh tensorflow/lite/tools/build_aar.sh \
  --input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a

這會為 LiteRT 內建和自訂作業產生 AAR 檔案 bazel-bin/tmp/tensorflow-lite.aar,並為 TensorFlow 作業產生 AAR 檔案 bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar。如果沒有可用的建構環境,您也可以使用 Docker 建構上述檔案

接著,您可以直接將 AAR 檔案匯入專案,或將自訂 AAR 檔案發布至本機 Maven 存放區:

mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar
mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite-select-tf-ops -Dversion=0.1.100 -Dpackaging=aar

最後,請在應用程式的 build.gradle 中,確認您有 mavenLocal() 依附元件,並將標準 LiteRT 依附元件替換為支援選取 TensorFlow 運算的依附元件:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        mavenLocal()
    }
}

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.1.100'
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.1.100'
}

iOS

使用 CocoaPods

LiteRT 提供 arm64 的夜間預先建構選取 TF 作業 CocoaPods,您可連同 TensorFlowLiteSwiftTensorFlowLiteObjC CocoaPods 依附元件使用。

注意:如要在 x86_64 模擬器中使用選取的 TF 作業,可以自行建構選取作業架構。詳情請參閱「使用 Bazel + Xcode」一節。

# In your Podfile target:
  pod 'TensorFlowLiteSwift'   # or 'TensorFlowLiteObjC'
  pod 'TensorFlowLiteSelectTfOps', '~> 0.0.1-nightly'

執行 pod install 後,您需要提供額外的連結器標記,強制將所選的 TF 作業架構載入專案。在 Xcode 專案中,依序前往 Build Settings -> Other Linker Flags,然後新增:

適用於 2.9.0 以上版本:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.xcframework/ios-arm64/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

適用於 2.9.0 以下版本:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

然後,您應該就能在 iOS 應用程式中執行以 SELECT_TF_OPS 轉換的任何模型。舉例來說,您可以修改 Image Classification iOS 應用程式,測試選取的 TF 作業功能。

  • 將模型檔案換成啟用 SELECT_TF_OPS 後轉換的檔案。
  • 按照指示將 TensorFlowLiteSelectTfOps 依附元件新增至 Podfile
  • 如上所述,新增其他連接器標記。
  • 執行範例應用程式,確認模型是否正常運作。

使用 Bazel + Xcode

您可以使用 Bazel 建構 LiteRT,並為 iOS 選擇 TensorFlow 運算。首先,請按照 iOS 建構說明,正確設定 Bazel 工作區和 .bazelrc 檔案。

設定工作區並啟用 iOS 支援後,您可以使用下列指令建構所選的 TF 作業外掛程式架構,並在一般 TensorFlowLiteC.framework 上方新增該架構。請注意,選取的 TF 作業架構無法為 i386 架構建構,因此您需要明確提供目標架構清單 (不含 i386)。

bazel build -c opt --config=ios --ios_multi_cpus=arm64,x86_64 \
  //tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework

這會在 bazel-bin/tensorflow/lite/ios/ 目錄下產生架構。您可以按照 iOS 建構指南中「Xcode 專案設定」一節所述的類似步驟,將這個新架構新增至 Xcode 專案。

將架構加入應用程式專案後,您應在應用程式專案中指定額外的連結器標記,強制載入所選 TF 作業架構。在 Xcode 專案中,依序前往 Build Settings -> Other Linker Flags,然後新增:

-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>

C/C++

如果您使用 Bazel 或 CMake 建構 LiteRT 解譯器,可以連結 LiteRT Flex 委派共用程式庫,啟用 Flex 委派。您可以使用下列指令,透過 Bazel 建構這項工具。

bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex

這個指令會在 bazel-bin/tensorflow/lite/delegates/flex 中產生下列共用程式庫。

平台 程式庫名稱
Linux libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
Windows tensorflowlite_flex.dll

請注意,只要連結共用程式庫,在執行階段建立解譯器時,系統就會自動安裝必要的 TfLiteDelegate。您不必明確安裝委派例項,這與其他委派類型通常需要安裝的情況不同。

注意:這項功能適用於 2.7 以上版本。

Python

安裝 TensorFlow pip 套件時,系統會自動安裝 LiteRT 和選取的 TensorFlow 運算。您也可以選擇只安裝 LiteRT Interpreter pip 套件

指標

成效

如果同時使用內建和選取的 TensorFlow 運算,轉換後的模型將可使用所有相同的 LiteRT 最佳化和最佳化內建運算。

下表說明在 Pixel 2 上對 MobileNet 執行推論的平均時間。所列時間是 100 次跑步的平均值。這些目標是使用旗標 --config=android_arm64 -c opt 為 Android 建構。

建構 時間 (毫秒)
僅限內建作業 (TFLITE_BUILTIN) 260.7
僅使用 TF 運算 (SELECT_TF_OPS) 264.5

二進位檔大小

下表說明各個建構版本的 LiteRT 二進位檔大小。這些目標是使用 --config=android_arm -c opt 為 Android 建構。

建構 C++ 二進位檔大小 Android APK 大小
僅限內建作業 796 KB 561 KB
內建運算子 + TF 運算子 23.0 MB 8.0 MB
內建運算子 + TF 運算子 (1) 4.1 MB 1.8 MB

(1) 這些程式庫是為 i3d-kinetics-400 模型選擇性建構,內含 8 個 TFLite 內建作業和 3 個 TensorFlow 作業。詳情請參閱「縮減 LiteRT 二進位檔大小」一節。

已知限制

  • 不支援的類型:某些 TensorFlow 運算子可能不支援 TensorFlow 通常提供的完整輸入/輸出類型。

更新

  • 2.6 版
    • 改善了對以 GraphDef 屬性為基礎的運算子和 HashTable 資源初始化的支援。
  • 2.5 版
    • 您可以套用稱為「訓練後量化」的最佳化技術
  • 2.4 版
    • 改善與硬體加速委派的相容性