5 نصائح للتدريب على وحدات معالجة الرسومات المتعددة باستخدام Keras PlatoBlockchain Data Intelligence. البحث العمودي. منظمة العفو الدولية.

5 نصائح لتدريب متعدد GPU مع Keras

مكننا التعلم العميق (الكلمة الطنانة المفضلة في أواخر عام 2010 جنبًا إلى جنب مع blockchain / bitcoin وعلوم البيانات / التعلم الآلي) من القيام ببعض الأشياء الرائعة حقًا في السنوات القليلة الماضية. بخلاف التطورات الحاصلة في الخوارزميات (التي تعتمد على الأفكار المعروفة بالفعل منذ التسعينيات والمعروفة باسم "عصر التنقيب في البيانات") ، يمكن أن تُعزى الأسباب الرئيسية لنجاحها إلى توفر مجموعات بيانات مجانية كبيرة ، وإدخال مكتبات مفتوحة المصدر و استخدام وحدات معالجة الرسومات. في منشور المدونة هذا ، سأركز على الأخيرين وسأشارك معك بعض النصائح التي تعلمتها بالطريقة الصعبة.

لماذا TensorFlow & Keras؟

TensorFlow هي مكتبة تعليمية عميقة شائعة جدًا تم تطويرها بواسطة Google والتي تتيح لك إنشاء نماذج أولية لشبكات معقدة بسرعة. يأتي مزودًا بالعديد من الميزات المثيرة للاهتمام مثل التمايز التلقائي (الذي يوفر عليك تقدير / ترميز تدرجات وظائف التكلفة) ودعم وحدة معالجة الرسومات (مما يتيح لك الحصول بسهولة على تحسين السرعة بمقدار 200 مرة باستخدام أجهزة مناسبة). علاوة على ذلك ، فإنه يوفر واجهة Python مما يعني أنه يمكنك إنشاء نموذج أولي بسرعة دون الحاجة إلى كتابة كود C أو CUDA. من المسلم به أن هناك الكثير من الأطر الأخرى التي يمكن للمرء استخدامها بدلاً من TensorFlow ، مثل Torch و MXNet و Theano و Caffe و Deeplearning4j و CNTK وما إلى ذلك ، لكن كل ذلك يتلخص في حالة الاستخدام وتفضيلاتك الشخصية.

لكن لماذا Keras؟ بالنسبة لي ، فإن استخدام TF مباشرة يشبه التعلم الآلي باستخدام Numpy. نعم ، هذا ممكن ومن وقت لآخر عليك القيام بذلك (خاصة إذا كنت تكتب طبقات / وظائف خسارة مخصصة) ولكن هل تريد حقًا كتابة رمز يصف الشبكات المعقدة كسلسلة من عمليات المتجه (نعم ، أعلم هناك طرق عالية المستوى في TF لكنها ليست رائعة مثل Keras)؟ ماذا أيضًا إذا كنت تريد الانتقال إلى مكتبة مختلفة؟ حسنًا ، ربما ستحتاج إلى إعادة كتابة الكود ، وهو أمر سيء. تا تا تا تا ، كراس للإنقاذ! يتيح لك Keras وصف شبكاتك باستخدام مفاهيم عالية المستوى وكتابة رمز محايد للخلفية ، مما يعني أنه يمكنك تشغيل الشبكات عبر مكتبات التعلم العميق المختلفة. قليل من الأشياء التي أحبها في Keras هي أنها مكتوبة جيدًا ، ولها بنية موجهة للكائنات ، ومن السهل المساهمة ولديها مجتمع ودود. إذا أعجبك ، قل شكراً لك فرانسوا شوليت لتطويره وفتح مصادره.

تلميحات ومشكلات للتدريب على وحدات معالجة الرسومات المتعددة

بدون مزيد من اللغط ، دعنا ننتقل إلى بعض النصائح حول كيفية تحقيق أقصى استفادة من تدريب GPU على Keras واثنين من المشاكل التي يجب أن تضعها في اعتبارك:

