TF Lite Delegate는 TensorFlow Lite의 구성 요소로, 신경망 연산 실행을 특화된 하드웨어(GPU, NPU, DSP 또는 최적화된 CPU)로 리디렉션합니다. 델리게이트가 없으면 모델은 완전 호환 모드로 CPU에서 실행됩니다 — 느리지만 예측 가능합니다. 델리게이트는 칩과 모델에 따라 추론을 3~10배 가속화합니다. TensorFlow, 2025에 따르면, GPU 및 NNAPI 델리게이트는 정확도를 크게 떨어뜨리지 않고 추론 지연 시간을 60~90% 줄입니다.
주요 포인트
TF Lite Delegate는 TensorFlow Lite Runtime과 디바이스의 하드웨어 가속기 간의 소프트웨어 어댑터입니다. 델리게이트는 모델 그래프 연산(합성곱, 풀링, 행렬 곱셈)을 가로채서 CPU 대신 특수화된 컴퓨팅 유닛에서 실행합니다. 델리게이트가 특정 연산을 지원하지 않는 경우 CPU에서 실행됩니다 — 이를 부분 델리게이션이라고 합니다.
TF Lite Delegate 아키텍처는 SimpleDelegate API 인터페이스와 C++의 TfLiteDelegate 구조체를 기반으로 구축됩니다. 각 델리게이트는 그래프 노드 델리게이션, 메모리 할당 및 대상 디바이스에서 실행 메서드를 구현합니다. 개발자는 Invoke를 호출하기 전에 Interpreter::ModifyGraphWithDelegate를 통해 델리게이트를 연결합니다. TensorFlow 가이드에 따르면, 델리게이트는 모델의 지원되는 모든 연산에 자동으로 적용됩니다.
호환성 확인은 필수 단계입니다. 모든 연산이 모든 델리게이트에서 지원되는 것은 아닙니다. TensorFlow Lite는 Delegation Compatibility Check 도구를 제공합니다: 델리게이트로 모델을 실행하고 델리게이트된 연산(ops) 수를 확인하세요. 80% 미만이 델리게이트된 경우 다른 델리게이트를 선택하거나 CPU를 사용하는 것을 고려하세요. TensorFlow(2025)에 따르면, GPU Delegate는 45개 연산을 지원하고, NNAPI는 60개 이상을 지원합니다.
IT Sectr 프로젝트에서는 iOS에 GPU 델리게이트를, Android에 XNNPACK을 기본 제공 호환성 검증과 함께 사용합니다: 모델을 모든 델리게이트에서 테스트하고, 최소 90% 델리게이션 완료율로 가장 빠른 것을 선택합니다.
// Android에서 GPU Delegate 연결
val gpuDelegate = GpuDelegate()
val options = Interpreter.Options().apply {
addDelegate(gpuDelegate)
setNumThreads(4)
}
val interpreter = Interpreter(modelBuffer, options)
interpreter.run(input, output)
gpuDelegate.close()
델리게이트된 연산 확인 — Interpreter를 통한 호환성 제어. 기본적으로 델리게이트는 지원하는 모든 연산을 수락합니다. 디버깅을 위해 델리게이트된 노드 수의 로깅을 사용하세요. 모델에 사용자 정의 연산(custom ops)이 포함된 경우 델리게이트는 가속하지 않지만 중단시키지도 않습니다 — CPU에서 실행됩니다.
// 델리게이트된 연산 수 확인
val delegateCount = interpreter.getDelegateOpsCount(gpuDelegate)
val totalNodes = interpreter.getNodesCount()
Log.d("TFLite", "델리게이트됨: $delegateCount / $totalNodes")
if (delegateCount < totalNodes * 0.8) {
// 80% 임계값 — 다른 델리게이트 선택
}
GPU Delegate는 OpenGL ES 3.1+(Android) 또는 Metal(iOS)을 통해 GPU에서 모델을 실행하기 위한 TensorFlow Lite 델리게이트입니다. 그래픽 프로세서는 병렬 행렬 연산에 최적화되어 있어 Core ML 및 합성곱 신경망(CNN)이 가장 큰 이점을 얻습니다. GPU Delegate는 MobileNet, EfficientNet, Inception과 같은 모델의 추론 지연 시간을 4~8배 줄입니다.
GPU Delegate 제한 사항: 모든 연산을 지원하지 않으며(TF Lite의 약 120개 중 45개만), OpenGL ES 3.1 또는 Metal이 필요하고, CPU보다 전력을 더 소비합니다. GPU는 모바일 시나리오에서 배치 크기 > 1에 비효율적입니다. TensorFlow 벤치마크(2025)에 따르면, Adreno 740 GPU를 탑재한 Pixel 8에서 MobileNetV2는 GPU에서 4.2ms, CPU에서 18.7ms로 실행되어 4.4배 가속됩니다.
GPU Delegate 구성에는 정밀도 선택이 포함됩니다: float16은 정확도를 낮추지만 대부분의 작업에서 눈에 띄는 품질 저하 없이 추론을 30~40% 가속화합니다. 최대 GPU 성능을 위해 allow_precision_loss=true를 활성화하세요. 고정밀 작업(의료, 금융)의 경우 float32를 사용하세요.
// 정밀도 최적화를 사용한 GPU Delegate
val gpuOptions = GpuDelegateFactory.Options().apply {
isPrecisionLossAllowed = true
inferencePreference = GpuDelegateFactory.Options.InferencePreference.SUSTAINED_SPEED
}
val delegate = GpuDelegateFactory.create(gpuOptions)
iOS의 GPU Delegate는 Metal Delegate를 통해 Metal Performance Shaders를 사용합니다. iOS에서 델리게이트는 Apple Neural Engine용 Core ML 델리게이트 또는 직접 Metal을 통해 작동합니다. Apple A17 Pro는 MobileNetV2를 1.3ms에 실행하여 CPU보다 6배 빠릅니다. Metal 델리게이트는 iOS 12부터 사용 가능하며 A7+ 칩을 탑재한 모든 디바이스를 지원합니다.
NNAPI Delegate(Android Neural Networks API)는 Android NN HAL(Hardware Abstraction Layer)을 통해 하드웨어 가속을 사용하는 TF Lite 델리게이트입니다. NNAPI는 사용 가능한 디바이스 드라이버에 따라 모델 연산을 NPU, DSP 또는 GPU로 리디렉션합니다. Android 8.1+(API 27+)에서 지원되며 Android의 기본 권장 델리게이트입니다.
NNAPI 이점 — 자동 가속기 선택. 디바이스에 NPU(Qualcomm Hexagon, MediaTek APU, Samsung NPU)가 있는 경우 NNAPI는 해당 장치로 연산을 델리게이트합니다. NPU가 없는 경우 OpenCL을 통해 GPU로. GPU도 지원되지 않는 경우 DSP 최적화와 함께 CPU로. 개발자는 특정 가속기를 지정하지 않습니다 — NNAPI가 최적의 것을 선택합니다. Google I/O 2024에 따르면, Snapdragon 8 Gen 3의 NNAPI 델리게이트는 LLM 모델을 12배 가속화합니다.
NNAPI 제한 사항: 디바이스 간 지원이 고르지 않습니다. 오래된 디바이스(Android 8.1)는 드라이버 세트가 제한적입니다. Kirin을 탑재한 Huawei는 Google Services를 통한 NNAPI를 지원하지 않습니다 — GPU Delegate를 사용하세요. 보장된 호환성을 위해 Google은 GPU 또는 XNNPACK으로의 폴백과 함께 NNAPI Delegate를 첫 번째 선택으로 권장합니다.
// CPU 폴백을 사용한 NNAPI Delegate
val nnApiOptions = NnApiDelegate.Options().apply {
acceleratorName = null // null = 자동 선택
allowFp16 = true
executionPreference = NnApiDelegate.ExecutionPreference.SUSTAINED_SPEED
}
val delegate = NnApiDelegate(nnApiOptions)
val interpreter = Interpreter(model, Interpreter.Options().apply {
addDelegate(delegate)
setNumThreads(4)
})
NNAPI 가속기 이름 — 명시적 가속기 선택을 위한 매개변수입니다. null을 전달하면 NNAPI가 자동으로 선택합니다. 테스트를 위해 특정 이름을 지정하세요: "qti", "google-edgetpu", "mediatek". 사용 가능한 가속기 목록은 NnApiDelegate.getAvailableAccelerators()를 통해 출력됩니다. 프로덕션에서는 호환성 임계값과 함께 자동 선택을 사용하세요.
XNNPACK Delegate는 SIMD 명령어(ARM NEON, SSE, AVX)를 통한 최적화된 CPU 실행을 위한 TensorFlow Lite 델리게이트입니다. XNNPACK은 GPU나 NPU가 필요하지 않습니다 — 순수 CPU 델리게이트이지만 SIMD, 연산자 융합, 메모리 프리페치 및 양자화된 추론(INT8)을 통해 2~4배 가속화됩니다. 전용 NPU가 없는 디바이스나 보장된 호환성이 필요한 경우에 이상적입니다.
XNNPACK은 Google에서 CPU용 기본 TF Lite 델리게이트로 개발했습니다(기본적으로 TFLite Runtime에 포함됨). 90개 이상의 연산을 지원하여 GPU나 NNAPI보다 많습니다. XNNPACK은 양자화된 모델(INT8, INT16)에 특히 효과적입니다: 연산이 float32 버전보다 2~3배 빠르게 실행됩니다. Google 벤치마크(2025)에 따르면, XNNPACK은 INT8 MobileNetV2를 기준 CPU 대비 2.8배 가속화합니다.
XNNPACK 대 GPU: NPU가 없는 디바이스에서 XNNPACK은 작은 배치(1~4)의 경우 GPU Delegate보다 종종 빠릅니다 — GPU는 CPU와 GPU 간 데이터 전송에 오버헤드가 있습니다. XNNPACK은 동일한 CPU 주소 공간에서 작동하므로 메모리 복사가 없습니다. 최대 5MB 모델의 경우 XNNPACK이 GPU보다 빠를 수 있습니다. 대규모 CNN 모델의 경우 병렬 처리로 인해 GPU가 우세합니다.
// TFLite 2.18+에서 기본 활성화된 XNNPACK Delegate
// XnnpackDelegate를 통한 명시적 사용
val xnnpackOptions = XnnpackDelegate.Options().apply {
numThreads = 4
flags = XnnpackDelegate.Flags.USE_XNNPACK
}
val delegate = XnnpackDelegate(xnnpackOptions)
val interpreter = Interpreter(modelBuffer, Interpreter.Options().apply {
addDelegate(delegate)
})
XNNPACK 플래그: USE_XNNPACK — 델리게이트를 강제로 활성화, FLUSH_TO_ZERO — 가속을 위한 비정규화된 숫자 처리, ENABLE_XNNPACK_SHAPES — 동적 입력 크기. 최대 호환성을 위해 기본 옵션을 사용하세요. 오래된 디바이스에서 오류가 발생하면 XNNPACK을 비활성화하세요 — 모델은 CPU에서 계속 실행되지만 더 느립니다.
Core ML Delegate는 Apple Core ML Framework를 사용하는 iOS용 TensorFlow Lite 델리게이트입니다. Core ML은 TF Lite 모델을 .mlmodel 형식으로 변환하고 Apple Neural Engine(ANE), GPU(Metal) 또는 CPU에서 실행합니다. Apple A17 Pro 및 M3에는 전용 Neural Engine이 있으며 Core ML이 자동으로 사용합니다. Core ML Delegate는 최신 iOS 디바이스에서 CPU보다 추론을 5~10배 가속화합니다.
iOS의 Core ML은 flex delegate(Core ML에서 사용 가능한 연산의 동적 델리게이션)와 전체 모델 변환(전체 모델을 .mlmodel으로 변환)을 지원합니다. Apple은 flex delegate를 권장합니다 — 사전 변환 없이 런타임에서 작동하므로 더 빠릅니다. Core ML Delegate는 float32, float16 및 양자화된 모델(INT8)을 지원합니다.
Metal Delegate는 Metal Performance Shaders와 직접 작동하는 저수준 델리게이트입니다. Core ML이 특정 연산을 지원하지 않는 경우 Metal을 사용하세요. Metal Delegate는 GPU를 최대한 제어할 수 있지만 더 많은 코드가 필요합니다. Apple(WWDC 2024)에 따르면, 네이티브 Swift 모델용 Metal Delegate는 변환 오버헤드가 없어 Core ML보다 15~20% 빠를 수 있습니다.
// TFLite Swift API를 통한 iOS의 Core ML Delegate
import TensorFlowLite
let coreMLDelegate = CoreMLDelegate()
var options = InterpreterOptions()
options.addDelegate(coreMLDelegate)
let interpreter = try Interpreter(modelPath: modelPath, options: options)
try interpreter.invoke(at: 0)
Core ML과 Metal 선택: 프로덕션에는 Core ML, 엣지 케이스에는 Metal. Core ML은 NE 메모리를 자동으로 관리하고, CPU 폴백을 지원하며, 수동 변환이 필요하지 않습니다. Metal은 버퍼 제어를 제공하고 사용자 정의 연산에 적합합니다. IT Sectr 프로젝트에서는 모든 iOS 모델에 Core ML Delegate를 사용하고 실시간 비디오 분석 작업에만 Metal을 사용합니다.
TF Lite Delegate 선택은 대상 플랫폼, 모델 및 지연 시간 요구 사항에 따라 달라집니다. 보편적으로 최고의 델리게이트는 없습니다 — 각각 장단점이 있습니다. 최적의 전략: 대상 디바이스에서 사용 가능한 모든 델리게이트를 테스트하고 최소한으로 빠른 것을 선택하세요 — 가장 빠른 것이 아니라 최소한으로 충분한 것입니다.
| 델리게이트 | 플랫폼 | 가속 | 호환성 |
|---|---|---|---|
| GPU | Android, iOS | 4~8배 | 45개 연산 |
| NNAPI | Android 8.1+ | 3~12배 | 60+개 연산 |
| XNNPACK | Android, iOS | 2~4배 | 90+개 연산 |
| Core ML | iOS 12+ | 5~10배 | 50+개 연산 |
선택 권장 사항: NPU가 있는 Android(Snapdragon 8 Gen 2+, Dimensity 9000+) — NNAPI Delegate. NPU가 없는 Android — XNNPACK Delegate(기본값). iOS — Core ML Delegate. 크로스 플랫폼 프로젝트의 경우 전략 사용: Android에서 NNAPI, iOS에서 Core ML, 폴백으로 XNNPACK. GPU Delegate — NNAPI를 사용할 수 없고 XNNPACK이 충분히 빠르지 않은 경우.
지연 시간 테스트는 선택의 필수 단계입니다. 최소 온도(차가운 디바이스)와 5분 연속 작동 후(열 스로틀링) 추론을 측정하세요. GPU와 NNAPI는 가열 시 성능이 저하될 수 있습니다. XNNPACK(CPU)은 덜 영향을 받습니다. TensorFlow Lite Benchmark Tool을 사용하여 디바이스에서 모든 델리게이트를 자동 테스트하세요.
// 델리게이트 선택 전략
fun selectDelegate(): TfLiteDelegate {
return when {
NnApiDelegate.getAvailableAccelerators()?.isNotEmpty == true ->
NnApiDelegate()
GpuDelegateFactory.isGpuDelegateAvailable() ->
GpuDelegate()
else -> XnnpackDelegate()
}
}
폴백 전략 — 예외 없이 모델 로드: 델리게이트가 지원되지 않으면 CPU에서 실행합니다. TensorFlow Lite는 델리게이트 생성 오류 시 IllegalArgumentException을 throw합니다. 델리게이트 생성을 try-catch로 감싸고 오류 시 델리게이트 없이 모델을 실행하세요. 느리지만 작동하는 AI가 사용자에게 오류보다 낫습니다.
자주 묻는 질문
TF Lite Delegate는 모바일 디바이스에서 신경망을 위한 가속기입니다. CPU에서 모델을 느리게 실행하는 대신 델리게이트가 계산을 GPU나 특수 신경 칩(NPU)으로 보냅니다. CPU를 범용 도구로, 델리게이트를 특정 작업을 위한 특수 기계로 생각하세요: 같은 작업을 하지만 몇 배 더 빠릅니다.
가장 빠른 델리게이트는 디바이스에 따라 다릅니다. Neural Engine(Apple A17 Pro, Snapdragon 8 Gen 3)이 있는 디바이스에서는 NNAPI(Android) 또는 Core ML(iOS)이 최대 10~12배 가속을 제공합니다. GPU Delegate가 두 번째로 빠릅니다. XNNPACK(CPU)은 델리게이트 중 가장 느리지만 가장 호환성이 높습니다. NPU가 없는 디바이스에서는 XNNPACK 또는 GPU가 최적일 수 있습니다.
아니요, 각 델리게이트는 제한된 연산 세트를 지원합니다. GPU Delegate — 45개, NNAPI — 60개 이상, XNNPACK — 90개 이상. 지원되지 않는 연산은 CPU에서 실행됩니다(부분 델리게이션). 사용자 정의 연산(custom ops)의 경우 델리게이트가 적용되지 않습니다. 사용 전에 getDelegateOpsCount로 호환성을 확인하세요 — 노드의 80% 미만이 델리게이트된 경우 다른 델리게이트를 선택하세요.
build.gradle에 종속성 추가: implementation 'org.tensorflow:tensorflow-lite-gpu-delegate:+' 또는 'org.tensorflow:tensorflow-lite:x.x.x'(XNNPACK 내장). 델리게이트 생성(GpuDelegate(), NnApiDelegate(), XnnpackDelegate()) 후 Interpreter.Options.addDelegate()에 전달. 인터프리터 실행 — 델리게이트가 자동으로 적용됩니다. 실행 후 close()를 통해 델리게이트를 닫습니다.
네, TF Lite는 여러 델리게이트를 지원합니다 — 순차적으로 적용됩니다. 인터프리터는 첫 번째 델리게이트에 연산을 델리게이트하려고 시도하고, 그 다음 두 번째, 이런 식으로 진행됩니다. 어떤 델리게이트도 연산을 지원하지 않으면 CPU에서 실행됩니다. 이는 폴백에 유용합니다: 먼저 NNAPI, 그 다음 GPU, 그 다음 XNNPACK. 추가 순서가 우선순위에 영향을 줍니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.