Esegui l'API LiteRT Compiled Model su Android con Kotlin

L'API LiteRT Compiled Model è disponibile in Kotlin e offre agli sviluppatori Android un'esperienza semplice e incentrata sull'acceleratore con API di alto livello.

Per un esempio di applicazione LiteRT in Kotlin, consulta la demo di segmentazione delle immagini con Kotlin.

Inizia

Segui questi passaggi per aggiungere l'API LiteRT Compiled Model alla tua applicazione Android.

Aggiungi pacchetto Maven

Aggiungi la dipendenza LiteRT con l'API Compiled Model alla tua applicazione:

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

Crea il modello compilato

Utilizzando l'API CompiledModel, inizializza il runtime con un modello e la tua scelta di accelerazione hardware:

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

Creare buffer di input e output

Crea le strutture di dati (buffer) necessarie per contenere i dati di input che inserirai nel modello per l'inferenza e i dati di output che il modello produce dopo l'esecuzione dell'inferenza.

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

Se utilizzi la memoria della CPU, compila gli input scrivendo i dati direttamente nel primo buffer di input.

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

Richiamare il modello

Fornisci i buffer di input e output ed esegui il modello compilato.

model.run(inputBuffers, outputBuffers)

Recuperare gli output

Recupera gli output leggendo direttamente l'output del modello dalla memoria.

val outputFloatArray = outputBuffers[0].readFloat()

Concetti e componenti chiave

Consulta le sezioni seguenti per informazioni sui concetti e sui componenti chiave delle API LiteRT Kotlin Compiled Model.

Inferenza di base (CPU)

Di seguito è riportata un'implementazione semplificata e condensata dell'inferenza con 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()

Modello compilato (CompiledModel)

L'API Compiled Model (CompiledModel) è responsabile del caricamento di un modello, dell'applicazione dell'accelerazione hardware, dell'istanza del runtime, della creazione di buffer di input e output e dell'esecuzione dell'inferenza.

Il seguente snippet di codice semplificato mostra come l'API Compiled Model accetta un modello LiteRT (.tflite) e crea un modello compilato pronto per eseguire l'inferenza.

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

Il seguente snippet di codice semplificato mostra come l'API CompiledModel accetta un buffer di input e un buffer di output ed esegue inferenze con il modello compilato.

// 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()

Per una visione più completa di come viene implementata l'API CompiledModel, consulta il codice sorgente all'indirizzo Model.kt.

Buffer tensore (TensorBuffer)

LiteRT fornisce il supporto integrato per l'interoperabilità dei buffer I/O, utilizzando l'API Tensor Buffer (TensorBuffer) per gestire il flusso di dati in entrata e in uscita dal CompiledModel. L'API Tensor Buffer consente di scrivere (Write<T>()) e leggere (Read<T>()) e bloccare i buffer.

Per una visione più completa di come viene implementata l'API Tensor Buffer, consulta il codice sorgente all'indirizzo TensorBuffer.kt.