كيفية تدريب نموذج كبير وعميق جدا على واحد GPU؟

المشكلة: الحد من الذاكرة GPU

أعتقد أنني لست بحاجة إلى توضيح مدى قوة وحدة معالجة الرسومات لتدريب الشبكات العصبية العميقة بعد الآن. باستخدام إطار ML شائع ، من الأسهل كثيرًا تعيين العمليات الحسابية إلى GPU (s) من القيام بكل شيء بدءًا من نقطة الصفر. ومع ذلك ، هناك شيء واحد يمكن أن يخلق سيناريوهات كابوس - حدود DRAM من GPU (s) الخاص بك.

ومع ذلك ، نظرًا لحجم النموذج وحجم الدُفعات الخاصة بك ، يمكنك بالفعل حساب مقدار ذاكرة وحدة معالجة الرسومات التي تحتاجها للتدريب دون تشغيلها بالفعل. على سبيل المثال ، يتطلب تدريب AlexNet بحجم دفعي 128 ذاكرة 1.1 جيجابايت ، وهذا هو مجرد 5 طبقات تلافيفية بالإضافة إلى طبقتين متصلتين بالكامل. إذا نظرنا إلى نموذج أكبر ، يقول VGG-16 ، فإن استخدام حجم دفعة 128 يتطلب حوالي 14 جيجابايت من الذاكرة العالمية. تبلغ سعة ذاكرة NVIDIA Titan X الحديثة أكثر من 12 جيجابايت. يحتوي VGG-16 على 16 طبقة تلافيفية و 3 طبقات متصلة بالكامل ، وهو أصغر بكثير من طراز resnet الذي يمكن أن يحتوي على حوالي مائة طبقة.

الشكل 1. استخدام ذاكرة GPU عند استخدام سياسة التخصيص الأساسية على مستوى الشبكة (المحور الأيسر). (مينسو رو وآخرون 2016)

الآن ، إذا كنت ترغب في تدريب طراز أكبر من VGG-16 ، فقد يكون لديك العديد من الخيارات لحل مشكلة الحد من الذاكرة.
- قلل حجم الدُفعة ، مما قد يعيق كل من سرعة ودقة التدريب.
- توزيع النموذج الخاص بك بين GPU (s) متعددة ، وهي عملية معقدة في حد ذاتها.
- قلل حجم النموذج الخاص بك ، إذا وجدت نفسك غير مستعد للقيام بالخيارات المذكورة أعلاه ، أو كنت قد جربت بالفعل هذه الخيارات ولكنها ليست جيدة.

أو يمكنك ببساطة انتظار الجيل التالي من وحدات معالجة الرسومات التي ستكون لها قدرات أكبر. اتجاه الصناعة هو نحو شبكات أعمق وأكبر ، ونحن لا نريد أن يكون قيود DRAM المادية في طريقنا.

ملاحظة: من الذي يحتل الذاكرة؟

يمكننا تقسيم البيانات الموجودة في ذاكرة GPU إلى 4 فئات وفقًا لوظائفها:
- معلمات النموذج (الأوزان)
- خرائط الميزة
- خرائط التدرج
- مساحة العمل

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

ملاحظة: خرائط الميزات هي الجزء الأكثر استهلاكًا للذاكرة
يمكن توضيح هذا الادعاء في عنوان البلطيق هذا من خلال الشكل التالي (الشكل 4. تفاصيل استخدام ذاكرة وحدة معالجة الرسومات وفقًا لوظائفه (Minsoo Rhu et al. 2016)).

يمكننا أن نرى أنه ، بشكل عام ، كلما زاد عدد الطبقات التي لدينا ، كلما تم تخصيص جزء أكبر من الذاكرة لخرائط المعالم (المثلثات). يمكننا أيضًا أن نرى أن هذه النسبة تزيد دائمًا عن 50٪ للموديلات الأكبر حجمًا مثل VGG-16.

الفكرة: استخدم ذاكرة وحدة المعالجة المركزية كحاوية مؤقتة

هناك حقيقة واحدة حول خرائط الميزات: يتم إنشاؤها في العملية الأمامية ، وتستخدم على الفور للطبقة التالية ، وإعادة استخدامها مرة واحدة فقط في وقت لاحق ، في عملية الوراء. تستخدم كل وظيفة kernel خرائط ميزات فقط مرتبطة بالطبقة الحالية (عادة ما تكون فقط 1 موتر). سيؤدي ذلك إلى ترك معظم الذاكرة صامتة (حيث يحتفظون ببعض البيانات ولكن لا يتم استخدامها) معظم الوقت.

ومع ذلك ، إذا كانت معظم البيانات يجب أن تظل صامتة على ذاكرة GPU ، فلماذا لا تبقيها على ذاكرة CPU أرخص؟ فيما يلي مثال في AlexNet يوضح ما يجري.

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

المفاضلة: الوقت مقابل الفضاء

