นอกจากนี้ คุณยังเข้าถึง 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
อัปเดตทรัพยากร Dependency ของโปรเจ็กต์เพื่อใช้ผู้รับมอบสิทธิ์ GPU จากบริการ Play โดยทำดังนี้
implementation 'com.google.android.gms:play-services-tflite-gpu:16.2.0'
เปิดใช้ตัวเลือกการมอบสิทธิ์ GPU ในการเริ่มต้น TFlite
Kotlin
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build())
Java
TfLite.initialize(context, TfLiteInitializationOptions.builder() .setEnableGpuDelegateSupport(true) .build());
เปิดใช้ตัวแทน GPU ในตัวเลือกโปรแกรมแปลภาษา: ตั้งค่าโรงงานตัวแทนเป็น GpuDelegateFactory โดยเรียกใช้
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());
การย้ายข้อมูลจาก LiteRT แบบสแตนด์อโลน
หากวางแผนที่จะย้ายข้อมูลแอปจาก LiteRT แบบสแตนด์อโลนไปยัง Play Services API โปรดอ่านคำแนะนำเพิ่มเติมต่อไปนี้สำหรับการอัปเดตโค้ดโปรเจ็กต์แอป
- โปรดอ่านส่วนข้อจํากัดของหน้านี้เพื่อให้แน่ใจว่ากรณีการใช้งานของคุณได้รับการรองรับ
- ก่อนที่จะอัปเดตโค้ด เราขอแนะนำให้คุณตรวจสอบประสิทธิภาพและความแม่นยำสำหรับโมเดลของคุณ โดยเฉพาะอย่างยิ่งหากคุณใช้ LiteRT (TF Lite) เวอร์ชันเก่ากว่าเวอร์ชัน 2.1 เพื่อให้มีฐานสำหรับเปรียบเทียบกับการติดตั้งใช้งานใหม่
- หากย้ายข้อมูลโค้ดทั้งหมดไปใช้ Play Services API สำหรับ LiteRT แล้ว คุณควรนําการพึ่งพาไลบรารีรันไทม์ LiteRT ที่มีอยู่ (รายการที่มี
org.tensorflow:tensorflow-lite:*
) ออกจากไฟล์ build.gradle เพื่อให้ลดขนาดแอปได้ - ระบุตำแหน่งทั้งหมดของการสร้างออบเจ็กต์
new Interpreter
ในโค้ด และแก้ไขแต่ละรายการให้ใช้การเรียกInterpreterApi.create()
TfLite.initialize
ใหม่เป็นแบบแอซิงโครนัส ซึ่งหมายความว่าในกรณีส่วนใหญ่TfLite.initialize
ใหม่จะไม่มาแทนที่TfLite.initialize
เดิมได้โดยตรง คุณต้องลงทะเบียน Listener สำหรับกรณีที่การเรียกใช้เสร็จสมบูรณ์ โปรดดูข้อมูลโค้ดในรหัสขั้นตอนที่ 3 - เพิ่ม
import org.tensorflow.lite.InterpreterApi;
และimport org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime;
ลงในไฟล์ต้นทางโดยใช้คลาสorg.tensorflow.lite.Interpreter
หรือorg.tensorflow.lite.InterpreterApi
- หากการเรียก
InterpreterApi.create()
ใดๆ ที่ได้มีผลลัพธ์มีอาร์กิวเมนต์เพียงรายการเดียว ให้เพิ่มnew InterpreterApi.Options()
ต่อท้ายรายการอาร์กิวเมนต์ - ต่อท้าย
.setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
ต่อท้ายอาร์กิวเมนต์สุดท้ายของ การเรียกใช้InterpreterApi.create()
- แทนที่คลาส
org.tensorflow.lite.Interpreter
อื่นๆ ทั้งหมดด้วยorg.tensorflow.lite.InterpreterApi
หากต้องการใช้ LiteRT แบบสแตนด์อโลนและ Play Services API ร่วมกัน คุณต้องใช้ LiteRT (TF Lite) เวอร์ชัน 2.9 ขึ้นไป LiteRT (TF Lite) เวอร์ชัน 2.8 และเวอร์ชันก่อนหน้าใช้ร่วมกับ API ของบริการ Play ไม่ได้