使用 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) 負責載入模型、套用硬體加速、例項化執行階段、建立輸入和輸出緩衝區,以及執行推論。

以下簡化的程式碼片段示範如何使用已編譯模型 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 中的原始碼。