TF Lite Interpreterは、モバイルおよび組み込みデバイスで.tfliteモデルを実行する役割を担うTensorFlow Liteの主要コンポーネントです。インタープリタはモデルのFlatBuffers表現をロードし、入力データと出力データのテンソルを割り当て、計算グラフを実行して結果を返します。TensorFlow Lite APIリファレンス(2025年)によると、InterpreterはAndroid向けにJavaおよびC++、iOS向けにSwiftおよびObjective-C、テスト用にPythonバインディングを通じて利用可能です。TF Lite InterpreterはGPU、NNAPI、Core MLを介したハードウェアアクセラレーションのためのデリゲートをサポートしています。
主要ポイント
TF Lite Interpreterは、サーバーインフラを必要とせずにデバイス上で機械学習モデルを実行するミニマルなランタイムです。インタープリタはトレーニングをサポートせず、推論のみを行います。これにより軽量で、Androidのベースインタープリタのバイナリサイズは約300KBです。
インタープリタは、FlatBuffersに基づく.tflite形式のモデルを扱います。作成時、インタープリタはmmapを介してモデルをメモリにロードし、コピーなしでデータに直接アクセスできます。その後、インタープリタはモデルの記述に基づいてテンソルを割り当て、実行準備が整います。
各インタープリタインスタンスはスレッドセーフではありません。同じモデルを複数のスレッドで並列実行するには、モデルの個別コピーを持つ別々のインタープリタインスタンスを作成します。単一スレッドでの逐次呼び出しには、インタープリタインスタンスを再利用できます。
Androidでは、インタープリタはorg.tensorflow.lite.InterpreterパッケージのJava APIを通じて利用できます。主要なメソッドはrun(Object input, Object output)で、多次元配列またはByteBufferを受け入れます。より細かい制御には、runForMultipleInputsOutputs()およびresizeInput()メソッドを使用します。
iOSでは、インタープリタはTensorFlowLiteモジュールのSwift APIを通じて利用できます。基本インターフェースはAndroidと同様で、Interpreter.init(modelPath:)による初期化、allocateTensors()によるテンソル割り当て、invoke()による実行を行います。Swift APIは入力データ型としてDataとMLMultiTensorをサポートしています。
| プラットフォーム | 言語 | クラス | 推論メソッド |
|---|---|---|---|
| Android | Java / Kotlin | Interpreter | run(), runForMultipleInputsOutputs() |
| Android(ネイティブ) | C++ | Interpreter | Invoke() |
| iOS | Swift / Obj-C | Interpreter | invoke() |
| Linux / Python | Python | Interpreter | get_tensor(), invoke() |
デリゲートは演算の実行を専用ハードウェアにオフロードするコンポーネントです。GPUデリゲートはOpenGL ES(Android)とMetal(iOS)を使用してグラフィックス演算を高速化します。NNAPIデリゲートはAndroid Neural Networks APIを介してNPU、DSP、またはGPUに実行をオフロードします。
Core MLデリゲートはiOSで利用可能で、TFLite演算をCore ML形式に変換します。Apple ML Benchmarkingによると、iPhone 15 ProでCore MLデリゲートを使用すると、CPUと比較して推論が最大4倍高速化されます。このデリゲートはFP32およびFP16演算をサポートしています。
XNNPACKデリゲートはARM CPU向けの汎用的なソリューションで、モバイルプロセッサ向けに最適化されています。特別なハードウェアを必要とせず、INT8、FP16、FP32をサポートします。すべてのデバイスで動作するベースラインデリゲートとして推奨されます。
インタープリタは、allocateTensors()を呼び出したときに割り当てられるメモリプールを通じてテンソルを管理します。プールサイズは.tfliteファイル内のモデル記述に基づいて決定されます。割り当て後、インタープリタは推論中に追加のメモリを割り当てません。
動的な入力サイズのモデルには、resizeInput()を使用します。このメソッドは、新しいサイズに従って入力テンソルのメモリを再割り当てします。入力テンソルのサイズ変更後、allocateTensors()による再割り当てが必要になる場合があります。
複数のモデルを扱う場合は、close()を使用してリソースを解放することが重要です。解放されていないインタープリタは、特にRAMが限られているデバイスでメモリリークを引き起こす可能性があります。iOSでは自動参照カウントARCを使用し、Androidではtry-with-resourcesまたは明示的なclose()呼び出しを使用します。
インタープリタを使用する際の最も一般的なエラーはテンソルの次元不一致です。入力データが期待される形状と一致しない場合、インタープリタはAndroidではIllegalArgumentExceptionを、iOSでは実行時エラーをスローします。inputTensorAt()およびoutputTensorAt()を使用して次元を確認してください。
2番目に一般的な問題は、デリゲート使用時のサポートされていない演算子です。デリゲートが演算子をサポートしていない場合、インタープリタはその演算子に対して自動的にCPUにフォールバックします。このような状況を特定するには、setCancelled()を使用してログを有効にするか、TFLiteログを確認します。
TFLiteはプロファイリング用のベンチマークツールを提供しています。各演算子の実行時間、メモリ消費量、デリゲート比較を測定します。ベンチマークツールはTFLiteサポートライブラリの一部として利用可能で、デバイス上で直接実行できます。
GPUデリゲートを使用したAndroidのJava APIでのモデル実行例。インタープリタはGPUデリゲートを含むオプションで作成されます。推論後、結果は出力テンソルから読み取られます:
import org.tensorflow.lite.Interpreter;
import org.tensorflow.lite.gpu.GpuDelegate;
import java.nio.MappedByteBuffer;
MappedByteBuffer model = loadModelFile(context);
GpuDelegate gpu = new GpuDelegate();
Interpreter.Options opts = new Interpreter.Options().addDelegate(gpu);
Interpreter interpreter = new Interpreter.create(model, opts);
float[][] input = preprocessImage(bitmap);
float[][] output = new float[1][1000];
interpreter.run(input, output);
int bestClass = argmax(output[0]);
Log.d("TFLite", "トップクラス: " + bestClass);
gpu.close();
interpreter.close();
デプロイ前のテスト用Pythonでの実行例。TFLite Python APIを使用すると、.tfliteをロードし、推論を実行して結果を出力できます。デバッグとモデル精度の検証に使用されます:
import tensorflow as tf
import numpy as np
# ファイルからTFLiteモデルをロード
interpreter = tf.lite.Interpreter(model_path="model.tflite")
interpreter.allocate_tensors()
# 入力および出力テンソルの詳細を取得
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
# テスト用のランダム入力データを準備
input_data = np.random.randn(
*input_details[0]["shape"]
).astype(np.float32)
interpreter.set_tensor(input_details[0]["index"], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]["index"])
print("出力形状:", output_data.shape)
よくある質問
Androidのベースインタープリタは約300KBを占めます。追加のメモリはモデルテンソルに割り当てられ、入力データサイズ、演算子の数、量子化モードによって異なります。
単一のインタープリタインスタンスはスレッドセーフではありません。並列実行するには、モデルの個別コピーを持つ複数のインスタンスを作成します。各インスタンスはテンソル用に独自のメモリを使用します。
TFLiteサポートライブラリのDelegatesApiクラスを使用します。DelegatesApi.getAvailableDelegates()を呼び出して、特定のデバイスで利用可能なデリゲートのリストを取得します。
tf.lite.experimental.Analyzerを使用して.tfliteファイルの整合性を確認してください。モデルが正しいTFLiteバージョンに変換され、ターゲットデバイスで利用可能な演算をサポートしていることを確認します。
Java APIではresizeInput(int idx, int[] dims)メソッド、SwiftではresizeInput(at:to:)を使用します。サイズ変更後、allocateTensors()を呼び出してメモリを再割り当てします。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。