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

يمكن أن يؤدي استخدام وحدات معالجة الرسومات (GPU) لتشغيل نماذج تعلُّم الآلة (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. يؤدي تفعيل إتاحة تحديد الكمية إلى تفعيل الإصدارات المناسبة، على سبيل المثال، "إضافة الإصدار 2".

تحديد وحلّ المشاكل المرتبطة بوحدة معالجة الرسومات (GPU)

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

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

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

أمثلة على الطُرز

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

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

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

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

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

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

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

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

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

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

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

كيف يتم ذلك؟

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

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

  • يتم إلغاء المدخلات والمخرجات في برنامج وحدة معالجة الرسومات، في حال تحديد كميّات 8 بت، وتحديد كميّات (على التوالي) لكل استنتاج. ويتم إجراء هذه العملية على وحدة المعالجة المركزية (CPU) باستخدام النواة المحسّنة في 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.