مندوبي GPU لـ TensorFlow Lite

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

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

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

دعم عمليات GPU ML

هناك بعض القيود على عمليات TensorFlow ML ، أو العمليات ، التي يمكن تسريعها بواسطة مندوب 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 والجزء المتبقي على وحدة المعالجة المركزية. نظرًا للتكلفة العالية لمزامنة وحدة المعالجة المركزية / وحدة معالجة الرسومات ، يؤدي وضع التنفيذ المنفصل مثل هذا غالبًا إلى أداء أبطأ مما يحدث عند تشغيل الشبكة بالكامل على وحدة المعالجة المركزية وحدها. في هذه الحالة ، يُنشئ التطبيق تحذيرًا ، مثل:

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

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

نماذج النماذج

تم تصميم نماذج النماذج التالية للاستفادة من تسريع GPU مع TensorFlow Lite وتم توفيرها للرجوع إليها والاختبار:

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

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

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

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

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

دعم GPU المتقدم

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

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

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

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

كيف يعمل هذا؟

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

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

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

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

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

تقليل وقت التهيئة باستخدام التسلسل

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

جافا

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

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

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

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