เรียกใช้ LiteRT Next บน Android ด้วย Kotlin

LiteRT Next API พร้อมใช้งานใน Kotlin ซึ่งช่วยให้นักพัฒนาแอป Android ได้รับประสบการณ์การพัฒนาที่ราบรื่นพร้อมเข้าถึง API ระดับสูง

ดูตัวอย่างแอปพลิเคชัน LiteRT Next ใน Kotlin ได้ที่การแบ่งกลุ่มรูปภาพด้วย Kotlin Demo

เริ่มต้นใช้งาน

ทําตามขั้นตอนต่อไปนี้เพื่อเพิ่ม LiteRT Next ลงในแอปพลิเคชัน Android

เพิ่มแพ็กเกจ Maven

เพิ่มทรัพยากร Dependency ของ LiteRT Next ลงในแอปพลิเคชัน

dependencies {
  ...
  implementation `com.google.ai.edge.litert:litert:2.0.0-alpha`
}

สร้างโมเดลที่คอมไพล์แล้ว

ใช้ CompiledModel API เพื่อเริ่มต้นรันไทม์ด้วยโมเดลและตัวเลือกการเร่งฮาร์ดแวร์ ดังนี้

val  model =
  CompiledModel.create(
    context.assets,
    "mymodel.tflite",
    CompiledModel.Options(Accelerator.CPU),
    env,
  )

สร้างบัฟเฟอร์อินพุตและเอาต์พุต

สร้างโครงสร้างข้อมูล (บัฟเฟอร์) ที่จําเป็นเพื่อเก็บข้อมูลอินพุตที่คุณจะป้อนลงในโมเดลสําหรับการอนุมาน และข้อมูลเอาต์พุตที่โมเดลสร้างขึ้นหลังจากทําการอนุมาน

val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()

หากใช้หน่วยความจําของ CPU ให้ป้อนข้อมูลโดยการเขียนข้อมูลลงในบัฟเฟอร์อินพุตแรกโดยตรง

inputBuffers[0].writeFloat(FloatArray(data_size) { data_value /* your data */ })

เรียกใช้โมเดล

ระบุบัฟเฟอร์อินพุตและเอาต์พุต แล้วเรียกใช้โมเดลที่คอมไพล์แล้ว

model.run(inputBuffers, outputBuffers)

เรียกข้อมูลเอาต์พุต

ดึงข้อมูลเอาต์พุตโดยการอ่านเอาต์พุตของโมเดลจากหน่วยความจําโดยตรง

val outputFloatArray = outputBuffers[0].readFloat()

แนวคิดและคอมโพเนนต์หลัก

ดูข้อมูลเกี่ยวกับแนวคิดและคอมโพเนนต์หลักของ LiteRT Next Kotlin API ได้ที่ส่วนต่อไปนี้

การทำนายพื้นฐาน (CPU)

ต่อไปนี้เป็นการใช้งานการอนุมานแบบย่อและง่ายขึ้นด้วย LiteRT Next

// Load model and initialize runtime
val  model =
    CompiledModel.create(
        context.assets,
        "mymodel.tflite"
    )

// Preallocate input/output buffers
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()

// Fill the first input
inputBuffers[0].writeFloat(FloatArray(data_size) { data_value /* your data */ })

// Invoke
model.run(inputBuffers, outputBuffers)

// Read the output
val outputFloatArray = outputBuffers[0].readFloat()

// Clean up buffers and model
inputBuffers.forEach { it.close() }
outputBuffers.forEach { it.close() }
model.close()

โมเดลที่คอมไพล์แล้ว (CompiledModel)

Compiled Model API (CompiledModel) มีหน้าที่โหลดโมเดล ใช้การเร่งฮาร์ดแวร์ สร้างอินสแตนซ์รันไทม์ สร้างบัฟเฟอร์อินพุตและเอาต์พุต รวมถึงเรียกใช้การอนุมาน

ข้อมูลโค้ดที่เขียนง่ายขึ้นต่อไปนี้แสดงวิธีที่ Compiled Model API ใช้โมเดล LiteRT (.tflite) และสร้างโมเดลที่คอมไพล์แล้วซึ่งพร้อมใช้งานการอนุมาน

val  model =
  CompiledModel.create(
    context.assets,
    "mymodel.tflite"
  )

ข้อมูลโค้ดที่เรียบง่ายต่อไปนี้แสดงวิธีที่ CompiledModel API ใช้บัฟเฟอร์อินพุตและเอาต์พุต และทำการอนุมานด้วยโมเดลที่คอมไพล์แล้ว

// Preallocate input/output buffers
val inputBuffers = model.createInputBuffers()
val outputBuffers = model.createOutputBuffers()

// Fill the first input
inputBuffers[0].writeFloat(FloatArray(data_size) { data_value /* your data */ })
// Invoke
model.run(inputBuffers, outputBuffers)
// Read the output
val outputFloatArray = outputBuffers[0].readFloat()

// Clean up buffers and model
inputBuffers.forEach { it.close() }
outputBuffers.forEach { it.close() }
model.close()

ดูภาพรวมที่สมบูรณ์ยิ่งขึ้นเกี่ยวกับวิธีติดตั้งใช้งาน CompiledModel API ได้ที่แหล่งที่มาของโค้ดที่ Model.kt

บัฟเฟอร์ Tensor (TensorBuffer)

LiteRT Next รองรับการทำงานร่วมกันของบัฟเฟอร์ I/O ในตัวโดยใช้ Tensor Buffer API (TensorBuffer) เพื่อจัดการการไหลเข้าและออกจาก CompiledModel Tensor Buffer API ช่วยให้คุณเขียน (Write<T>()) และอ่าน (Read<T>()) รวมถึงล็อกบัฟเฟอร์ได้

ดูภาพรวมที่สมบูรณ์ยิ่งขึ้นเกี่ยวกับวิธีติดตั้งใช้งาน Tensor Buffer API ได้ที่ซอร์สโค้ดใน TensorBuffer.kt