TensorFlow Lite trong API Java của Dịch vụ Google Play

Ngoài API gốc, bạn cũng có thể truy cập vào TensorFlow Lite trong Dịch vụ Google Play bằng API Java. Đặc biệt, TensorFlow Lite trong Dịch vụ của Google Play được cung cấp thông qua API Phiên dịch TensorFlow Lite.

Sử dụng API Phiên dịch

API Phiên dịch TensorFlow Lite do môi trường thời gian chạy TensorFlow cung cấp cung cấp một giao diện đa năng để xây dựng và chạy các mô hình ML. Hãy sử dụng các bước sau để chạy dự đoán bằng API Phiên dịch bằng cách sử dụng TensorFlow Lite trong thời gian chạy của 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 TensorFlow Lite:

dependencies {
...
    // Tensorflow Lite dependencies for Google Play services
    implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
    // Optional: include Tensorflow Lite Support Library
    implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}

2. Thêm hoạt động khởi chạy TensorFlow Lite

Khởi chạy thành phần TensorFlow Lite của API Dịch vụ Google Play trước khi sử dụng API TensorFlow Lite:

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 này để sử dụng môi trường thời gian chạy của Dịch vụ Google Play bằng cách gọi InterpreterApi.Options.setRuntime(), như trong mã ví dụ sau đây:

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 cách triển khai ở trên vì cách này tránh chặn luồng giao diện người dùng Android. Nếu cần quản lý việc thực thi luồng chặt chẽ hơn, bạn có thể thêm lệnh gọi Tasks.await() để tạo trình phiên 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 bạn đã tạo, gọi phương thức run() để tạo dự đoán.

Kotlin

interpreter.run(inputBuffer, outputBuffer)

Java

interpreter.run(inputBuffer, outputBuffer);

Tăng tốc phần cứng

TensorFlow Lite cho phép bạn tăng tốc hiệu suất cho 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ư bộ 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 gọi là uỷ quyền.

Tính năng 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 API Phiên dịch.

Đ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ăng tốc phần cứng GPU bằng TFLite. Để giảm thiểu các lỗi và sự cố có thể xảy ra, 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 thực thể đại diện GPU hay không.

Hãy 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, đồng thời 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 các thiết bị có sử dụng lớp 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 Phiên dịch

Cách sử dụng tính năng uỷ quyền GPU với API Phiên dịch:

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

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.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 ủy quyền GPU trong các tuỳ chọn của trình thông dịch: đặt nhà máy ủy quyền thành GpuDelegateFactory bằng cách gọi addDelegateFactory() withinPhiên dịchApi.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ừ TensorFlow Lite độc lập

Nếu bạn đang định di chuyển ứng dụng của mình từ TensorFlow Lite độc lập sang API Dịch vụ Play, hãy xem xét hướng dẫn bổ sung sau đây để cập nhật mã dự án ứng dụng:

  1. Xem 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ã, hãy kiểm tra hiệu suất và độ chính xác cho các mô hình của bạn, đặc biệt là nếu bạn đang sử dụng các phiên bản TensorFlow Lite trước phiên bản 2.1. Nhờ đó, bạn sẽ có đường cơ sở để so sánh với phương thức triển khai mới.
  3. Nếu đã di chuyển tất cả mã của mình để sử dụng API Dịch vụ Play cho TensorFlow Lite, bạn nên xoá các phần phụ thuộc thư viện thời gian chạy TensorFlow Lite hiện có (các mục nhập có org.tensorflow:tensorflow-lite:*) khỏi tệp build.gradle để có thể giảm kích thước ứng dụng.
  4. Xác định tất cả lần xuất hiện khi 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ọi Phiên dịchApi.create(). TfLite.khởi tạo mới không đồng bộ, nghĩa là trong hầu hết các trường hợp, đây không phải là phương thức thay thế dự phòng: bạn phải đăng ký trình nghe khi 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 kết quả nào tới InterpreterApi.create() chỉ có một đối số duy nhất, 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 TensorFlow Lite độc lập và API Dịch vụ Play song song với nhau, bạn phải sử dụng TensorFlow Lite 2.9 trở lên. TensorFlow Lite 2.8 trở xuống không tương thích với phiên bản API Dịch vụ Play.