LiteRT trong API Java (và Kotlin) của Dịch vụ Google Play

Ngoài API gốc, bạn cũng có thể truy cập LiteRT trong Dịch vụ Google Play bằng API Java (kết hợp với mã Java hoặc Kotlin). Cụ thể, LiteRT trong các dịch vụ của Google Play được cung cấp thông qua API Phiên dịch LiteRT.

Sử dụng API Trình thông dịch

API Thông dịch LiteRT (do môi trường thời gian chạy TensorFlow cung cấp) mang đến một giao diện đa năng để xây dựng và chạy các mô hình học máy. Hãy làm theo các bước sau để chạy dự đoán bằng API Thông dịch viên bằng TensorFlow Lite trong thời gian chạy của Dịch vụ Google Play.

1. Thêm phần phụ thuộc dự án

Thêm các phần phụ thuộc sau vào mã dự án ứng dụng để truy cập 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 Phiên dịch và đặt tuỳ chọn thời gian chạy

Tạo một trình thông dịch bằng InterpreterApi.create() và định cấu hình trình thông dịch đó để sử dụng môi trường thời gian chạy Dịch vụ Google Play bằng cách gọi InterpreterApi.Options.setRuntime(), như 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 giúp tránh chặn luồng giao diện người dùng Android. Nếu cần quản lý quá trình thực thi luồng chặt chẽ hơn, 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 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 biệt này bằng cách sử dụng trình điều khiển phần cứng có tên là đại diện.

Đại diệ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 API Trình diễn giải.

Đang 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 thiết bị có tương thích với trình uỷ quyền GPU hay không.

Sử dụng phương thức này để xác nhận xem 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ể sử dụng biến đó để xác định xem thiết bị có sử dụng trình 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ó API Trình diễn giải

Cách sử dụng trình uỷ quyền GPU với API Trình diễn giải:

  1. Cập nhật các phần phụ thuộc của dự án để sử dụng uỷ quyền GPU qua Dịch vụ Play:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
    
  2. Bật tuỳ 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());
  3. Bật tính năng uỷ quyền GPU trong các tuỳ chọn trình thông dịch: đặt nhà máy uỷ quyền thành GpuDelegateFactory bằng cách gọi addDelegateFactory() withinInterpreterApi.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 từ LiteRT độc lập sang API Dịch vụ Play, hãy xem lại hướng dẫn bổ sung sau đây để cập nhật mã dự án ứng dụng:

  1. Tham khảo phần Giới hạn trên trang này để đảm bảo trường hợp sử dụng của bạn được hỗ trợ.
  2. 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 là 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, vì vậy, bạn có đường cơ sở để so sánh với cách triển khai mới.
  3. Nếu đã di chuyển tất cả mã để sử dụng API Dịch vụ Play cho LiteRT, bạn nên xoá các phần phụ thuộc thư viện thời gian chạy LiteRT hiện có (các mục có org.tensorflow:tensorflow-lite:*) khỏi tệp build.gradle để giảm kích thước ứng dụng.
  4. Xác định tất cả các lần tạo đối tượng new Interpreter trong mã và sửa đổi từng lần để sử dụng lệnh gọi InterpreterApi.create(). TfLite.initialize mới là không đồng bộ, nghĩa là trong hầu hết các trường hợp, lớp này không phải là lớp thay thế thả vào: bạn phải đăng ký 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.
  5. Thêm import org.tensorflow.lite.InterpreterApi;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ớp org.tensorflow.lite.Interpreter hoặc org.tensorflow.lite.InterpreterApi.
  6. Nếu bất kỳ lệnh gọi nào đến InterpreterApi.create() chỉ có một đối số, hãy thêm new InterpreterApi.Options() vào danh sách đối số.
  7. Thêm .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) vào đối số cuối cùng của mọi lệnh gọi đến InterpreterApi.create().
  8. Thay thế tất cả các lần xuất hiện khác của lớp org.tensorflow.lite.Interpreter bằng org.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.