Kotlin を使用して Android で LiteRT コンパイル済みモデル API を実行する

LiteRT Compiled Model API は Kotlin で利用できます。Android デベロッパーは、高レベルの API を使用して、アクセラレータを優先したシームレスなエクスペリエンスを実現できます。

Kotlin での LiteRT アプリケーションの例については、Kotlin を使用した画像セグメンテーションのデモをご覧ください。

使ってみる

次の手順に沿って、LiteRT Compiled Model 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 Compiled Model 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 は、Tensor Buffer API(TensorBuffer)を使用して CompiledModel との間でデータの流れを処理することで、I/O バッファの相互運用性を組み込みでサポートします。Tensor Buffer API は、バッファの書き込み(Write<T>())、読み取り(Read<T>())、ロックを行う機能を提供します。

Tensor Buffer API の実装方法の詳細については、TensorBuffer.kt のソースコードをご覧ください。