TF Lite Delegate — مؤلفهای از TensorFlow Lite است که اجرای عملیات شبکه عصبی را به سختافزار تخصصی هدایت میکند: GPU، NPU، DSP یا CPU بهینهشده. بدون نماینده، مدل روی CPU در حالت سازگاری کامل اجرا میشود — آهسته اما قابل پیشبینی. نماینده استنتاج را ۳–۱۰ برابر بسته به تراشه و مدل加速 میبخشد. طبق دادههای TensorFlow، ۲۰۲۵، نمایندگان GPU و NNAPI تأخیر استنتاج را ۶۰–۹۰٪ بدون کاهش قابل توجه دقت کاهش میدهند.
نکات اصلی
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) واگذار شده است. اگر کمتر از ۸۰٪ باشد — بهتر است نماینده دیگری انتخاب کنید یا روی CPU بمانید. طبق TensorFlow (۲۰۲۵)، GPU Delegate از ۴۵ عملیات پشتیبانی میکند، NNAPI — ۶۰+.
در پروژههای IT Sectr ما از نمایندگان GPU برای iOS و XNNPACK برای Android با بررسی سازگاری داخلی استفاده میکنیم: مدل روی همه نمایندگان آزمایش میشود، سریعترین با کامل بودن واگذاری حداقل ۹۰٪ انتخاب میشود.
// اتصال 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 اجرا میشوند.
// تعداد عملیاتهای واگذار شده را بررسی کنید
val delegateCount = interpreter.getDelegateOpsCount(gpuDelegate)
val totalNodes = interpreter.getNodesCount()
Log.d("TFLite", "واگذار شده: $delegateCount / $totalNodes")
if (delegateCount < totalNodes * 0.8) {
// آستانه ۸۰٪ — نماینده دیگری انتخاب کنید
}
GPU Delegate — نماینده TensorFlow Lite برای اجرای مدل روی GPU از طریق OpenGL ES ۳.۱+ (Android) یا Metal (iOS). پردازندههای گرافیکی برای عملیات ماتریسی موازی بهینه شدهاند — Core ML و شبکههای عصبی کانولوشنی (CNN) بیشترین افزایش را دریافت میکنند. GPU Delegate تأخیر استنتاج را ۴–۸ برابر برای مدلهایی مانند MobileNet، EfficientNet، Inception کاهش میدهد.
محدودیتهای GPU Delegate: از همه عملیاتها پشتیبانی نمیکند (فقط ۴۵ از ~۱۲۰ در TF Lite)، نیاز به OpenGL ES ۳.۱ یا Metal دارد، انرژی بیشتری نسبت به CPU مصرف میکند. GPU برای batch size > ۱ در سناریوهای موبایل کارآمد نیست. طبق بنچمارکهای TensorFlow (۲۰۲۵)، در دستگاه Pixel 8 با GPU Adreno 740 مدل MobileNetV2 در ۴.۲ ms روی GPU در مقابل ۱۸.۷ ms روی CPU اجرا میشود — شتاب ۴.۴x.
تنظیم GPU Delegate شامل انتخاب دقت است: float16 دقت را کاهش میدهد اما استنتاج را ۳۰–۴۰٪ بدون افت قابل توجه کیفیت (برای اکثر وظایف) شتاب میبخشد. allow_precision_loss=true را برای حداکثر عملکرد روی GPU فعال کنید. برای وظایف با دقت بالا (پزشکی، مالی) از float32 استفاده کنید.
// 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 را در ۱.۳ ms اجرا میکند — ۶ برابر سریعتر از CPU. Metal delegate از iOS ۱۲ در دسترس است و از تمام دستگاههای دارای تراشه A7+ پشتیبانی میکند.
NNAPI Delegate (Android Neural Networks API) — نماینده TF Lite که از شتاب سختافزاری از طریق Android NN HAL (Hardware Abstraction Layer) استفاده میکند. NNAPI عملیات مدل را بسته به درایورهای موجود دستگاه به NPU، DSP یا GPU هدایت میکند. از Android ۸.۱+ (API ۲۷+) پشتیبانی میشود و نماینده پیشفرض توصیهشده برای Android است.
مزیت NNAPI — انتخاب خودکار شتابدهنده. اگر دستگاه NPU داشته باشد (Qualcomm Hexagon، MediaTek APU، Samsung NPU)، NNAPI عملیاتها را به آن واگذار میکند. اگر NPU نباشد — به GPU از طریق OpenCL. اگر GPU هم پشتیبانی نکند — به CPU با بهینهسازیهای DSP. توسعهدهنده شتابدهنده خاصی را مشخص نمیکند — NNAPI بهینه را انتخاب میکند. طبق Google I/O ۲۰۲۴، نماینده NNAPI در Snapdragon 8 Gen 3 مدلهای LLM را ۱۲ برابر شتاب میبخشد.
محدودیتهای NNAPI: پشتیبانی نابرابر در دستگاههای مختلف. دستگاههای قدیمی (Android ۸.۱) مجموعه محدودی از درایورها دارند. Huawei با Kirin از NNAPI از طریق Google Services پشتیبانی نمیکند — از GPU Delegate استفاده کنید. برای سازگاری تضمینی، Google NNAPI Delegate را به عنوان انتخاب اول با fallback به GPU یا XNNPACK توصیه میکند.
// 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() نمایش داده میشود. در production از انتخاب خودکار با آستانه سازگاری استفاده کنید.
XNNPACK Delegate — نماینده TensorFlow Lite برای اجرای بهینهشده روی CPU از طریق دستورالعملهای SIMD (ARM NEON، SSE، AVX). XNNPACK به GPU یا NPU نیاز ندارد — این یک نماینده خالص CPU است، اما با شتاب ۲–۴x به لطف SIMD، operator fusion، memory pre-fetching و quantized inference (INT8). ایدهآل برای دستگاههای بدون NPU اختصاصی یا زمانی که سازگاری تضمینی مورد نیاز است.
XNNPACK توسط Google به عنوان نماینده پیشفرض TF Lite برای CPU (به طور پیشفرض در TFLite Runtime گنجانده شده) توسعه یافته است. از ۹۰+ عملیات پشتیبانی میکند — بیشتر از GPU یا NNAPI. XNNPACK به ویژه برای مدلهای کوانتیزه (INT8، INT16) کارآمد است: عملیاتها ۲–۳ برابر سریعتر از نسخه float32 اجرا میشوند. طبق بنچمارکهای Google (۲۰۲۵)، XNNPACK INT8 MobileNetV2 را ۲.۸x نسبت به CPU پایه شتاب میبخشد.
XNNPACK در مقابل GPU: در دستگاههای بدون NPU، XNNPACK اغلب برای batch کوچک (۱–۴) سریعتر از GPU Delegate است — GPU سربار انتقال داده بین CPU و GPU دارد. XNNPACK در همان فضای آدرس CPU کار میکند — کپی حافظه وجود ندارد. برای مدلهای تا ۵MB، XNNPACK میتواند سریعتر از GPU باشد. برای مدلهای CNN بزرگ، GPU به دلیل موازیسازی برنده میشود.
// XNNPACK Delegate به طور پیشفرض در TFLite ۲.۱۸+ فعال است
// استفاده صریح از طریق 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 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 استنتاج را ۵–۱۰ برابر نسبت به 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 کار میکند. هنگامی که Core ML از عملیاتهای خاصی پشتیبانی نمیکند از Metal استفاده کنید. Metal Delegate حداکثر کنترل را روی GPU میدهد اما به کد بیشتری نیاز دارد. طبق Apple (WWDC ۲۰۲۴)، Metal Delegate برای مدلهای بومی Swift میتواند ۱۵–۲۰٪ سریعتر از Core ML به دلیل عدم سربار تبدیل باشد.
// 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 — برای production، Metal — برای موارد خاص. Core ML به طور خودکار حافظه NE را مدیریت میکند، از fallback به CPU پشتیبانی میکند و نیاز به تبدیل دستی ندارد. Metal کنترل روی بافرها را فراهم کرده و برای عملیاتهای سفارشی مناسب است. در پروژههای IT Sectr ما از Core ML Delegate برای همه مدلهای iOS و از Metal فقط برای وظایف تحلیل ویدئوی بلادرنگ استفاده میکنیم.
انتخاب TF Lite Delegate به پلتفرم هدف، مدل و نیازمندیهای تأخیر بستگی دارد. هیچ نماینده بهترین جهانی وجود ندارد — هر کدام نقاط قوت و ضعف خود را دارد. استراتژی بهینه: همه نمایندگان موجود را روی دستگاه هدف آزمایش کرده و حداقل سریع کافی را انتخاب کنید — نه سریعترین، بلکه حداقل کافی.
| نماینده | پلتفرم | شتاب | سازگاری |
|---|---|---|---|
| GPU | Android، iOS | ۴–۸x | ۴۵ عملیات |
| NNAPI | Android ۸.۱+ | ۳–۱۲x | ۶۰+ عملیات |
| XNNPACK | Android، iOS | ۲–۴x | ۹۰+ عملیات |
| Core ML | iOS ۱۲+ | ۵–۱۰x | ۵۰+ عملیات |
توصیههای انتخاب: برای 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 به اندازه کافی سریع نیست.
تست تأخیر — مرحله الزامی انتخاب. استنتاج را در حداقل دما (دستگاه سرد) و پس از ۵ دقیقه کار مداوم (تنظیم حرارتی) اندازه بگیرید. GPU و NNAPI ممکن است هنگام گرم شدن عملکرد را کاهش دهند. XNNPACK (CPU) کمتر آسیب میبیند. از TensorFlow Lite Benchmark Tool برای آزمایش خودکار همه نمایندگان در دستگاه خود استفاده کنید.
// استراتژی انتخاب نماینده
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 — شتابدهنده شبکههای عصبی در دستگاه موبایل است. به جای اجرای آهسته مدل روی CPU، نماینده محاسبات را به GPU یا تراشه عصبی ویژه (NPU) ارسال میکند. تصور کنید CPU یک ابزار همهمنظوره است و نماینده یک دستگاه ویژه برای وظایف خاص: همان کار را انجام میدهد اما چندین برابر سریعتر.
سریعترین نماینده به دستگاه بستگی دارد. در دستگاههای دارای Neural Engine (Apple A17 Pro، Snapdragon 8 Gen 3) — NNAPI (Android) یا Core ML (iOS) حداکثر شتاب تا ۱۰–۱۲x را ارائه میدهند. GPU Delegate از نظر سرعت دوم است. XNNPACK (CPU) کندترین نماینده اما سازگارترین است. در دستگاههای بدون NPU، XNNPACK یا GPU ممکن است بهینه باشند.
خیر، هر نماینده از مجموعه محدودی از عملیاتها پشتیبانی میکند. GPU Delegate — ۴۵ عملیات، NNAPI — ۶۰+، XNNPACK — ۹۰+. عملیاتهای پشتیبانینشده روی CPU اجرا میشوند (partial delegation). برای عملیاتهای سفارشی (custom ops) نماینده اعمال نمیشود. قبل از استفاده، سازگاری را از طریق getDelegateOpsCount بررسی کنید — اگر کمتر از ۸۰٪ گرهها واگذار شده باشند، نماینده دیگری انتخاب کنید.
وابستگی را به 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. ترتیب اضافه کردن بر اولویت تأثیر میگذارد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید