Kotlin で Android で LiteRT Next を実行する

LiteRT Next API は Kotlin で使用できます。これにより、Android デベロッパーは高レベルの API にアクセスしてシームレスな開発体験を得ることができます。

Kotlin で LiteRT Next アプリケーションを作成する場合の例については、Kotlin を使用した画像分割デモをご覧ください。

使ってみる

Android アプリに LiteRT Next を追加する手順は次のとおりです。

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)

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

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