Запустите API скомпилированной модели LiteRT на Android с помощью Kotlin

API скомпилированной модели LiteRT доступно в Kotlin, предлагая разработчикам Android бесперебойный, в первую очередь ускорительный, опыт работы с API высокого уровня.

Пример приложения LiteRT на Kotlin см. в демонстрации «Сегментация изображений с помощью Kotlin» .

Начать

Чтобы добавить API скомпилированной модели LiteRT в ваше приложение Android, выполните следующие действия.

Добавить пакет Maven

Добавьте в свое приложение зависимость LiteRT с API скомпилированной модели:

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

Создать скомпилированную модель

Используя API CompiledModel , инициализируйте среду выполнения с помощью модели и выбранного вами аппаратного ускорения:

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

Создание входных и выходных буферов

Создайте необходимые структуры данных (буферы) для хранения входных данных, которые вы будете передавать в модель для вывода, и выходных данных, которые модель выдает после выполнения вывода.

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

Если вы используете память ЦП, заполните входы, записав данные непосредственно в первый входной буфер.

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

Вызов модели

Предоставив входные и выходные буферы, запустите скомпилированную модель.

model.run(inputBuffers, outputBuffers)

Получить выходы

Извлекайте выходные данные, напрямую считывая выходные данные модели из памяти.

val outputFloatArray = outputBuffers[0].readFloat()

Ключевые концепции и компоненты

Информацию о ключевых концепциях и компонентах API скомпилированной модели LiteRT Kotlin см. в следующих разделах.

Базовый вывод (ЦП)

Ниже представлена ​​сжатая, упрощенная реализация вывода с помощью 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()

Скомпилированная модель (CompiledModel)

API скомпилированной модели ( CompiledModel ) отвечает за загрузку модели, применение аппаратного ускорения, создание среды выполнения, создание входных и выходных буферов и запуск вывода.

Следующий упрощенный фрагмент кода демонстрирует, как API скомпилированной модели берет модель LiteRT ( .tflite ) и создает скомпилированную модель, готовую к выполнению вывода.

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

Следующий упрощенный фрагмент кода демонстрирует, как API CompiledModel принимает входной и выходной буферы и выполняет выводы с использованием скомпилированной модели.

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

Более полное представление о реализации API CompiledModel можно найти в исходном коде Model.kt .

Тензорный буфер (TensorBuffer)

LiteRT предоставляет встроенную поддержку взаимодействия с буферами ввода-вывода, используя API Tensor Buffer ( TensorBuffer ) для управления потоком данных в CompiledModel и из него. API Tensor Buffer предоставляет возможность записи ( Write<T>() ) и чтения ( Read<T>() ), а также блокировки буферов.

Более полное представление о реализации API Tensor Buffer можно найти в исходном коде на TensorBuffer.kt .