LiteRT ใน Google Play Services Java (และ Kotlin) API

นอกจากนี้ คุณยังเข้าถึง LiteRT ในบริการ Google Play โดยใช้ Java API ได้ด้วย ซึ่งสามารถใช้จากโค้ด Java หรือ Kotlin นอกเหนือจาก Native API โดยเฉพาะอย่างยิ่ง บริการ LiteRT ใน Google Play จะใช้ได้ผ่าน LiteRT Interpreter API

การใช้ Interpreter API

LiteRT Interpreter API ที่รันไทม์ TensorFlow มีให้นั้นให้บริการอินเทอร์เฟซอเนกประสงค์สำหรับการสร้างและเรียกใช้โมเดล ML ทําตามขั้นตอนต่อไปนี้เพื่อเรียกใช้การอนุมานด้วย Interpreter API โดยใช้ TensorFlow Lite ในรันไทม์ของบริการ Google Play

1. เพิ่มการพึ่งพาโปรเจ็กต์

เพิ่มทรัพยากร Dependency ต่อไปนี้ลงในโค้ดโปรเจ็กต์แอปเพื่อเข้าถึง API บริการ Play สำหรับ 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. เพิ่มการเริ่มต้น LiteRT

เริ่มต้นใช้งานคอมโพเนนต์ LiteRT ของ Google Play Services APIก่อนใช้ LiteRT API

Kotlin

val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }

Java

Task<Void> initializeTask = TfLite.initialize(context);

3. สร้างโปรแกรมแปลภาษาและตั้งค่าตัวเลือกรันไทม์

สร้างโปรแกรมแปลโดยใช้ InterpreterApi.create() และกำหนดค่าให้ใช้รันไทม์บริการ Google Play โดยเรียกใช้ InterpreterApi.Options.setRuntime() ดังที่แสดงในโค้ดตัวอย่างต่อไปนี้

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 Delegate มีให้บริการผ่านบริการ Google Play และโหลดแบบไดนามิก เช่นเดียวกับ Interpreter API เวอร์ชันบริการ Play

ตรวจสอบความเข้ากันได้ของอุปกรณ์

อุปกรณ์บางรุ่นไม่รองรับการเร่งฮาร์ดแวร์ GPU ด้วย TFLite ใช้เมธอด 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 ที่มี Interpreter API

วิธีใช้ผู้รับมอบสิทธิ์ GPU กับ Interpreter API

  1. อัปเดตทรัพยากร Dependency ของโปรเจ็กต์เพื่อใช้ผู้รับมอบสิทธิ์ GPU จากบริการ Play โดยทำดังนี้

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
    
  2. เปิดใช้ตัวเลือกการมอบสิทธิ์ GPU ในการเริ่มต้น TFlite

    Kotlin

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build())

    Java

    TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build());
  3. เปิดใช้ตัวแทน GPU ในตัวเลือกโปรแกรมแปลภาษา: ตั้งค่าโรงงานตัวแทนเป็น GpuDelegateFactory โดยเรียกใช้ 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());

การย้ายข้อมูลจาก LiteRT แบบสแตนด์อโลน

หากวางแผนที่จะย้ายข้อมูลแอปจาก LiteRT แบบสแตนด์อโลนไปยัง Play Services API โปรดอ่านคำแนะนำเพิ่มเติมต่อไปนี้สำหรับการอัปเดตโค้ดโปรเจ็กต์แอป

  1. โปรดอ่านส่วนข้อจํากัดของหน้านี้เพื่อให้แน่ใจว่ากรณีการใช้งานของคุณได้รับการรองรับ
  2. ก่อนที่จะอัปเดตโค้ด เราขอแนะนำให้คุณตรวจสอบประสิทธิภาพและความแม่นยำสำหรับโมเดลของคุณ โดยเฉพาะอย่างยิ่งหากคุณใช้ LiteRT (TF Lite) เวอร์ชันเก่ากว่าเวอร์ชัน 2.1 เพื่อให้มีฐานสำหรับเปรียบเทียบกับการติดตั้งใช้งานใหม่
  3. หากย้ายข้อมูลโค้ดทั้งหมดไปใช้ Play Services API สำหรับ LiteRT แล้ว คุณควรนําการพึ่งพาไลบรารีรันไทม์ LiteRT ที่มีอยู่ (รายการที่มี org.tensorflow:tensorflow-lite:*) ออกจากไฟล์ build.gradle เพื่อให้ลดขนาดแอปได้
  4. ระบุตำแหน่งทั้งหมดของการสร้างออบเจ็กต์ new Interpreter ในโค้ด และแก้ไขแต่ละรายการให้ใช้การเรียก InterpreterApi.create() TfLite.initialize ใหม่เป็นแบบแอซิงโครนัส ซึ่งหมายความว่าในกรณีส่วนใหญ่ TfLite.initialize ใหม่จะไม่มาแทนที่ TfLite.initialize เดิมได้โดยตรง คุณต้องลงทะเบียน Listener สำหรับกรณีที่การเรียกใช้เสร็จสมบูรณ์ โปรดดูข้อมูลโค้ดในรหัสขั้นตอนที่ 3
  5. เพิ่ม import org.tensorflow.lite.InterpreterApi; และ import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; ลงในไฟล์ต้นทางโดยใช้คลาส org.tensorflow.lite.Interpreter หรือ org.tensorflow.lite.InterpreterApi
  6. หากการเรียก InterpreterApi.create() ใดๆ ที่ได้มีผลลัพธ์มีอาร์กิวเมนต์เพียงรายการเดียว ให้เพิ่ม new InterpreterApi.Options() ต่อท้ายรายการอาร์กิวเมนต์
  7. ต่อท้าย .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) ต่อท้ายอาร์กิวเมนต์สุดท้ายของ การเรียกใช้ InterpreterApi.create()
  8. แทนที่คลาส org.tensorflow.lite.Interpreter อื่นๆ ทั้งหมดด้วย org.tensorflow.lite.InterpreterApi

หากต้องการใช้ LiteRT แบบสแตนด์อโลนและ Play Services API ร่วมกัน คุณต้องใช้ LiteRT (TF Lite) เวอร์ชัน 2.9 ขึ้นไป LiteRT (TF Lite) เวอร์ชัน 2.8 และเวอร์ชันก่อนหน้าใช้ร่วมกับ API ของบริการ Play ไม่ได้