مندوبو GPU لـ TensorFlow Lite

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

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

يقدم هذا المستند نظرة عامة على دعم وحدات معالجة الرسومات في TensorFlow Lite، وبعض الاستخدامات المتقدمة لمعالجات GPU. لمزيد من المعلومات المحددة حول تنفيذ دعم GPU على منصات محددة، راجع الأدلة التالية:

دعم عمليات GPU ML

هناك بعض القيود على عمليات TensorFlow ML، أو ops ، التي يمكن تسريعها بواسطة مندوب TensorFlow Lite GPU. يدعم المفوض العمليات التالية بدقة تعويم 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.

استكشاف أخطاء دعم GPU وإصلاحها

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

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

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

نماذج سبيل المثال

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

الأمثل لوحدات معالجة الرسومات

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

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

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

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

دعم GPU المتقدم

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

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

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

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

كيف يعمل هذا؟

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

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

  • المدخلات والمخرجات لبرنامج GPU، إذا تم تكميمها بـ 8 بت، يتم تقليل كميتها وتكميمها (على التوالي) لكل استدلال. تتم هذه العملية على وحدة المعالجة المركزية باستخدام النواة المحسنة لـ TensorFlow Lite.

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

للحصول على معلومات حول تمكين هذه الميزة مع مندوب GPU، راجع ما يلي:

تقليل وقت التهيئة مع التسلسل

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

سي ++

    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;
      

جافا

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

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

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

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