Ejecuta LiteRT Next en Android con Kotlin

Las APIs de LiteRT Next están disponibles en Kotlin, que ofrece a los desarrolladores de Android una experiencia de desarrollo fluida con acceso a APIs de alto nivel.

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

Comenzar

Sigue estos pasos para agregar LiteRT Next a tu aplicación para Android.

Agrega el paquete Maven

Agrega la dependencia LiteRT Next 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 entorno de ejecución con un modelo y la aceleración de 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 (buffers) necesarias para contener los datos de entrada que alimentarás al 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 la memoria de la CPU, escribe datos directamente en el primer búfer de entrada para completar las entradas.

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

Cómo invocar el modelo

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

model.run(inputBuffers, outputBuffers)

Cómo recuperar resultados

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

val outputFloatArray = outputBuffers[0].readFloat()

Conceptos y componentes clave

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

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 de hardware, crear instancias del entorno 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 LiteRT (.tflite) y crea un modelo compilado listo para ejecutar inferencias.

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.

Buffer de tensores (TensorBuffer)

LiteRT Next proporciona compatibilidad integrada con la interoperabilidad de búferes de E/S, con la API de Tensor Buffer (TensorBuffer) para controlar el flujo de datos dentro y fuera de CompiledModel. La API de Tensor Buffer proporciona la capacidad de escribir (Write<T>()) y leer (Read<T>()), y bloquear búferes.

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.