Uruchamianie interfejsu API skompilowanego modelu LiteRT na Androidzie w języku Kotlin

Interfejs LiteRT Compiled Model API jest dostępny w języku Kotlin, co zapewnia deweloperom Androida bezproblemową obsługę akceleratorów dzięki interfejsom API wysokiego poziomu.

Przykład aplikacji LiteRT w Kotlinie znajdziesz w demonstracji segmentacji obrazu w Kotlinie.

Rozpocznij

Aby dodać interfejs LiteRT Compiled Model API do aplikacji na Androida, wykonaj te czynności.

Dodawanie pakietu Maven

Dodaj do aplikacji zależność LiteRT za pomocą interfejsu Compiled Model API:

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

Tworzenie skompilowanego modelu

Za pomocą interfejsu CompiledModel API zainicjuj środowisko wykonawcze z modelem i wybraną akceleracją sprzętową:

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

Tworzenie buforów wejściowych i wyjściowych

Utwórz niezbędne struktury danych (bufory) do przechowywania danych wejściowych, które będziesz przekazywać do modelu na potrzeby wnioskowania, oraz danych wyjściowych, które model generuje po uruchomieniu wnioskowania.

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

Jeśli używasz pamięci procesora, wypełnij pola wejściowe, wpisując dane bezpośrednio do pierwszego bufora wejściowego.

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

Wywoływanie modelu

Podaj bufory wejściowe i wyjściowe, a następnie uruchom skompilowany model.

model.run(inputBuffers, outputBuffers)

Pobieranie danych wyjściowych

Pobieraj dane wyjściowe, odczytując je bezpośrednio z pamięci.

val outputFloatArray = outputBuffers[0].readFloat()

Kluczowe pojęcia i komponenty

W kolejnych sekcjach znajdziesz informacje o kluczowych pojęciach i komponentach interfejsów LiteRT Kotlin Compiled Model API.

Podstawowe wnioskowanie (CPU)

Poniżej znajdziesz skróconą, uproszczoną implementację wnioskowania za pomocą 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()

Skompilowany model (CompiledModel)

Interfejs Compiled Model API (CompiledModel) odpowiada za wczytywanie modelu, stosowanie akceleracji sprzętowej, tworzenie instancji środowiska wykonawczego, tworzenie buforów wejściowych i wyjściowych oraz uruchamianie wnioskowania.

Poniższy uproszczony fragment kodu pokazuje, jak interfejs Compiled Model API pobiera model LiteRT (.tflite) i tworzy skompilowany model gotowy do uruchomienia wnioskowania.

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

Poniższy uproszczony fragment kodu pokazuje, jak interfejs CompiledModel API przyjmuje bufor wejściowy i wyjściowy oraz przeprowadza wnioskowanie za pomocą skompilowanego modelu.

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

Aby uzyskać pełniejszy obraz implementacji interfejsu CompiledModel API, zapoznaj się z kodem źródłowym w pliku Model.kt.

Bufor tensora (TensorBuffer)

LiteRT zapewnia wbudowaną obsługę interoperacyjności buforów wejścia/wyjścia za pomocą interfejsu Tensor Buffer API (TensorBuffer), który obsługuje przepływ danych do i z CompiledModel. Interfejs Tensor Buffer API umożliwia zapisywanie (Write<T>()) i odczytywanie (Read<T>()) oraz blokowanie buforów.

Aby uzyskać pełniejszy obraz implementacji interfejsu Tensor Buffer API, zapoznaj się z kodem źródłowym w TensorBuffer.kt.