TF Lite Delegate: шта је то, делегати GPU и NNAPI

Аутор: IT Sectr Објављено: 2026-07-18 Време читања: 10 мин

TF Lite Delegate — компонента TensorFlow Lite која преусмерава извршавање операција неуронске мреже на специјализовани хардвер: GPU, NPU, DSP или оптимизовани CPU. Без делегата модел се извршава на CPU у режиму пуне компатибилности — споро, али предвидљиво. Делегат убрзава инференс 3–10 пута у зависности од чипа и модела. Према подацима TensorFlow, 2025, делегати GPU и NNAPI смањују латенцију инференса за 60–90% без значајног губитка прецизности.

Главне тачке

  • TF Lite Delegate — слој хардверског убрзања за TensorFlow Lite моделе
  • GPU Delegate — убрзава операције с покретним зарезом кроз OpenGL/Metal
  • NNAPI Delegate — користи Android Neural Networks API за NPU и DSP
  • XNNPACK Delegate — оптимизација CPU кроз SIMD инструкције (ARM NEON, SSE)
  • Core ML Delegate — изворна интеграција са Apple Neural Engine на iOS

Шта је TF Lite Delegate: архитектура и принцип рада

TF Lite Delegate — софтверски адаптер између TensorFlow Lite Runtime и хардверског акцелератора уређаја. Делегат пресреће операције графа модела (конволуције, пулинг, матрична множења) и извршава их на специјализованом рачунару уместо на CPU. Ако делегат не подржава одређену операцију, она се извршава на CPU — то се назива partial delegation.

Архитектура TF Lite Delegate се гради око интерфејса SimpleDelegate API и структуре TfLiteDelegate у C++. Сваки делегат имплементира методе делегирања чворова графа, алокације меморије и извршавања на циљном уређају. Програмер повезује делегата кроз Interpreter::ModifyGraphWithDelegate пре позива Invoke. Према TensorFlow Guide, делегат се аутоматски примењује на све подржане операције модела.

Провера компатибилности — обавезна фаза. Нису све операције подржане од сваког делегата. TensorFlow Lite пружа алат Delegation Compatibility Check: покрените модел са делегатом и проверите колико операција (ops) је делегирано. Ако мање од 80% — боље је изабрати другог делегата или остати на CPU. Према TensorFlow (2025), GPU Delegate подржава 45 операција, NNAPI — 60+.

У пројектима IT Sectr користимо делегате GPU за iOS и XNNPACK за Android са уграђеном провером компатибилности: модел се тестира на свим делегатима, бира се најбржи са комплетношћу делегирања од најмање 90%.

kotlin
// GPU Delegate повезивање на Android
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.

kotlin
// Проверите број делегираних операција
val delegateCount = interpreter.getDelegateOpsCount(gpuDelegate)
val totalNodes = interpreter.getNodesCount()
Log.d("TFLite", "Делегирано: $delegateCount / $totalNodes")
if (delegateCount < totalNodes * 0.8) {
    // Праг 80% — изаберите другог делегата
}

GPU Delegate: убрзање на графичком процесору

GPU Delegate — делегат TensorFlow Lite за извршавање модела на GPU кроз OpenGL ES 3.1+ (Android) или Metal (iOS). Графички процесори су оптимизовани за паралелне матричне операције — Core ML и конволуционе неуронске мреже (CNN) добијају највећи прираст. GPU Delegate смањује латенцију инференса 4–8 пута за моделе попут MobileNet, EfficientNet, Inception.

Ограничења GPU Delegate: не подржава све операције (само 45 од ~120 у TF Lite), захтева OpenGL ES 3.1 или Metal, троши више енергије од CPU. GPU је неефикасан за batch size > 1 у мобилним сценаријима. Према бенчмарковима TensorFlow (2025), на уређају Pixel 8 са GPU Adreno 740 модел MobileNetV2 се извршава за 4.2 ms на GPU наспрам 18.7 ms на CPU — убрзање од 4.4x.

Подешавање GPU Delegate укључује избор прецизности: float16 смањује прецизност, али убрзава инференс за 30–40% без приметног губитка квалитета (за већину задатака). Укључите allow_precision_loss=true за максималне перформансе на GPU. За задатке са високом прецизношћу (медицина, финансије) користите float32.

kotlin
// GPU Delegate са оптимизацијом прецизности
val gpuOptions = GpuDelegateFactory.Options().apply {
    isPrecisionLossAllowed = true
    inferencePreference = GpuDelegateFactory.Options.InferencePreference.SUSTAINED_SPEED
}
val delegate = GpuDelegateFactory.create(gpuOptions)

GPU Delegate на iOS користи Metal Performance Shaders кроз Metal Delegate. У iOS-у, делегат ради кроз Core ML delegate за Apple Neural Engine или директно кроз Metal. Apple A17 Pro извршава MobileNetV2 за 1.3 ms — 6 пута брже од CPU. Metal delegate је доступан од iOS 12 и подржава све уређаје са чипом A7+.

