使用 Kotlin 在 Android 上运行 LiteRT Next

LiteRT Next API 可在 Kotlin 中使用,可让 Android 开发者通过访问高级 API 获得流畅的开发体验。

如需查看 Kotlin 中的 LiteRT Next 应用示例,请参阅使用 Kotlin 进行图像分割的演示

开始使用

请按以下步骤将 LiteRT Next 添加到您的 Android 应用。

添加 Maven 软件包

将 LiteRT Next 依赖项添加到您的应用:

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

创建已编译的模型

使用 CompiledModel API,使用模型和您选择的硬件加速功能初始化运行时:

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

创建输入和输出缓冲区

创建必要的数据结构(缓冲区),以存储您要馈送给模型进行推理的输入数据,以及模型在运行推理后生成的输出数据。

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

如果您使用的是 CPU 内存,请直接将数据写入第一个输入缓冲区以填充输入。

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

调用模型

提供输入和输出缓冲区,运行已编译的模型。

model.run(inputBuffers, outputBuffers)

检索输出

通过直接从内存中读取模型输出来检索输出。

val outputFloatArray = outputBuffers[0].readFloat()

主要概念和组件

如需了解 LiteRT Next Kotlin API 的主要概念和组件,请参阅以下部分。

基本推理(CPU)

以下是使用 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) 负责加载模型、应用硬件加速、实例化运行时、创建输入和输出缓冲区以及运行推理。

以下简化版代码段演示了 Compiled Model API 如何获取 LiteRT 模型 (.tflite) 并创建一个已准备好运行推理的已编译模型。

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

以下简化版代码段演示了 CompiledModel API 如何接受输入和输出缓冲区,以及如何使用已编译的模型运行推理。

// 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 的实现方式,请参阅 Model.kt 中的源代码。

张量缓冲区 (TensorBuffer)

LiteRT Next 内置了对 I/O 缓冲区互操作性的支持,使用 Tensor Buffer API (TensorBuffer) 来处理数据进出 CompiledModel 的流动。Tensor Buffer API 提供写入 (Write<T>())、读取 (Read<T>()) 和锁定缓冲区的能力。

如需更全面地了解 Tensor Buffer API 的实现方式,请参阅 TensorBuffer.kt 中的源代码。