選取 TensorFlow 運算子

由於 TensorFlow Lite 內建運算子程式庫僅支援 TensorFlow 運算子的數量,不一定每個模型都可以轉換。詳情 請參閱運算子相容性

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

本文件將概述轉換和 在本機上執行包含 TensorFlow 運算的 TensorFlow Lite 模型 自訂平台也會討論效能和大小 指標已知限制

轉換模型

以下範例說明如何以特定項目產生 TensorFlow Lite 模型 TensorFlow Ops.

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 Lite 模型,且支援 選擇 TensorFlow 運算,用戶端也必須使用 包括必要的 TensorFlow 運算程式庫

Android 自動套用最佳化建議

如要縮減二進位檔大小,請按照 下一節。如果二進位檔大小不是 有點困難,建議搭配使用預先建構的 AAR 和 TensorFlow 運算 代管於 MavenCentral.

您可以在 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 運算應會自動安裝,以便取得需要的圖形 具體做法是指示 Kubernetes 建立並維護 一或多個代表這些 Pod 的物件

注意:TensorFlow 運算依附元件相對較大, :如何設定 .gradle 檔案中不必要的 x86 ABI 您的 abiFilters

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

這樣系統就會產生以下項目的 AAR 檔案 bazel-bin/tmp/tensorflow-lite.aar: TensorFlow Lite 內建和自訂運算;然後產生 AAR 檔案 bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar 代表 TensorFlow 運算。如果發生以下情況: 沒有有效的建構環境,您也可以使用 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

接著,您應該就能執行任何使用 SELECT_TF_OPS 轉換的模型, iOS 應用程式。舉例來說,您可以修改 圖片分類 iOS 版 應用程式 來測試指定的 TF 運算功能。

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

使用 Bazel + Xcode

使用 Bazel 建構 TensorFlow Lite 搭配特定 iOS 適用的 TensorFlow Ops 檔案, 首先,請按照 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/ 底下的架構 目錄。如要將這個新架構加到 Xcode 專案,請按照下列步驟操作: Xcode 專案內所描述的類似步驟 「設定」部分 iOS 版本指南。

將架構新增至應用程式專案後,會再新增一個連結器標記 必須在應用程式專案中指定,才能強制載入所選的 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 會在 只要連結共用資料庫,就能在執行階段建立解譯器。這項服務 不需要明確安裝委派執行個體。 與其他委派類型搭配使用

注意:這項功能自 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 運算可能不支援整組 常見的輸入/輸出類型

更新

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