NNAPI Delegate: неуронске мреже на Android кроз Neural Networks API

NNAPI Delegate (Android Neural Networks API) — делегат TF Lite који користи хардверско убрзање кроз Android NN HAL (Hardware Abstraction Layer). NNAPI преусмерава операције модела на NPU, DSP или GPU у зависности од доступних драјвера уређаја. Подржан је на Android 8.1+ (API 27+) и препоручени је подразумевани делегат за Android.

Предност NNAPI — аутоматски избор акцелератора. Ако уређај има NPU (Qualcomm Hexagon, MediaTek APU, Samsung NPU), NNAPI делегира операције на њега. Ако NPU нема — на GPU кроз OpenCL. Ако ни GPU не подржава — на CPU са DSP оптимизацијама. Програмер не наводи конкретан акцелератор — NNAPI бира оптималан. Према Google I/O 2024, NNAPI delegate на Snapdragon 8 Gen 3 убрзава LLM моделе 12 пута.

Ограничења NNAPI: неравномерна подршка на различитим уређајима. Стари уређаји (Android 8.1) имају ограничен скуп драјвера. Huawei са Kirin не подржава NNAPI кроз Google Services — користите GPU Delegate. За гарантовану компатибилност, Google препоручује NNAPI Delegate као први избор, са fallback на GPU или XNNPACK.

kotlin
// NNAPI Delegate са fallback на CPU
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 Accelerator Name — параметар за експлицитан избор акцелератора. Ако се проследи null, NNAPI бира аутоматски. За тестирање наведите конкретан: "qti", "google-edgetpu", "mediatek". Листа доступних акцелератора се приказује кроз NnApiDelegate.getAvailableAccelerators(). У продукцији користите аутоматски избор са прагом компатибилности.

XNNPACK Delegate: оптимизација CPU кроз SIMD

XNNPACK Delegate — делегат TensorFlow Lite за оптимизовано извршавање на CPU кроз SIMD инструкције (ARM NEON, SSE, AVX). XNNPACK не захтева GPU или NPU — то је чисти CPU делегат, али са 2–4x убрзањем захваљујући SIMD, operator fusion, memory pre-fetching и quantized inference (INT8). Идеалан за уређаје без наменског NPU или када је потребна гарантована компатибилност.

XNNPACK је развио Google као подразумевани TF Lite делегат за CPU (укључен у TFLite Runtime подразумевано). Подржава 90+ операција — више од GPU или NNAPI. XNNPACK је посебно ефикасан за квантоване моделе (INT8, INT16): операције се извршавају 2–3 пута брже од float32 верзије. Према бенчмарковима Google (2025), XNNPACK убрзава INT8 MobileNetV2 2.8x у односу на базни CPU.

XNNPACK vs GPU: на уређајима без NPU, XNNPACK је често бржи од GPU Delegate за мале batch-ове (1–4) — GPU има overhead преноса података између CPU и GPU. XNNPACK ради у истом адресном простору CPU — нема копирања меморије. За моделе до 5MB, XNNPACK може бити бржи од GPU. За велике CNN моделе, GPU побеђује захваљујући паралелизму.

kotlin
// XNNPACK Delegate подразумевано укључен у TFLite 2.18+
// Експлицитна употреба кроз 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 Flags: USE_XNNPACK — присилно укључује делегата, FLUSH_TO_ZERO — обрада денормализованих бројева за убрзање, ENABLE_XNNPACK_SHAPES — динамичке величине улаза. За максималну компатибилност користите подразумеване опције. При појави грешака на старим уређајима искључите XNNPACK — модел и даље ради на CPU, али спорије.

Core ML и Metal Delegate: убрзање на iOS

Core ML Delegate — делегат TensorFlow Lite за iOS који користи Apple Core ML Framework. Core ML конвертује TF Lite модел у .mlmodel формат и извршава на Apple Neural Engine (ANE), GPU (Metal) или CPU. Apple A17 Pro и M3 имају наменски Neural Engine који Core ML аутоматски користи. Core ML Delegate убрзава инференс 5–10 пута у односу на CPU на савременим iOS уређајима.

Core ML на iOS подржава flex delegate (динамичко делегирање операција доступних Core ML) и full model conversion (конверзија целог модела у .mlmodel). Apple препоручује flex delegate — бржи је јер ради у рантајму без претходне конверзије. Core ML Delegate подржава float32, float16 и квантоване моделе (INT8).

Metal Delegate — делегат нижег нивоа који ради директно са Metal Performance Shaders. Користите Metal када Core ML не подржава поједине операције. Metal Delegate даје максималну контролу над GPU, али захтева више кода. Према Apple (WWDC 2024), Metal Delegate за изворне Swift моделе може бити 15–20% бржи од Core ML због недостатка overhead-а конверзије.

