Bạn cũng có thể truy cập LiteRT trong Dịch vụ Google Play bằng cách sử dụng API Java. API này có thể được dùng trong mã Java hoặc Kotlin, ngoài Native API. Cụ thể, LiteRT trong các dịch vụ Google Play có sẵn thông qua API Trình thông dịch LiteRT.
Sử dụng Interpreter API
API Trình thông dịch LiteRT do thời gian chạy TensorFlow cung cấp, cung cấp một giao diện đa năng để tạo và chạy các mô hình học máy. Hãy làm theo các bước sau để chạy các suy luận bằng Interpreter API bằng cách sử dụng thời gian chạy TensorFlow Lite trong Dịch vụ Google Play.
1. Thêm phần phụ thuộc của dự án
Thêm các phần phụ thuộc sau vào mã dự án ứng dụng để truy cập vào API Dịch vụ Play cho LiteRT:
dependencies {
...
// LiteRT dependencies for Google Play services
implementation 'com.google.android.gms:play-services-tflite-java:16.1.0'
// Optional: include LiteRT Support Library
implementation 'com.google.android.gms:play-services-tflite-support:16.1.0'
...
}
2. Thêm quá trình khởi chạy LiteRT
Khởi chạy thành phần LiteRT của API Dịch vụ Google Play trước khi sử dụng các API LiteRT:
Kotlin
val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }
Java
Task<Void> initializeTask = TfLite.initialize(context);
3. Tạo Trình thông dịch và đặt lựa chọn thời gian chạy
Tạo một trình thông dịch bằng cách sử dụng InterpreterApi.create()
và định cấu hình trình thông dịch đó để sử dụng thời gian chạy Dịch vụ Google Play bằng cách gọi InterpreterApi.Options.setRuntime()
, như minh hoạ trong mã ví dụ sau:
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())); });
Bạn nên sử dụng phương thức triển khai ở trên vì phương thức này tránh chặn luồng giao diện người dùng Android. Nếu cần quản lý chặt chẽ hơn việc thực thi luồng, bạn có thể thêm lệnh gọi Tasks.await()
vào quá trình tạo trình thông dịch:
Kotlin
import androidx.lifecycle.lifecycleScope ... lifecycleScope.launchWhenStarted { // uses coroutine initializeTask.await() }
Java
@BackgroundThread InterpreterApi initializeInterpreter() { Tasks.await(initializeTask); return InterpreterApi.create(...); }
4. Chạy suy luận
Sử dụng đối tượng interpreter
mà bạn đã tạo, hãy gọi phương thức run()
để tạo một suy luận.
Kotlin
interpreter.run(inputBuffer, outputBuffer)
Java
interpreter.run(inputBuffer, outputBuffer);
Tăng tốc phần cứng
LiteRT cho phép bạn tăng tốc hiệu suất của mô hình bằng cách sử dụng các bộ xử lý phần cứng chuyên dụng, chẳng hạn như đơn vị xử lý đồ hoạ (GPU). Bạn có thể tận dụng các bộ xử lý chuyên dụng này bằng cách sử dụng trình điều khiển phần cứng có tên là delegate (đại biểu).
Uỷ quyền GPU được cung cấp thông qua Dịch vụ Google Play và được tải động, giống như các phiên bản Dịch vụ Play của Interpreter API.
Kiểm tra khả năng tương thích của thiết bị
Không phải thiết bị nào cũng hỗ trợ tính năng tăng tốc phần cứng GPU bằng TFLite. Để giảm thiểu lỗi và sự cố tiềm ẩn, hãy sử dụng phương thức TfLiteGpu.isGpuDelegateAvailable
để kiểm tra xem một thiết bị có tương thích với uỷ quyền GPU hay không.
Sử dụng phương thức này để xác nhận xem một thiết bị có tương thích với GPU hay không và sử dụng CPU làm phương án dự phòng khi GPU không được hỗ trợ.
useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)
Sau khi có một biến như useGpuTask
, bạn có thể dùng biến đó để xác định xem các thiết bị có sử dụng uỷ quyền GPU hay không.
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 có Interpreter API
Cách sử dụng uỷ quyền GPU với Interpreter API:
Cập nhật các phần phụ thuộc của dự án để sử dụng uỷ quyền GPU từ Dịch vụ Play:
implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
Bật lựa chọn uỷ quyền GPU trong quá trình khởi chạy TFlite:
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Java
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
Bật uỷ quyền GPU trong các lựa chọn của trình thông dịch: đặt nhà máy uỷ quyền thành GpuDelegateFactory bằng cách gọi
addDelegateFactory() within
InterpreterApi.Options()`: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());
Di chuyển từ LiteRT độc lập
Nếu bạn dự định di chuyển ứng dụng của mình từ LiteRT độc lập sang API Dịch vụ Play, hãy xem hướng dẫn bổ sung sau đây để cập nhật mã dự án ứng dụng:
- Xem phần Hạn chế để đảm bảo trường hợp sử dụng của bạn được hỗ trợ.
- Trước khi cập nhật mã, bạn nên kiểm tra hiệu suất và độ chính xác cho các mô hình của mình, đặc biệt nếu bạn đang sử dụng các phiên bản LiteRT (TF Lite) cũ hơn phiên bản 2.1, để có một đường cơ sở để so sánh với việc triển khai mới.
- Nếu đã di chuyển toàn bộ mã để sử dụng API Dịch vụ Play cho LiteRT, bạn nên xoá các phần phụ thuộc hiện có của thư viện thời gian chạy LiteRT (các mục có
org.tensorflow:tensorflow-lite:*
) khỏi tệp build.gradle để có thể giảm kích thước ứng dụng. - Xác định tất cả các lần tạo đối tượng
new Interpreter
trong mã của bạn và sửa đổi từng lần để sử dụng lệnh gọiInterpreterApi.create()
.TfLite.initialize
mới là không đồng bộ, tức là trong hầu hết các trường hợp, đây không phải là một giải pháp thay thế tức thì: bạn phải đăng ký một trình nghe cho thời điểm lệnh gọi hoàn tất. Tham khảo đoạn mã trong mã Bước 3. - Thêm
import org.tensorflow.lite.InterpreterApi;
vàimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
vào mọi tệp nguồn bằng cách sử dụng các lớporg.tensorflow.lite.Interpreter
hoặcorg.tensorflow.lite.InterpreterApi
. - Nếu bất kỳ lệnh gọi nào đến
InterpreterApi.create()
chỉ có một đối số, hãy thêmnew InterpreterApi.Options()
vào danh sách đối số. - Thêm
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
vào đối số cuối cùng của mọi lệnh gọi đếnInterpreterApi.create()
. - Thay thế tất cả các lần xuất hiện khác của lớp
org.tensorflow.lite.Interpreter
bằngorg.tensorflow.lite.InterpreterApi
.
Nếu muốn sử dụng LiteRT độc lập và API Dịch vụ Play song song, bạn phải sử dụng LiteRT (TF Lite) phiên bản 2.9 trở lên. LiteRT (TF Lite) phiên bản 2.8 trở về trước không tương thích với phiên bản API Dịch vụ Play.