選擇 TensorFlow 運算子

由於 TensorFlow Lite 內建運算子程式庫僅支援有限數量的 TensorFlow 運算子,並非所有模型都可轉換。如需詳細資訊,請參閱運算子相容性

為了允許轉換,使用者可以在其 TensorFlow Lite 模型中啟用特定 TensorFlow 運算元的用法。但是,使用 TensorFlow 運算元執行 TensorFlow Lite 模型需要提取核心 TensorFlow 執行階段,這會增加 TensorFlow Lite 直譯器二進位檔大小。針對 Android,您可以透過選擇性地僅建構必要的 Tensorflow 運算元來避免這種情況。如需詳細資訊,請參閱縮減二進位檔大小

本文件概述如何在您選擇的平台上轉換執行包含 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 上託管的預先建構 AAR 與 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 運算元。

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 運算元 CocoaPods,您可以與 TensorFlowLiteSwiftTensorFlowLiteObjC CocoaPods 一起依賴這些運算元。

# 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 轉換的模型。例如,您可以修改「圖片分類 iOS 應用程式」來測試選定 TF 運算元功能。

  • 將模型檔案取代為已啟用 SELECT_TF_OPS 轉換的模型檔案。
  • 按照指示將 TensorFlowLiteSelectTfOps 相依性新增至 Podfile
  • 如上所述新增額外的連結器旗標。
  • 執行範例應用程式,並查看模型是否正常運作。

使用 Bazel + Xcode

適用於 iOS 的 TensorFlow Lite 與選定 TensorFlow 運算元可以使用 Bazel 建構。首先,請按照 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 建構 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。不需要像其他委派類型通常需要的那樣明確安裝委派執行個體。

Python

具有選定 TensorFlow 運算元的 TensorFlow Lite 將會與 TensorFlow pip 套件一起自動安裝。您也可以選擇僅安裝 TensorFlow Lite Interpreter 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 版
    • 已改善與硬體加速委派的相容性