وفقًا للصحيفة ، فإن vDNN (اختصار DNN الافتراضي) يقلل بنجاح من متوسط ​​استخدام ذاكرة GPU لـ AlexNet بنسبة 91٪ و GoogLeNet بنسبة 95٪. ومع ذلك ، ربما كنت قد رأيت بالفعل سعر القيام بذلك هو أنه يمكنك تدريب أبطأ. على سبيل المثال ، يُمكّن vDNN تدريب VGG-16 بحجم الدُفعة 256 على وحدة معالجة الرسومات 12 جيجابايت ، ولكن مع فقدان أداء بنسبة 18٪ ، مقارنةً بوحدة معالجة افتراضية ذات ذاكرة كافية.

هناك مكان آخر تظهره هذه المقايضة وهو حجم مساحة العمل عند استخدام نواة cuDNN. بشكل عام ، كلما زادت مساحة العمل لديك ، زادت سرعة الخوارزمية التي يمكنك استخدامها. يرجى الرجوع إلى مرجع مكتبة cuDNN إذا كنت مهتمًا.
سوف نرى هذا المفاضلة بين الفضاء الزمني من خلال الخروج المناقشة في وقت لاحق.

استراتيجية التحسين: في عملية الأمام والخلف

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

في العملية الخلفية ، يستخدم vDNN استراتيجية أكثر عدوانية. نظرًا لخرائط التدرجات اللونية ، لا توجد مشكلة "إعادة استخدام لاحقًا" مقارنة بخرائط الميزات. لذلك ، يمكن إصدارها بمجرد إنشاء تحديثات متعلقة بالوزن (وهي صغيرة جدًا مقارنة بتلك الخرائط).

استراتيجية التحسين: مدير ذاكرة CUDA Stream

المكون الرئيسي لـ vDNN هو دفق cuda الذي يدير تخصيص / تحرير الذاكرة ، إلغاء التحميل والإحضار المسبق. وهنا بعض التفاصيل:

تخصيص / تحرير ذاكرة cuda التقليدية (cudaMalloc & cudaFree) عبارة عن واجهات برمجة تطبيقات متزامنة. نظرًا لأنهم سيحدثون باستمرار أثناء سير العملية التدريبية ، فإن واجهات برمجة التطبيقات المتزامنة ليست فعالة بدرجة كافية.

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

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

التكلفة: كيف ندفع ثمن الأداء لتوفير الذاكرة؟

وتأتي أهم خسارة محتملة في الأداء من التبعيات الضمنية التي أدخلتها عملية التحميل / الجلب المسبق. النظر في القضية عندما يستغرق نقل البيانات وقتا أطول من حساب إلى الأمام. يوضح هذا الشكل الموقف بوضوح (الشكل 9. تأثير أداء التحميل والإحضار المسبق (Minsoo Rhu et al. 2016)):

يمكن أن يحدث موقف مماثل في عملية التخلف كذلك.

إضفاء طابع رسمي جديد على مشكلتنا: كيف نحصل على أفضل أداء في ضوء ميزانية الذاكرة المحدودة؟

كما ذكرنا أعلاه ، هناك مفاضلة بين الزمان والمكان ، وفي القسم السابق رأينا كيف تعمل المفاضلة. تصوير أنك تقوم بتدريب VGG-16 مع حجم الدُفعة 128 (التي تأخذ ذاكرة 14 جيجابايت إذا لم يكن هناك تفريغ / إحضار مسبق) على وحدة معالجة الرسومات 12 جيجابايت. قد يكون من الضياع استخدام ذاكرة بحجم 2 جيجابايت فقط ، لأنه يمكنك استخدام مساحة أكبر للتخفيف من فقدان الأداء. لذلك ، يمكننا إعادة تشكيل المشكلة بهذه الطريقة: كيف نحصل على أفضل أداء في ظل ميزانية ذاكرة محدودة؟

قم بتكوين المفاضلة بين الفراغات الزمنية: قرر ما إذا كان يجب إلغاء تحميل طبقة ما / إحضارها مسبقًا أم لا ، وما هي خوارزمية الالتفاف التي يجب أن نختارها.

للحصول على أفضل التكوين ، نحتاج إلى تحديد شيئين لكل طبقة: هل نقوم بإلغاء التحميل / الإحضار المسبق ، والخوارزمية التي نستخدمها في العملية الأمامية / الخلفية (تعني الخوارزمية الأسرع مساحة أكبر مطلوبة).

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

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

الآن ، لدينا مساحة تكوين صغيرة حتى نتمكن من استخدام البحث الجشع لتحديد أفضل حل التكوين. فيما يلي شكل لتوضيح مساحة التكوين الخاصة بنا:

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

الجزء التالي من القصة هو العثور على تكوين عملي له أفضل أداء. ما يمكننا القيام به هو البحث في التكوين على طول الحدود. إذا كنت مهتمًا بتفاصيل تنفيذ إجراء البحث هذا ، فيرجى الرجوع إلى الورقة الأصلية (يتم وصف إجراء البحث في القسم 3.C).

رابط الورق: https://arxiv.org/pdf/1602.08124.pdf

الكاتب: هونغ يو تشو | المحرر: إيان | مترجمة بواسطة Synced Global Team: شيانغ تشن