LiteRT Next mit Kotlin auf Android ausführen

Die LiteRT Next APIs sind in Kotlin verfügbar, was Android-Entwicklern eine nahtlose Entwicklungsumgebung mit Zugriff auf APIs der höheren Ebene bietet.

Ein Beispiel für eine LiteRT Next-Anwendung in Kotlin finden Sie in der Demo zur Bildsegmentierung mit Kotlin.

Jetzt starten

So fügen Sie Ihrer Android-Anwendung LiteRT Next hinzu:

Maven-Paket hinzufügen

Fügen Sie Ihrer Anwendung die Abhängigkeit „LiteRT Next“ hinzu:

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

Compiled Model erstellen

Initialisieren Sie die Laufzeit mit der CompiledModel API mit einem Modell und der gewünschten Hardwarebeschleunigung:

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

Eingabe- und Ausgabe-Buffer erstellen

Erstellen Sie die erforderlichen Datenstrukturen (Puffer), um die Eingabedaten zu speichern, die Sie dem Modell zur Inferenz zuführen, und die Ausgabedaten, die das Modell nach der Inferenz generiert.

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

Wenn Sie CPU-Speicher verwenden, füllen Sie die Eingaben, indem Sie Daten direkt in den ersten Eingabepuffer schreiben.

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

Modell aufrufen

Führen Sie das kompilierte Modell aus, indem Sie die Eingabe- und Ausgabe-Buffer angeben.

model.run(inputBuffers, outputBuffers)

Ausgaben abrufen

Sie können die Ausgabe direkt aus dem Arbeitsspeicher abrufen.

val outputFloatArray = outputBuffers[0].readFloat()

Wichtige Konzepte und Komponenten

In den folgenden Abschnitten finden Sie Informationen zu den wichtigsten Konzepten und Komponenten der LiteRT Next Kotlin APIs.

Grundlegende Inferenz (CPU)

Im Folgenden finden Sie eine komprimierte, vereinfachte Implementierung der Inferenz mit 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()

Kompiliertes Modell (CompiledModel)

Die Compiled Model API (CompiledModel) ist für das Laden eines Modells, die Anwendung der Hardwarebeschleunigung, die Instanziierung der Laufzeit, das Erstellen von Eingabe- und Ausgabepuffern und die Ausführung der Inferenz verantwortlich.

Das folgende vereinfachte Code-Snippet zeigt, wie die Compiled Model API ein LiteRT-Modell (.tflite) verwendet, um ein kompiliertes Modell zu erstellen, das für die Ausführung von Inferenzen bereit ist.

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

Das folgende vereinfachte Code-Snippet zeigt, wie die CompiledModel API einen Eingabe- und einen Ausgabebuffer annimmt und Inferenzen mit dem kompilierten Modell ausführt.

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

Eine vollständigere Übersicht über die Implementierung der CompiledModel API finden Sie im Quellcode unter Model.kt.

Tensor Buffer (TensorBuffer)

LiteRT Next bietet integrierte Unterstützung für die Interoperabilität von E/A-Bussen. Dabei wird die Tensor Buffer API (TensorBuffer) verwendet, um den Datenfluss in und aus dem CompiledModel zu steuern. Mit der Tensor Buffer API können Sie Buffers schreiben (Write<T>()), lesen (Read<T>()) und sperren.

Eine vollständigere Darstellung der Implementierung der Tensor Buffer API finden Sie im Quellcode unter TensorBuffer.kt.