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()을 통해 차원을 확인하십시오.
두 번째로 흔한 문제는 델리게이트 사용 시 지원되지 않는 연산자입니다. 델리게이트가 연산자를 지원하지 않으면 인터프리터는 해당 연산자에 대해 자동으로 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 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.