除了原生 API 外,您也可以使用 Java API 存取 Google Play 服務中的 LiteRT。尤其是 Google Play 的 LiteRT 這些服務可透過 LiteRT 轉譯器使用 API。
使用轉譯器 API
LiteRT Translateer API 是由 TensorFlow 執行階段提供 提供的是一般用途的介面,可用來建構及執行機器學習模型。使用 請按照下列步驟,使用 TensorFlow 將 解譯 er API 執行推論 Google Play 服務執行階段的 Lite。
1. 新增專案依附元件
在應用程式專案程式碼中加入下列依附元件,即可存取 Google Play Services API for LiteRT:
dependencies {
...
// LiteRT dependencies for Google Play services
implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
// Optional: include LiteRT Support Library
implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}
2. 新增 LiteRT 初始化
初始化 Google Play 服務 API 的 LiteRT 元件 ,再使用 LiteRT API:
Kotlin
val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }
Java
Task<Void> initializeTask = TfLite.initialize(context);
3. 建立解譯器並設定執行階段選項
使用 InterpreterApi.create()
建立及設定解譯器
呼叫 InterpreterApi.Options.setRuntime()
來啟用 Google Play 服務執行階段
如以下範例程式碼所示:
Kotlin
import org.tensorflow.lite.InterpreterApi import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime ... private lateinit var interpreter: InterpreterApi ... initializeTask.addOnSuccessListener { val interpreterOption = InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) interpreter = InterpreterApi.create( modelBuffer, interpreterOption )} .addOnFailureListener { e -> Log.e("Interpreter", "Cannot initialize interpreter", e) }
Java
import org.tensorflow.lite.InterpreterApi import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime ... private InterpreterApi interpreter; ... initializeTask.addOnSuccessListener(a -> { interpreter = InterpreterApi.create(modelBuffer, new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)); }) .addOnFailureListener(e -> { Log.e("Interpreter", String.format("Cannot initialize interpreter: %s", e.getMessage())); });
您應使用上述實作方式,因為這可避免封鎖 Android 使用者介面執行緒。如果您需要更緊密管理執行緒執行作業,
可以新增 Tasks.await()
呼叫以建立翻譯器:
Kotlin
import androidx.lifecycle.lifecycleScope ... lifecycleScope.launchWhenStarted { // uses coroutine initializeTask.await() }
Java
@BackgroundThread InterpreterApi initializeInterpreter() { Tasks.await(initializeTask); return InterpreterApi.create(...); }
4. 執行推論
使用您建立的 interpreter
物件,呼叫 run()
方法來產生推論。
Kotlin
interpreter.run(inputBuffer, outputBuffer)
Java
interpreter.run(inputBuffer, outputBuffer);
硬體加速
LiteRT 可讓您使用 特殊硬體處理器,例如圖形處理器 (GPU)。個人中心 透過名為 「委派代表」。
GPU 委派程式會透過 Google Play 服務提供,並以動態方式載入,就像 Interpreter API 的 Play 服務版本一樣。
正在檢查裝置相容性
並非所有裝置都支援 TFLite 的 GPU 硬體加速。為了減少錯誤和潛在的當機情形,請使用 TfLiteGpu.isGpuDelegateAvailable
方法,檢查裝置是否與 GPU 委派程式相容。
使用這個方法確認裝置是否與 GPU 相容,且會使用 CPU 做為不支援 GPU 時的備用方案
useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)
有了 useGpuTask
等變數後,您就能用它來判斷是否
裝置會使用 GPU 委派功能。
Kotlin
val interpreterTask = useGpuTask.continueWith { task -> val interpreterOptions = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) if (task.result) { interpreterOptions.addDelegateFactory(GpuDelegateFactory()) } InterpreterApi.create(FileUtil.loadMappedFile(context, MODEL_PATH), interpreterOptions) }
Java
Task<InterpreterApi.Options> interpreterOptionsTask = useGpuTask.continueWith({ task -> InterpreterApi.Options options = new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY); if (task.getResult()) { options.addDelegateFactory(new GpuDelegateFactory()); } return options; });
GPU 搭配解譯器 API
如要搭配 Interpreter API 使用 GPU 委派作業:
更新專案依附元件,以便使用 Play 服務的 GPU 委派作業:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
在 TFlite 初始化中啟用 GPU 委派作業選項:
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Java
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
在轉譯器選項中啟用 GPU 委派作業:呼叫
addDelegateFactory() within
InterpreterApi.Options() 時,將委派作業工廠設為 GpuDelegateFactory:Kotlin
val interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(GpuDelegateFactory())
Java
Options interpreterOption = InterpreterApi.Options() .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) .addDelegateFactory(new GpuDelegateFactory());
從獨立 LiteRT 遷移
如果您打算將應用程式從獨立的 LiteRT 遷移至 Play 服務 API,請參閱以下其他指南,瞭解如何更新應用程式專案程式碼:
- 請參閱本頁的「限制」一節,確認您的用途是否受支援。
- 更新程式碼之前,請進行效能和正確性檢查 特別是使用舊版 LiteRT 因此,您還有基準可以用於與新版 。
- 如果您已將所有程式碼遷移至使用 LiteRT 的 Play 服務 API,請從 build.gradle 檔案中移除現有的 LiteRT 執行階段程式庫依附元件 (含有
org.tensorflow:tensorflow-lite:*
的項目),以便縮減應用程式大小。 - 找出程式碼中所有出現的
new Interpreter
物件建立作業。 並修改每個元素,使其使用 TranslateerApi.create() 呼叫。 新的 TfLite.initialize 會以非同步的方式執行,因此在多數情況下 插電式替換:必須在呼叫時, 完成。請參考步驟 3 中的程式碼片段。 - 使用
org.tensorflow.lite.Interpreter
或org.tensorflow.lite.InterpreterApi
類別,將import org.tensorflow.lite.InterpreterApi;
和import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
新增至任何來源檔案。 - 如果對
InterpreterApi.create()
的任何呼叫結果只有一個引數,請將new InterpreterApi.Options()
附加至引數清單。 - 將
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
附加至最後一個引數 任何對InterpreterApi.create()
的呼叫。 - 取代所有其他的
org.tensorflow.lite.Interpreter
類別org.tensorflow.lite.InterpreterApi
。
如要使用獨立的 LiteRT 和 Play 服務 API 並排顯示時,您必須使用 LiteRT 2.9 以上版本。LiteRT 2.8 和較舊版本與 Play 服務 API 版本不相容。