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.