由於 LiteRT 內建運算子程式庫僅支援 TensorFlow 運算子的數量,不一定每個模型都可以轉換。詳情 請參閱運算子相容性。
如要允許轉換,使用者可以使用特定 TensorFlow 作業。不過,在 使用 TensorFlow 運算執行 LiteRT 模型時,必須從核心提取資料 TensorFlow 執行階段,這會增加 LiteRT 解譯器二進位檔的大小。 以 Android 來說,您可以選擇只建構必要的 Tensorflow,藉此避免這種情況發生 作業詳情請參閱「減少二進位檔 大小。
本文件將概述轉換和 在本機上執行包含 TensorFlow 運算的 LiteRT 模型 自訂平台也會討論效能和大小 指標和已知限制。
轉換模型
以下範例說明如何透過 TensorFlow 運算
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 運算,用戶端也必須使用 LiteRT 執行階段, 包括必要的 TensorFlow 運算程式庫
Android 自動套用最佳化建議
如要縮減二進位檔大小,請按照 下一節。如果二進位檔大小不是 有點困難,建議搭配使用預先建構的 AAR 和 TensorFlow 運算 代管於 MavenCentral.
您可以在 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 運算,以便取得需要的圖形 具體做法是指示 Kubernetes 建立並維護 一或多個代表這些 Pod 的物件
注意:TensorFlow 運算依附元件相對較大,
:如何設定 .gradle
檔案中不必要的 x86 ABI
您的 abiFilters
。
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
這樣系統就會產生以下項目的 AAR 檔案 bazel-bin/tmp/tensorflow-lite.aar
:
LiteRT 內建和自訂運算;然後產生 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()
並將標準 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 ops CocoaPods。
可依附於 TensorFlowLiteSwift
或
TensorFlowLiteObjC
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 即可建構適用於 iOS 的 TensorFlow Ops 所需的 LiteRT。
首先,請按照 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 建構 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 運算時,系統會自動安裝 LiteRT 及 TensorFlow pip 套件。你可以 也可以選擇只安裝 LiteRT 解譯器管線 套件。
指標
成效
混合使用內建和特定 TensorFlow 運算時 將提供 LiteRT 最佳化和最佳化內建作業 與轉換後的模型搭配使用
下表說明執行推論所需的平均時間
Pixel 2 上的 MobileNet。列出的時間是平均 100 次跑步。這些
而且目標為 Android 專用且使用以下旗標:--config=android_arm64 -c opt
。
建構 | 時間 (毫秒) |
---|---|
僅限內建作業 (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 運算可能不支援整組 常見的輸入/輸出類型
更新
- 2.6 版
- 支援以 GraphDef 為基礎的運算子和 HashTable 資源 改善了初始化功能。
- 2.5 版
- 您可在訓練期間套用最佳化策略,也就是訓練後 量化
- 版本 2.4
- 與硬體加速委派功能的相容性提升