مفوَّضو وحدة معالجة الرسومات في LiteRT

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

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

ويقدم هذا المستند نظرة عامة على دعم وحدات معالجة الرسومات في LiteRT، كما يقدم بعض الاستخدامات المتقدمة لمعالجات وحدة معالجة الرسومات. لمزيد من المعلومات المحددة حول التوافق مع وحدة معالجة الرسومات على أنظمة أساسية معيّنة، يُرجى الاطّلاع على الأدلة التالية:

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

هناك بعض القيود على ما يمكن تنفيذه على عمليات تعلُّم الآلة من TensorFlow أو العمليات. من خلال تفويض وحدة معالجة الرسومات LiteRT. يدعم المفوَّض العمليات التالية بدقة تعويم 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

كيف يتم ذلك؟

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

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

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

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

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

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

تتيح لك ميزة تفويض وحدة معالجة الرسومات التحميل من رموز النواة المجمّعة مسبقًا بيانات النموذج بشكل تسلسلي وحفظها على القرص من عمليات التشغيل السابقة. يتجنب هذا النهج لإعادة التحويل البرمجي ويمكن أن تقلل من وقت بدء التشغيل بنسبة تصل إلى 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