1. التدريب على وحدات معالجة الرسومات المتعددة ليس تلقائيًا

تعتبر نماذج التدريب على GPU باستخدام Keras & Tensorflow سلسة. إذا كان لديك بطاقة NVIDIA وقمت بتثبيت CUDA ، فستكتشفها المكتبات تلقائيًا وتستخدمها للتدريب. لطيف جدا! ولكن ماذا لو كنت طفلًا مدللًا ولديك العديد من وحدات معالجة الرسومات؟ حسنًا ، لسوء الحظ ، سيتعين عليك العمل قليلاً لتحقيق تدريب متعدد GPU.
5 نصائح للتدريب على وحدات معالجة الرسومات المتعددة باستخدام Keras PlatoBlockchain Data Intelligence. البحث العمودي. منظمة العفو الدولية.
هناك طرق متعددة لموازنة الشبكة اعتمادًا على ما تريد تحقيقه ولكن الطريقتين الرئيسيتين هما النموذج وموازنة البيانات. يمكن أن يساعدك الأول إذا كان نموذجك معقدًا جدًا بحيث لا يتناسب مع وحدة معالجة رسومات واحدة بينما يساعدك الأخير عندما تريد تسريع التنفيذ. عادةً عندما يتحدث الناس عن التدريب على وحدات معالجة الرسومات المتعددة ، فإنهم يقصدون الأخير. كان من الصعب تحقيق ذلك ، لكن لحسن الحظ ، قامت Keras بتضمين طريقة مساعدة تسمى mutli_gpu_model مما يجعل التدريب / التنبؤات الموازية أسهل (متوفر حاليًا فقط مع TF الخلفية). الفكرة الرئيسية هي أن تقوم بتمرير النموذج الخاص بك من خلال الطريقة ويتم نسخه عبر وحدات معالجة الرسومات المختلفة. يتم تقسيم المدخلات الأصلية إلى أجزاء يتم تغذيتها إلى وحدات معالجة الرسومات المختلفة ثم يتم تجميعها كمخرج واحد. يمكن استخدام هذه الطريقة لتحقيق التدريب والتنبؤات المتوازية ، ومع ذلك ضع في اعتبارك أنه للتدريب لا يتوسع خطيًا مع كمية وحدات معالجة الرسومات بسبب التزامن المطلوب.

2. انتبه لحجم الدُفعة

عندما تقوم بتدريب متعدد GPU ، انتبه إلى حجم الدُفعة حيث أن لها تأثيرات متعددة على السرعة / الذاكرة ، وتقارب النموذج الخاص بك ، وإذا لم تكن حريصًا ، فقد تفسد أوزان النموذج!

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

التقارب: إذا كنت تستخدم Stochastic Gradient Decent (SGD) أو بعض المتغيرات الخاصة به لتدريب نموذجك ، فيجب أن تضع في اعتبارك أن حجم الدُفعة يمكن أن يؤثر على قدرة شبكتك على التقارب والتعميم. تتراوح أحجام الدُفعات النموذجية في العديد من مشكلات رؤية الكمبيوتر بين 32-512 مثالاً. كما كيسكار وآخرون بعبارة أخرى ، "لقد لوحظ عمليًا أنه عند استخدام دفعة أكبر (من 512) هناك تدهور في جودة النموذج ، كما تقاس بقدرته على التعميم.". لاحظ أن أدوات تحسين الأداء المختلفة الأخرى لها خصائص مختلفة ويمكن أن تساعد تقنيات التحسين الموزعة المتخصصة في حل المشكلة. إذا كنت مهتمًا بالتفاصيل الرياضية ، فإنني أوصي بقراءة أطروحة Joeri Hermans "في التعلم العميق القابل للتطوير والتوازي مع الانحدار التدريجي".
5 نصائح للتدريب على وحدات معالجة الرسومات المتعددة باستخدام Keras PlatoBlockchain Data Intelligence. البحث العمودي. منظمة العفو الدولية.
إفساد الأوزان: هذه تفاصيل فنية سيئة يمكن أن تكون لها نتائج مدمرة. عندما تقوم بتدريب متعدد GPU ، من المهم تغذية جميع وحدات معالجة الرسومات بالبيانات. يمكن أن يحدث أن تحتوي الدفعة الأخيرة من حقبتك على بيانات أقل مما هو محدد (لأن حجم مجموعة البيانات الخاصة بك لا يمكن تقسيمه بالضبط على حجم الدفعة الخاصة بك). قد يتسبب هذا في عدم تلقي بعض وحدات معالجة الرسومات أي بيانات أثناء الخطوة الأخيرة. لسوء الحظ ، لا تستطيع بعض طبقات Keras ، وأبرزها طبقة تسوية الدُفعات ، التعامل مع ذلك الذي يؤدي إلى ظهور قيم نان في الأوزان (متوسط ​​التشغيل والتباين في طبقة BN). لجعل الأشياء أكثر شرا ، لن يلاحظ المرء المشكلة أثناء التدريب (بينما تكون مرحلة التعلم 1) لأن الطبقة المحددة تستخدم متوسط ​​/ تباين الدُفعة في التقديرات. ومع ذلك ، أثناء التنبؤات (تم ضبط مرحلة التعلم على 0) ، يتم استخدام المتوسط ​​/ التباين الذي يمكن أن يصبح في حالتنا نانًا مما يؤدي إلى نتائج سيئة. لذا تفضل لنفسك وتأكد دائمًا من أن حجم الدفعة الخاص بك ثابت عند القيام بتدريب متعدد GPU. طريقتان بسيطتان لتحقيق ذلك هما إما عن طريق رفض الدُفعات التي لا تتطابق مع الحجم المحدد مسبقًا أو تكرار السجلات داخل الدُفعة حتى تصل إلى الحجم المحدد مسبقًا. أخيرًا وليس آخرًا ، ضع في اعتبارك أنه في إعداد متعدد وحدات معالجة الرسومات ، يجب أن يكون حجم الدُفعة مضاعفًا لعدد وحدات معالجة الرسومات المتاحة على نظامك.

3. لا تستطيع وحدات المعالجة المركزية (CPUs) مواكبة وحدات معالجة الرسومات (GPU)

عادةً ما يكون الجزء الأكثر تكلفة أثناء التدريب / التنبؤ بالشبكات العميقة هو التقدير الذي يحدث على وحدات معالجة الرسومات. تتم معالجة البيانات مسبقًا في وحدات المعالجة المركزية (CPU) الموجودة في الخلفية ويتم إدخالها إلى وحدات معالجة الرسومات بشكل دوري. ومع ذلك ، لا ينبغي التقليل من سرعة وحدات معالجة الرسومات ؛ يمكن أن يحدث أنه إذا كانت شبكتك ضحلة جدًا أو كانت خطوة المعالجة المسبقة معقدة للغاية بحيث لا تستطيع وحدات المعالجة المركزية الخاصة بك مواكبة وحدات معالجة الرسومات الخاصة بك أو بعبارة أخرى لا تغذيها بالبيانات بسرعة كافية. يمكن أن يؤدي هذا إلى استخدام منخفض لوحدة معالجة الرسومات مما يؤدي إلى إهدار الأموال / الموارد.
5 نصائح للتدريب على وحدات معالجة الرسومات المتعددة باستخدام Keras PlatoBlockchain Data Intelligence. البحث العمودي. منظمة العفو الدولية.
تقوم Keras عادةً بإجراء تقديرات الدفعات بالتوازي ، ولكن نظرًا لأن Python's GIL (قفل المترجم العالمي) لا يمكنك حقًا تحقيق ترابط متعدد حقيقي في Python. هناك حلان لذلك: إما استخدام عمليات متعددة (لاحظ أن هناك الكثير من المشاكل في هذه العملية التي لن أغطيها هنا) أو اجعل خطوة المعالجة المسبقة الخاصة بك بسيطة. في الماضي ، قمت بإرسال طلب Pull-Request على Keras لتخفيف بعض الضغط غير الضروري الذي كنا نضعه على وحدات المعالجة المركزية أثناء المعالجة المسبقة للصور ، لذلك لا ينبغي أن يتأثر معظم المستخدمين إذا استخدموا المولدات القياسية. إذا كان لديك مولدات مخصصة ، فحاول دفع أكبر قدر ممكن من المنطق إلى مكتبات C مثل Numpy لأن بعض هذه الطرق في الواقع الافراج عن جيل مما يعني أنه يمكنك زيادة درجة الموازاة. من الطرق الجيدة لاكتشاف ما إذا كنت تواجه مجاعة بيانات GPU هي مراقبة استخدام GPU ، ومع ذلك حذر من أن هذا ليس السبب الوحيد لملاحظة ذلك (المزامنة التي تحدث أثناء التدريب عبر وحدات معالجة الرسومات المتعددة هي أيضًا مسؤولة عن الاستخدام المنخفض ). عادةً ما يمكن اكتشاف تجويع بيانات وحدة معالجة الرسومات من خلال ملاحظة اندفاعات GPU متبوعة بفترات توقف طويلة بدون استخدام. في الماضي ، قمت بفتح امتداد لـ Dstat يمكن أن يساعدك في قياس استخدامك لوحدة معالجة الرسومات ، لذا ألق نظرة على بلوق وظيفة الأصلي.

4. حفظ النماذج المتوازية الخاصة بك

لنفترض أنك استخدمت طريقة mutli_gpu_model لموازنة النموذج الخاص بك ، فقد انتهى التدريب ، والآن تريد الحفاظ على أوزانه. النبأ السيئ هو أنه لا يمكنك فقط استدعاء حفظ () عليه. حاليًا لدى Keras قيود لا تسمح لك بذلك حفظ نموذج مواز. هناك طريقتان للتغلب على هذا: إما استدعاء الحفظ () في مرجع النموذج الأصلي (سيتم تحديث الأوزان تلقائيًا) أو تحتاج إلى إجراء تسلسل للنموذج عن طريق تقطيع الإصدار المتوازي وتنظيف جميع الاتصالات غير الضرورية. الخيار الأول هو أسهل بكثير ولكن في المستقبل أخطط لفتح المصدر بطريقة serialize () التي تؤدي هذا الأخير.

5. حساب وحدات معالجة الرسومات المتاحة له آثار جانبية سيئة

لسوء الحظ في الوقت الحالي ، هناك تأثير جانبي سيئ على طريقة tensorflow.python.client.device_lib.list_local_devices () الذي يتسبب في إنشاء جلسة TensorFlow جديدة وتهيئة جميع وحدات معالجة الرسومات المتاحة على النظام. يمكن أن يؤدي هذا إلى نتائج غير متوقعة مثل عرض المزيد من وحدات معالجة الرسومات أكثر من المحدد أو التهيئة المبكرة لجلسات جديدة (يمكنك قراءة جميع التفاصيل حول هذا طلب سحب). لتجنب حدوث مفاجآت مماثلة ، يُنصح باستخدام طريقة Keras 'K.get_session (). list_devices () بدلاً من ذلك ، والتي ستعيد لك جميع وحدات معالجة الرسومات المسجلة حاليًا في الجلسة. أخيرًا وليس آخرًا ، ضع في اعتبارك أن استدعاء طريقة list_devices () مكلف إلى حد ما ، لذلك إذا كنت مهتمًا فقط بعدد وحدات معالجة الرسومات المتاحة ، فاتصل بالطريقة مرة واحدة وقم بتخزين أرقامها على متغير محلي.

هذا هو! آمل أن تكون قد وجدت هذه القائمة مفيدة. إذا وجدت مشاكل / نصائح أخرى لتدريب GPU على Keras ، فشاركها أدناه في التعليقات. 🙂

الطابع الزمني:

اكثر من داتومبوكس