在 Android 上使用 Kotlin 執行 LiteRT 編譯模型 API

LiteRT 編譯模型 API 提供 Kotlin 版本,可為 Android 開發人員提供無縫的加速器優先體驗,以及高階 API。

如需 Kotlin 中的 LiteRT 應用程式範例,請參閱「使用 Kotlin 進行圖像分割示範」。

開始使用

請按照下列步驟,將 LiteRT 編譯模型 API 新增至 Android 應用程式。

新增 Maven 套件

使用已編譯模型 API,將 LiteRT 依附元件新增至應用程式:

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 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 內建支援 I/O 緩衝區互通性,並使用 Tensor Buffer API (TensorBuffer) 處理 CompiledModel 的資料流。Tensor Buffer API 可用於寫入 (Write<T>())、讀取 (Read<T>()) 及鎖定緩衝區。

如要更全面地瞭解 Tensor Buffer API 的實作方式,請參閱 TensorBuffer.kt 的原始碼。