Ejecuta la API de LiteRT Compiled Model en Android con Kotlin

La API de LiteRT Compiled Model está disponible en Kotlin y ofrece a los desarrolladores de Android una experiencia fluida y centrada en el acelerador con APIs de alto nivel.

Para ver un ejemplo de una aplicación de LiteRT en Kotlin, consulta la demostración de segmentación de imágenes con Kotlin.

Comenzar

Sigue estos pasos para agregar la API de LiteRT Compiled Model a tu aplicación para Android.

Agrega un paquete de Maven

Agrega la dependencia de LiteRT con la API de Compiled Model a tu aplicación:

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

Crea el modelo compilado

Con la API de CompiledModel, inicializa el tiempo de ejecución con un modelo y la aceleración por hardware que elijas:

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

Cómo crear búferes de entrada y salida

Crea las estructuras de datos (búferes) necesarias para contener los datos de entrada que ingresarás en el modelo para la inferencia y los datos de salida que el modelo produce después de ejecutar la inferencia.

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

Si usas memoria de CPU, completa las entradas escribiendo datos directamente en el primer búfer de entrada.

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

Invoca el modelo

Proporciona los búferes de entrada y salida, y ejecuta el modelo compilado.

model.run(inputBuffers, outputBuffers)

Recupera resultados

Recupera los resultados leyendo directamente el resultado del modelo de la memoria.

val outputFloatArray = outputBuffers[0].readFloat()

Componentes y conceptos clave

Consulta las siguientes secciones para obtener información sobre los conceptos y componentes clave de las APIs de modelos compilados de Kotlin de LiteRT.

Inferencia básica (CPU)

A continuación, se muestra una implementación condensada y simplificada de la inferencia 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()

Modelo compilado (CompiledModel)

La API de Compiled Model (CompiledModel) es responsable de cargar un modelo, aplicar la aceleración por hardware, crear una instancia del tiempo de ejecución, crear búferes de entrada y salida, y ejecutar la inferencia.

En el siguiente fragmento de código simplificado, se muestra cómo la API de Compiled Model toma un modelo de LiteRT (.tflite) y crea un modelo compilado listo para ejecutar la inferencia.

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

En el siguiente fragmento de código simplificado, se muestra cómo la API de CompiledModel toma un búfer de entrada y uno de salida, y ejecuta inferencias con el modelo compilado.

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

Para obtener una vista más completa de cómo se implementa la API de CompiledModel, consulta el código fuente en Model.kt.

Búfer de tensor (TensorBuffer)

LiteRT proporciona compatibilidad integrada para la interoperabilidad de búferes de E/S, ya que usa la API de Tensor Buffer (TensorBuffer) para controlar el flujo de datos hacia y desde el CompiledModel. La API de Tensor Buffer permite escribir (Write<T>()) y leer (Read<T>()) búferes, así como bloquearlos.

Para obtener una vista más completa de cómo se implementa la API de Tensor Buffer, consulta el código fuente en TensorBuffer.kt.