選取 TensorFlow 運算子

由於 TensorFlow Lite 內建運算子程式庫僅支援少數的 TensorFlow 運算子,因此並非所有模型都能轉換。詳情請參閱「運算子相容性」。

如要允許轉換,使用者可以在 TensorFlow Lite 模型中啟用特定 TensorFlow 運算。不過,使用 TensorFlow 運算執行 TensorFlow Lite 模型時,需要在核心 TensorFlow 執行階段中提取,藉此增加 TensorFlow Lite 解譯器二進位檔的大小。以 Android 來說,您可以只建構必要的 Tensorflow 運算,藉此避免這種情況。詳情請參閱「減少二進位檔大小」。

本文件概述如何在您選擇的平台上轉換run包含 TensorFlow 運算的 TensorFlow Lite 模型。另探討效能和大小指標以及已知限制

轉換模型

以下範例說明如何使用特定 TensorFlow 運算產生 TensorFlow Lite 模型。

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 TensorFlow Lite ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

執行推論

使用支援特定 TensorFlow 運算且經過轉換的 TensorFlow Lite 模型時,用戶端也必須使用包含所需 TensorFlow 運算程式庫的 TensorFlow Lite 執行階段。

Android 自動套用最佳化建議

如要縮減二進位檔大小,請按照下一節的說明建構自己的自訂 AAR 檔案。如果二進位檔大小不值得考量,建議您使用預先建構的 AAR 搭配在 MavenCentral 託管的 TensorFlow 運算

您可以在 build.gradle 依附元件中,將該依附元件與標準 TensorFlow Lite 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 運算依附元件相對較大,建議您設定 abiFilters,藉此篩除 .gradle 檔案中不必要的 x86 ABI。

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

建構 Android AAR

如要縮減二進位檔大小或其他進階情況,您也可以手動建構程式庫。假設正常運作的 TensorFlow Lite 建構環境,請使用特定 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

這會為 TensorFlow Lite 內建和自訂運算產生 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() 依附元件,並將標準 TensorFlow Lite 依附元件替換為支援特定 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

TensorFlow Lite 提供 arm64 適用的夜間預先建構精選 TF Ops 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 Ops 架構載入專案。在 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 轉換的模型。舉例來說,您可以修改圖片分類 iOS 應用程式,測試特定 TF 運算功能。

  • 以已啟用 SELECT_TF_OPS 的轉換取代模型檔案。
  • 按照指示將 TensorFlowLiteSelectTfOps 依附元件新增至 Podfile
  • 按照上述方式新增其他連結器旗標。
  • 執行範例應用程式,看看模型是否正常運作。

使用 Bazel + Xcode

使用 Bazel 建構 TensorFlow Lite 搭配特定 iOS 適用的 TensorFlow Ops 檔案,首先,請按照 iOS 建構操作說明,正確設定 Bazel 工作區和 .bazelrc 檔案。

設定啟用 iOS 支援的工作區後,您可以使用以下指令建構選定的 TF 運算外掛程式架構,該架構可新增至一般 TensorFlowLiteC.framework 之上。請注意,無法針對 i386 架構建構所選的 TF Ops 架構,因此您必須明確提供不含 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 Ops 架構。在 Xcode 專案中,前往 Build Settings -> Other Linker Flags,然後新增:

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

C/C++

如果您是使用 Bazel 或 CMake 建構 TensorFlow Lite 解譯器,可以連結 TensorFlow Lite 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 運算方式的 TensorFlow Lite 會自動使用 TensorFlow pip 套件安裝。您也可以選擇只安裝 TensorFlow Lite 解譯器 pip 套件

指標

效能

混合使用內建和特定 TensorFlow 運算時,即可在轉換後的模型中使用相同的 TensorFlow Lite 最佳化和最佳化內建運算。

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

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

二進位檔大小

下表說明每個建構作業的 TensorFlow Lite 二進位檔大小。這些目標適用於使用 --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 運算。詳情請參閱「縮減 TensorFlow Lite 二進位檔大小」一節。

已知限制

  • 不支援的類型:某些 TensorFlow 作業可能不支援 TensorFlow 一般可用的整組輸入/輸出類型。

更新

  • 2.6 版
    • 改善了以 GraphDef 屬性為基礎的運算子和 HashTable 資源初始化。
  • 2.5 版
  • 2.4 版
    • 與硬體加速委派功能的相容性提升