Exécuter LiteRT Next sur Android avec Kotlin

Les API LiteRT Next sont disponibles en Kotlin, ce qui offre aux développeurs Android une expérience de développement fluide avec un accès aux API de haut niveau.

Pour voir un exemple d'application LiteRT Next en Kotlin, consultez la démo de segmentation d'images avec Kotlin.

Premiers pas

Pour ajouter LiteRT Next à votre application Android, procédez comme suit :

Ajouter un package Maven

Ajoutez la dépendance LiteRT Next à votre application:

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

Créer le modèle compilé

À l'aide de l'API CompiledModel, initialisez l'environnement d'exécution avec un modèle et l'accélération matérielle de votre choix:

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

Créer des tampons d'entrée et de sortie

Créez les structures de données (tampons) nécessaires pour stocker les données d'entrée que vous allez fournir au modèle pour l'inférence et les données de sortie que le modèle produit après l'exécution de l'inférence.

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

Si vous utilisez la mémoire du processeur, remplissez les entrées en écrivant des données directement dans le premier tampon d'entrée.

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

Appeler le modèle

Fournissez les tampons d'entrée et de sortie, puis exécutez le modèle compilé.

model.run(inputBuffers, outputBuffers)

Récupérer les sorties

Récupérez les sorties en lisant directement la sortie du modèle à partir de la mémoire.

val outputFloatArray = outputBuffers[0].readFloat()

Concepts et composants clés

Consultez les sections suivantes pour en savoir plus sur les concepts et composants clés des API Kotlin LiteRT Next.

Inférence de base (CPU)

Vous trouverez ci-dessous une implémentation condensée et simplifiée de l'inférence avec 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()

Modèle compilé (CompiledModel)

L'API de modèle compilé (CompiledModel) est chargée de charger un modèle, d'appliquer l'accélération matérielle, d'instancier l'environnement d'exécution, de créer des tampons d'entrée et de sortie, et d'exécuter l'inférence.

L'extrait de code simplifié suivant montre comment l'API de modèle compilé prend un modèle LiteRT (.tflite) et crée un modèle compilé prêt à exécuter l'inférence.

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

L'extrait de code simplifié suivant montre comment l'API CompiledModel prend une entrée et un tampon de sortie, puis exécute des inférences avec le modèle compilé.

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

Pour obtenir une vue plus complète de l'implémentation de l'API CompiledModel, consultez le code source dans Model.kt.

Tampon de tensor (TensorBuffer)

LiteRT Next est compatible avec l'interopérabilité des tampons d'E/S, à l'aide de l'API Tensor Buffer (TensorBuffer) pour gérer le flux de données vers et depuis le CompiledModel. L'API Tensor Buffer permet d'écrire (Write<T>()) et de lire (Read<T>()), et de verrouiller des tampons.

Pour obtenir une vue plus complète de l'implémentation de l'API Tensor Buffer, consultez le code source à l'adresse TensorBuffer.kt.