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

LiteRT trong Dịch vụ Google Play cũng có thể truy cập được bằng API Java, trong ngoài API gốc. Cụ thể, LiteRT trong Google Play các dịch vụ được cung cấp qua Trình thông dịch LiteRT .

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

API Thông dịch LiteRT do thời gian chạy TensorFlow cung cấp, cung cấp giao diện đa năng để xây dựng và chạy các mô hình học máy. Sử dụng các bước sau để chạy suy luận với API Thông dịch viên bằng TensorFlow Thu gọn 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 của bạn để truy cập vào Play dịch vụ API dành cho 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. Thêm hoạt động 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 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 trình phiên dịch bằng InterpreterApi.create() và định cấu hình trình phiên dịch để sử dụng Thời gian chạy của Dịch vụ Google Play, bằng cách gọi InterpreterApi.Options.setRuntime(), như trong đoạn 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 Android chuỗi giao diện người dùng. 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() vào quy trình tạo 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 dự đoán

Sử dụng đối tượng interpreter mà bạn đã tạo, 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 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 các trình điều khiển phần cứng được gọi là uỷ quyền.

Người được uỷ quyền của 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 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.

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 không hỗ trợ GPU.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

Khi có một biến như useGpuTask, bạn có thể sử dụng biến đó để xác định xem thiết bị sử dụng uỷ quyền 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 với API phiên dịch

Cách sử dụ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 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 uỷ quyền GPU trong các tuỳ chọn phiên dịch: đặt trạng thái uỷ quyền nhà máy thành GpuDelegateFactory bằng cách gọi addDelegateFactory() within đảo Api.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 tham khảo hướng dẫn bổ sung sau đây để cập nhật mã dự án ứng dụng:

  1. Xem lại phần Hạn chế của trang này để đảm bảo có hỗ trợ trường hợp sử dụng.
  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 phân bổ, đặc biệt nếu bạn sử dụng các phiên bản LiteRT trước đó phiên bản 2.1, nên bạn có cơ sở để so sánh với trong quá trình triển khai.
  3. Nếu bạn đã di chuyển tất cả mã để sử dụng API Dịch vụ Play cho LiteRT, bạn nên xoá thời gian chạy LiteRT hiện có thư viện (mục nhập có org.tensorflow:tensorflow-lite:*) qua tệp build.gradle của bạn để bạn có thể 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ã của bạn, và sửa đổi từng mã để nó sử dụng lệnh gọi thẳng Api.create(). Chiến lược phát hành đĩa đơn new TfLite.initialize không đồng bộ, nghĩa là trong hầu hết các trường hợp nó không phải là thay thế thả xuố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 bất kỳ nguồn nào bằng cách sử dụng 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 đến 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 bất kỳ lệnh gọi nào đế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 cùng với org.tensorflow.lite.InterpreterApi.

Nếu bạn 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 2.9 (trở lên). LiteRT 2.8 trở về trước không tương thích với phiên bản API Dịch vụ Play.