swift
// Core ML Delegate на iOS кроз TFLite Swift API
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 (fallback) и не захтева ручну конверзију. Metal даје контролу над баферима и погодан је за прилагођене операције. У пројектима IT Sectr користимо Core ML Delegate за све iOS моделе, а Metal само за задатке видеоаналитике у реалном времену.

Како одабрати делегата за пројекат

Избор TF Lite Delegate зависи од циљне платформе, модела и захтева за латенцијом. Не постоји универзално најбољи делегат — сваки има јаке и слабе стране. Оптимална стратегија: тестирајте све доступне делегате на циљном уређају и изаберите минимално довољно брзог — не најбржег, већ минимално довољног.

ДелегатПлатформаУбрзањеКомпатибилност
GPUAndroid, iOS4–8x45 операција
NNAPIAndroid 8.1+3–12x60+ операција
XNNPACKAndroid, iOS2–4x90+ операција
Core MLiOS 12+5–10x50+ операција

Препоруке за избор: за Android са NPU (Snapdragon 8 Gen 2+, Dimensity 9000+) — NNAPI Delegate. За Android без NPU — XNNPACK Delegate (подразумевани). За iOS — Core ML Delegate. За међуплатформске пројекте користите стратегију: NNAPI на Android-у, Core ML на iOS-у, XNNPACK као fallback. GPU Delegate — када NNAPI није доступан, а XNNPACK није довољно брз.

Тестирање латенције — обавезна фаза избора. Измерите инференс на минималној температури (уређај хладан) и после 5 минута непрекидног рада (thermal throttling). GPU и NNAPI могу смањити перформансе при загревању. XNNPACK (CPU) мање пати. Користите TensorFlow Lite Benchmark Tool за аутоматско тестирање свих делегата на вашем уређају.

kotlin
// Стратегија избора делегата
fun selectDelegate(): TfLiteDelegate {
    return when {
        NnApiDelegate.getAvailableAccelerators()?.isNotEmpty == true ->
            NnApiDelegate()
        GpuDelegateFactory.isGpuDelegateAvailable() ->
            GpuDelegate()
        else -> XnnpackDelegate()
    }
}

Fallback стратегија — учитавајте модел без изузетака: ако делегат није подржан, покрените на CPU. TensorFlow Lite баца IllegalArgumentException при грешци креирања делегата. Обмотите креирање делегата у try-catch и при грешци покрените модел без делегата. Спор, али функционалан AI бољи је од грешке за корисника.

Често постављана питања

Шта је TF Lite Delegate једноставним речима?

TF Lite Delegate — акцелератор за неуронске мреже на мобилном уређају. Уместо да извршава модел споро на CPU, делегат шаље прорачуне на GPU или специјални неурочип (NPU). Замислите да је CPU универзални алат, а делегат специјална машина за конкретне задатке: ради исто, али вишеструко брже.

Који TF Lite делегат је најбржи?

Најбржи делегат зависи од уређаја. На уређајима са Neural Engine (Apple A17 Pro, Snapdragon 8 Gen 3) — NNAPI (Android) или Core ML (iOS) дају максимално убрзање до 10–12x. GPU Delegate је други по брзини. XNNPACK (CPU) је најспорији од делегата, али најкомпатибилнији. На уређајима без NPU, XNNPACK или GPU могу бити оптимални.

Да ли TF Lite Delegate подржава све операције?

Не, сваки делегат подржава ограничен скуп операција. GPU Delegate — 45 операција, NNAPI — 60+, XNNPACK — 90+. Неподржане операције се извршавају на CPU (partial delegation). За прилагођене операције (custom ops) делегат се не примењује. Пре употребе проверите компатибилност кроз getDelegateOpsCount — ако је мање од 80% чворова делегирано, изаберите другог делегата.

Како повезати TF Lite Delegate у Android-у?

Додајте зависност у 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 подржава multiple delegates — примењују се секвенцијално. Интерпретатор покушава да делегира операцију првом делегату, затим другом, и тако даље. Ако ниједан делегат не подржава операцију — извршава се на CPU. Ово је корисно за fallback: прво NNAPI, затим GPU, затим XNNPACK. Редослед додавања утиче на приоритет.

Закључак

  • TF Lite Delegate — хардверски акцелератор TensorFlow Lite модела на мобилним уређајима
  • GPU Delegate — убрзање кроз OpenGL ES (Android) или Metal (iOS), 4–8x брже од CPU
  • NNAPI Delegate — кроз Android Neural Networks API, користи NPU/DSP/GPU, 3–12x
  • XNNPACK Delegate — оптимизација CPU кроз SIMD, 2–4x, максимална компатибилност (90+ ops)
  • Core ML Delegate — iOS убрзање кроз Neural Engine и Metal, 5–10x
  • Избор делегата — тестирајте на циљном уређају, користите fallback на CPU
  • Partial delegation — неподржане операције се аутоматски извршавају на CPU

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође