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 وهيكل TfLiteDelegate في C++. ينفذ كل مفوض طرق تفويض عقد الرسم البياني، تخصيص الذاكرة والتنفيذ على الجهاز المستهدف. يربط المطور المفوض عبر Interpreter::ModifyGraphWithDelegate قبل استدعاء Invoke. وفقاً لدليل TensorFlow، يتم تطبيق المفوض تلقائياً على جميع العمليات المدعومة في النموذج.
فحص التوافق خطوة إلزامية. ليست كل العمليات مدعومة من قبل كل مفوض. يوفر TensorFlow Lite أداة Delegation Compatibility Check: قم بتشغيل النموذج مع المفوض وتحقق من عدد العمليات (ops) التي تم تفويضها. إذا كانت أقل من 80% مفوضة، ففكر في اختيار مفوض آخر أو البقاء مع CPU. وفقاً لـ TensorFlow (2025)، يدعم GPU Delegate 45 عملية، NNAPI — 60+.
في مشاريع IT Sectr، نستخدم مفوضات GPU لنظام iOS و XNNPACK لنظام Android مع التحقق المدمج من التوافق: يتم اختبار النموذج على جميع المفوضات، واختيار الأسرع مع اكتمال تفويض لا يقل عن 90%.
// اتصال 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) {
// 80% عتبة — اختر مفوضاً آخر
}
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 غير فعال لحجم الدفعة > 1 في السيناريوهات المحمولة. وفقاً لمعايير TensorFlow (2025)، على Pixel 8 مع GPU Adreno 740، يعمل MobileNetV2 في 4.2 مللي ثانية على GPU مقابل 18.7 مللي ثانية على CPU — تسريع بمقدار 4.4x.
تكوين GPU Delegate يشمل اختيار الدقة: float16 تقلل الدقة ولكنها تسرع الاستدلال بنسبة 30–40% دون فقدان ملحوظ في الجودة (لمعظم المهام). فعّل 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 لـ Apple Neural Engine أو Metal مباشرة. Apple A17 Pro يشغل MobileNetV2 في 1.3 مللي ثانية — أسرع 6 مرات من CPU. مفوض Metal متاح منذ iOS 12 ويدعم جميع الأجهزة بشريحة A7+.
NNAPI Delegate (Android Neural Networks API) هو مفوض TF Lite يستخدم التسريع عبر الأجهزة من خلال Android NN HAL (طبقة تجريد الأجهزة). يعيد 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 على Snapdragon 8 Gen 3 على تسريع نماذج LLM بمقدار 12 مرة.
قيود NNAPI: دعم غير متساوٍ عبر الأجهزة المختلفة. الأجهزة القديمة (Android 8.1) لديها مجموعة محدودة من برامج التشغيل. Huawei مع Kirin لا يدعم NNAPI عبر Google Services — استخدم GPU Delegate. للتوافق المضمون، توصي Google باستخدام NNAPI Delegate كخيار أول، مع الرجوع إلى GPU أو XNNPACK.
// NNAPI Delegate مع الرجوع إلى 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 — معلمة للاختيار الصريح للمسرّع. إذا تم تمرير null، يختار NNAPI تلقائياً. للاختبار، حدد مسرّعاً معيناً: "qti"، "google-edgetpu"، "mediatek". يتم عرض قائمة المسرّعات المتاحة عبر NnApiDelegate.getAvailableAccelerators(). في الإنتاج، استخدم الاختيار التلقائي مع حد توافق.
XNNPACK Delegate هو مفوض TensorFlow Lite للتنفيذ المحسّن على CPU عبر تعليمات SIMD (ARM NEON، SSE، AVX). XNNPACK لا يتطلب GPU أو NPU — إنه مفوض CPU خالص، ولكن مع تسريع بمقدار 2–4 مرات بفضل SIMD، دمج المشغلين، الجلب المسبق للذاكرة والاستدلال الكمي (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 مقابل GPU: على الأجهزة بدون NPU، يكون XNNPACK غالباً أسرع من GPU Delegate للدفعات الصغيرة (1–4) — GPU لديه حمل زائد في نقل البيانات بين CPU و GPU. يعمل XNNPACK في نفس مساحة عنوان CPU — بدون نسخ ذاكرة. للنماذج حتى 5 ميجابايت، يمكن أن يكون XNNPACK أسرع من GPU. لنماذج CNN الكبيرة، يفوز GPU بفضل التوازي.
// 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: 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 الاستدلال بمقدار 5–10 مرات مقارنة بـ CPU على أجهزة iOS الحديثة.
Core ML على iOS يدعم flex delegate (التفويض الديناميكي للعمليات المتاحة لـ Core ML) وتحويل النموذج بالكامل (تحويل النموذج بأكمله إلى .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 بسبب عدم وجود حمل تحويل.
// 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 يعتمد على المنصة المستهدفة والنموذج ومتطلبات زمن الاستجابة. لا يوجد مفوض أفضل عالمياً — لكل منها نقاط قوة وضعف. الإستراتيجية المثلى: اختبر جميع المفوضات المتاحة على الجهاز المستهدف واختر الأسرع بالحد الأدنى — ليس الأسرع، بل الحد الأدنى الكافي.
| المفوض | المنصة | التسريع | التوافق |
|---|---|---|---|
| GPU | Android، iOS | 4–8x | 45 عملية |
| NNAPI | Android 8.1+ | 3–12x | 60+ عملية |
| XNNPACK | Android، iOS | 2–4x | 90+ عملية |
| Core ML | iOS 12+ | 5–10x | 50+ عملية |
توصيات الاختيار: لنظام Android مع NPU (Snapdragon 8 Gen 2+، Dimensity 9000+) — NNAPI Delegate. لنظام Android بدون NPU — XNNPACK Delegate (افتراضي). لنظام iOS — Core ML Delegate. للمشاريع عبر المنصات، استخدم الإستراتيجية: NNAPI على Android، Core ML على iOS، 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 عند خطأ إنشاء المفوض. قم بتغليف إنشاء المفوض في try-catch وقم بتشغيل النموذج بدون مفوض في حالة الخطأ. ذكاء اصطناعي بطيء ولكنه يعمل أفضل من خطأ للمستخدم.
الأسئلة المتكررة
TF Lite Delegate هو مسرّع للشبكات العصبية على جهاز محمول. بدلاً من تشغيل النموذج ببطء على CPU، يرسل المفوض العمليات الحسابية إلى GPU أو شريحة عصبية متخصصة (NPU). تخيل أن CPU هي أداة عالمية، والمفوض هو آلة متخصصة لمهام محددة: يقوم بنفس الشيء ولكن بشكل أسرع بكثير.
أسرع مفوض يعتمد على الجهاز. على الأجهزة المزودة بـ Neural Engine (Apple A17 Pro، Snapdragon 8 Gen 3) — NNAPI (Android) أو Core ML (iOS) يوفران تسريعاً يصل إلى 10–12x. 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 تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا