المستخدمون المفوَّضون بوحدة معالجة الرسومات في TensorFlow Lite

إنّ استخدام وحدات معالجة الرسومات (GPUs) لتشغيل نماذج تعلُّم الآلة (ML) يمكن أن يحسِّن بشكل كبير أداء نموذجك وتجربة المستخدم في تطبيقاتك التي تستخدم تقنية تعلُّم الآلة. يتيح تطبيق TensorFlow Lite استخدام وحدات معالجة الرسومات والمعالجات المتخصصة الأخرى من خلال برنامج تشغيل للأجهزة يُسمى المُفوَّضين. يمكن أن يؤدي تفعيل استخدام وحدات معالجة الرسومات من خلال تطبيقات TensorFlow Lite ML إلى تحقيق المزايا التالية:

  • السرعة: تم تصميم وحدات معالجة الرسومات لتوفير سرعة معالجة عالية لأحمال العمل المتوازية بشكل كبير. وهذا التصميم يجعلها مناسبة تمامًا للشبكات العصبية العميقة، التي تتكون من عدد كبير من المشغلات، حيث يعمل كل منها على موصّلات المدخلات التي يمكن معالجتها بالتوازي، وهو ما يؤدي عادةً إلى انخفاض وقت الاستجابة. في أفضل الحالات، يمكن أن يعمل تشغيل النموذج على وحدة معالجة رسومات بسرعة كافية لإتاحة تطبيقات الوقت الفعلي التي لم تكن متوفّرة في السابق.
  • كفاءة استهلاك الطاقة: تنفِّذ وحدات معالجة الرسومات عمليات الحوسبة المستنِدة إلى تكنولوجيا تعلُّم الآلة بطريقة فعّالة ومحسَّنة للغاية، وعادةً ما تستهلك طاقة أقل وتولّد حرارة أقل مقارنةً بالمهمة التي يتم تشغيلها على وحدات المعالجة المركزية (CPU).

يقدّم هذا المستند نظرة عامة حول التوافق مع وحدات معالجة الرسومات في تطبيق TensorFlow Lite، بالإضافة إلى بعض الاستخدامات المتقدّمة لمعالجات وحدة معالجة الرسومات. للحصول على معلومات أكثر تحديدًا حول تنفيذ دعم وحدة معالجة الرسومات على أنظمة أساسية معيّنة، يمكنك الاطّلاع على الأدلة التالية:

إتاحة عمليات تعلُّم الآلة في وحدة معالجة الرسومات

هناك بعض القيود على عمليات تعلّم الآلة من TensorFlow أو العمليات التي يمكن تسريعها من خلال تفويض وحدة معالجة الرسومات TensorFlow Lite. يدعم المفوَّض العمليات التالية بدقة تعويم 16 بت و32 بت:

  • ADD
  • AVERAGE_POOL_2D
  • CONCATENATION
  • CONV_2D
  • DEPTHWISE_CONV_2D v1-2
  • EXP
  • FULLY_CONNECTED
  • LOGICAL_AND
  • LOGISTIC
  • LSTM v2 (Basic LSTM only)
  • MAX_POOL_2D
  • MAXIMUM
  • MINIMUM
  • MUL
  • PAD
  • PRELU
  • RELU
  • RELU6
  • RESHAPE
  • RESIZE_BILINEAR v1-3
  • SOFTMAX
  • STRIDED_SLICE
  • SUB
  • TRANSPOSE_CONV

بشكل افتراضي، لا تتوفر جميع العمليات إلا في الإصدار 1. يؤدي تفعيل إتاحة تحديد الكمية إلى تفعيل الإصدارات المناسبة، مثل، ADD v2.

تحديد المشاكل وحلّها في توافق وحدة معالجة الرسومات

إذا كانت بعض العمليات غير معتمدة من قِبل تفويض وحدة معالجة الرسومات، لن يعمل إطار العمل إلا على جزء من الرسم البياني في وحدة معالجة الرسومات والجزء المتبقي على وحدة المعالجة المركزية (CPU). وبسبب التكلفة العالية لمزامنة وحدة المعالجة المركزية (CPU)/وحدة معالجة الرسومات، غالبًا ما يؤدي وضع التنفيذ المنقسم على هذا النحو إلى بطء في الأداء مقارنةً عند تشغيل الشبكة بأكملها على وحدة المعالجة المركزية (CPU) وحدها. في هذه الحالة، ينشئ التطبيق تحذيرًا، مثل:

WARNING: op code #42 cannot be handled by this delegate.

ولا يمكن معاودة الاتصال عند حدوث إخفاق من هذا النوع، نظرًا لأن هذا ليس إخفاقًا فعليًا في وقت التشغيل. عند اختبار تنفيذ النموذج مع جهة تفويض وحدة معالجة الرسومات، يجب التنبّه من هذه التحذيرات. قد يشير عدد كبير من هذه التحذيرات إلى أنّ نموذجك ليس هو الأنسب للاستخدام في تسريع وحدة معالجة الرسومات، وقد يتطلّب إعادة ضبط النموذج.

أمثلة على النماذج

تم تصميم النماذج التالية للاستفادة من تسريع وحدة معالجة الرسومات مع تطبيق TensorFlow Lite، ويتم توفيرها كمرجع واختبار:

التحسين لاستخدام وحدات معالجة الرسومات

يمكن أن تساعدك الأساليب التالية في الحصول على أداء أفضل عند تشغيل النماذج على أجهزة وحدة معالجة الرسومات باستخدام تفويض وحدة معالجة الرسومات TensorFlow Lite:

  • إعادة تشكيل العمليات - بعض العمليات السريعة على وحدة المعالجة المركزية (CPU) قد يكون لها تكلفة عالية بالنسبة إلى وحدة معالجة الرسومات على الأجهزة الجوّالة. ويكون تنفيذ عمليات إعادة التشكيل مكلفًا بشكل خاص، بما في ذلك BATCH_TO_SPACE وSPACE_TO_BATCH وSPACE_TO_DEPTH وما إلى ذلك. يجب أن تفحص عن كثب استخدام عمليات إعادة الشكل، وأن تفكر في أنه ربما تم تطبيقها فقط لاستكشاف البيانات أو على التكرارات المبكرة لنموذجك. ويمكن أن تؤدي إزالتها إلى تحسين الأداء بشكل كبير.

  • قنوات بيانات الصور - في وحدة معالجة الرسومات، يتم تقسيم بيانات Tensor إلى 4 قنوات، ومن ثم فإن العملية الحسابية على مؤشر "المنسِّر" ذات الشكل [B,H,W,5] تؤدي نفس الشيء على متسابق من الشكل [B,H,W,8]، لكنها أسوأ بكثير من [B,H,W,4]. إذا كان جهاز الكاميرا الذي تستخدمه يتيح استخدام إطارات الصور في نموذج RGBA، سيكون إدخال 4 قنوات أسرع بكثير لأنّ ذلك يتجنّب نسخ الذاكرة من نموذج أحمر أخضر أزرق ثلاثي القنوات إلى نموذج أحمر أخضر أزرق بأربع قنوات.

  • النماذج المحسّنة للأجهزة الجوّالة - للحصول على أفضل أداء، ننصحك بإعادة تدريب المصنِّف باستخدام بنية شبكة محسّنة للأجهزة الجوّالة. يمكن أن يؤدي تحسين الحماية على الجهاز فقط إلى تقليل وقت الاستجابة واستهلاك الطاقة بشكل كبير من خلال الاستفادة من ميزات الأجهزة الجوّالة.

التوافق المتقدِّم مع وحدة معالجة الرسومات

يمكنك استخدام أساليب إضافية ومتقدمة لمعالجة GPU لتحسين أداء نماذجك، بما في ذلك تحديد الكميات والتسلسل. تصف الأقسام التالية هذه الأساليب بمزيد من التفصيل.

استخدام النماذج الكَمية

يشرح هذا القسم كيفية عمل تفويض وحدة معالجة الرسومات بتسريع النماذج الكمّية التي تبلغ 8 بت، ويشمل ذلك ما يلي:

لتحسين الأداء، استخدِم النماذج التي تحتوي على إدخالات نقطة عائمة وموترات الناتج.

كيف يتم ذلك؟

ولأنّ الواجهة الخلفية لوحدة معالجة الرسومات لا تتوافق إلا مع تنفيذ النقاط العائمة، نستخدم نماذج كميّة من خلال إعطائها "عرض النقطة العائمة" للنموذج الأصلي. على المستوى العالي، يستلزم هذا الخطوات التالية:

  • يتم إلغاء ضبط القيم الثابتة (مثل قيم الترجيح/الانحياز) مرة واحدة في ذاكرة وحدة معالجة الرسومات. تحدث هذه العملية عندما يكون المفوَّض مفعَّلاً في TensorFlow Lite.

  • تكون الإدخالات والنتائج لبرنامج وحدة معالجة الرسومات، في حال تحديد كمها في 8 بت، محدّدة كميًا (على التوالي) لكل استنتاج. وتتم هذه العملية على وحدة المعالجة المركزية باستخدام النواة المحسَّنة من TensorFlow Lite.

  • يتم إدراج محاكيات الكمية بين العمليات لمحاكاة السلوك الكمّي. هذا النهج ضروري للنماذج التي تتوقع فيها العمليات أن تتبع العمليات الحدود التي تم تعلمها أثناء التحديد الكمي.

للحصول على معلومات حول تفعيل هذه الميزة مع المستخدم المفوَّض بوحدة معالجة الرسومات، يمكنك الاطّلاع على ما يلي:

تقليل وقت الإعداد باستخدام التسلسل

تتيح لك ميزة تفويض وحدة معالجة الرسومات التحميل من رمز النواة المجمّعة مسبقًا وبيانات النموذج المتسلسلة والمحفوظة على القرص من عمليات التشغيل السابقة. يتجنب هذا الأسلوب إعادة التحويل البرمجي ويمكن أن يقلل من وقت بدء التشغيل بنسبة تصل إلى 90٪. يتم تحقيق هذا التحسين من خلال تبادل مساحة القرص لتوفير الوقت. يمكنك تمكين هذه الميزة ببعض خيارات التهيئة، كما هو موضح في أمثلة التعليمات البرمجية التالية:

C++

    TfLiteGpuDelegateOptionsV2 options = TfLiteGpuDelegateOptionsV2Default();
    options.experimental_flags |= TFLITE_GPU_EXPERIMENTAL_FLAGS_ENABLE_SERIALIZATION;
    options.serialization_dir = kTmpDir;
    options.model_token = kModelToken;

    auto* delegate = TfLiteGpuDelegateV2Create(options);
    if (interpreter->ModifyGraphWithDelegate(delegate) != kTfLiteOk) return false;
      

Java

    GpuDelegate delegate = new GpuDelegate(
      new GpuDelegate.Options().setSerializationParams(
        /* serializationDir= */ serializationDir,
        /* modelToken= */ modelToken));

    Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
      

عند استخدام ميزة التسلسل، تأكَّد من توافق الرمز البرمجي مع قواعد التنفيذ التالية:

  • تخزين بيانات التسلسل في دليل لا يمكن للتطبيقات الأخرى الوصول إليه. على أجهزة Android، استخدِم getCodeCacheDir() الذي يشير إلى موقع جغرافي خاص بالتطبيق الحالي.
  • يجب أن يكون الرمز المميّز للطراز فريدًا للجهاز للطراز المعيَّن. يمكنك حساب رمز مميّز للنموذج من خلال إنشاء بصمة إصبع من بيانات النموذج باستخدام مكتبات مثل farmhash::Fingerprint64.