由於 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,您可以與 TensorFlowLiteSwift
或 TensorFlowLiteObjC
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 版
- 已改善與硬體加速委派的相容性