تم إعداد ترجمة المقال عشية بدء الدورة
يمكن أن يؤدي التدريب الموزع على العديد من مثيلات الحوسبة عالية الأداء إلى تقليل وقت تدريب الشبكات العصبية العميقة الحديثة على كميات كبيرة من البيانات من أسابيع إلى ساعات أو حتى دقائق، مما يجعل تقنية التدريب هذه سائدة في التطبيقات العملية للتعلم العميق. يجب أن يفهم المستخدمون كيفية مشاركة البيانات ومزامنتها عبر مثيلات متعددة، وهو ما له بدوره تأثير كبير على كفاءة التوسع. بالإضافة إلى ذلك، يجب أن يعرف المستخدمون أيضًا كيفية نشر برنامج نصي تدريبي يتم تشغيله على مثيل واحد إلى مثيلات متعددة.
سنتحدث في هذه المقالة عن طريقة سريعة وسهلة لتوزيع التعلم باستخدام مكتبة التعلم العميق المفتوحة Apache MXNet وإطار عمل Horovod للتعلم الموزع. سنوضح بوضوح فوائد الأداء لإطار عمل Horovod وسنوضح كيفية كتابة برنامج تدريبي لـ MXNet بحيث يعمل بطريقة موزعة مع Horovod.
ما هو أباتشي MXNet
التدريب الموزع في MXNet مع خادم المعلمات
ما هو هوروفود
التكامل بين MXNet وHorovod
تتكامل MXNet مع Horovod من خلال واجهات برمجة التطبيقات التعليمية الموزعة المحددة في Horovod. واجهات برمجة التطبيقات للاتصالات Horovod هوروفود.بث (), حوروفود.الجمع () и horovod.allreduce() تم تنفيذه باستخدام عمليات الاسترجاعات غير المتزامنة لمحرك MXNet، كجزء من الرسم البياني للمهام الخاص به. بهذه الطريقة، يتم التعامل بسهولة مع تبعيات البيانات بين الاتصال والحساب بواسطة محرك MXNet لتجنب فقدان الأداء بسبب المزامنة. كائن المحسن الموزع المحدد في Horovod horovod.DistributedOptimizer يتوسع محسن في MXNet بحيث يستدعي واجهات برمجة تطبيقات Horovod المقابلة لتحديثات المعلمات الموزعة. كل تفاصيل التنفيذ هذه شفافة للمستخدمين النهائيين.
بداية سريعة
يمكنك البدء بسرعة في تدريب شبكة عصبية تلافيفية صغيرة على مجموعة بيانات MNIST باستخدام MXNet وHorovod على جهاز MacBook الخاص بك.
أولاً، قم بتثبيت mxnet وhorovod من PyPI:
pip install mxnet
pip install horovod
ملاحظة: إذا واجهت خطأ أثناء نقطة تثبيت horovodربما تحتاج إلى إضافة متغير MACOSX_DEPLOYMENT_TARGET=10.vvحيث vv - هذا هو إصدار إصدار MacOS الخاص بك، على سبيل المثال، بالنسبة لنظام MacOSX Sierra الذي ستحتاج إلى كتابته MACOSX_DEPLOYMENT_TARGET=10.12 نقطة تثبيت horovod
ثم قم بتثبيت OpenMPI
في النهاية، قم بتنزيل البرنامج النصي للاختبار mxnet_mnist.py
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py
سيؤدي هذا إلى تشغيل التدريب على مركزين للمعالج الخاص بك. سيكون الإخراج على النحو التالي:
INFO:root:Epoch[0] Batch [0-50] Speed: 2248.71 samples/sec accuracy=0.583640
INFO:root:Epoch[0] Batch [50-100] Speed: 2273.89 samples/sec accuracy=0.882812
INFO:root:Epoch[0] Batch [50-100] Speed: 2273.39 samples/sec accuracy=0.870000
عرض الأداء
عند تدريب نموذج ResNet50-v1 على مجموعة بيانات ImageNet على 64 وحدة معالجة رسومات مع ثماني مثيلات تكبير EC2، التي تحتوي كل منها على 8 وحدات معالجة رسوميات NVIDIA Tesla V100 على سحابة AWS، حققنا إنتاجية تدريب تصل إلى 45000 صورة في الثانية (أي عدد العينات المدربة في الثانية). اكتمل التدريب في 44 دقيقة بعد 90 فترة بأفضل دقة تبلغ 75.7%.
لقد قارنا ذلك بنهج التدريب الموزع الخاص بـ MXNet لاستخدام خوادم المعلمات على 8 و16 و32 و64 وحدة معالجة رسوميات مع خادم معلمة واحد ونسبة خادم إلى عامل تبلغ 1 إلى 1 و2 إلى 1 على التوالي. يمكنك رؤية النتيجة في الشكل 1 أدناه. على المحور y على اليسار، تمثل الأشرطة عدد الصور التي سيتم تدريبها في الثانية، وتعكس الخطوط كفاءة القياس (أي نسبة الإنتاجية الفعلية إلى الإنتاجية المثالية) على المحور y على اليمين. كما ترون، يؤثر اختيار عدد الخوادم على كفاءة التوسع. إذا كان هناك خادم معلمة واحد فقط، تنخفض كفاءة القياس إلى 38% على 64 وحدة معالجة رسوميات. لتحقيق نفس كفاءة التوسع كما هو الحال مع Horovod، تحتاج إلى مضاعفة عدد الخوادم مقارنة بعدد العاملين.
الشكل 1. مقارنة التعلم الموزع باستخدام MXNet مع Horovod ومع خادم المعلمات
في الجدول 1 أدناه، نقوم بمقارنة التكلفة النهائية لكل مثيل عند إجراء التجارب على 64 وحدة معالجة رسوميات. يوفر استخدام MXNet مع Horovod أفضل إنتاجية بأقل تكلفة.
الجدول 1. مقارنة التكلفة بين Horovod وParameter Server مع نسبة خادم إلى عامل تبلغ 2 إلى 1.
خطوات التكاثر
في الخطوات التالية، سنوضح لك كيفية إعادة إنتاج نتيجة التدريب الموزع باستخدام MXNet وHorovod. لمعرفة المزيد حول التعلم الموزع باستخدام MXNet، اقرأ
الخطوة 1
قم بإنشاء مجموعة من المثيلات المتجانسة باستخدام إصدار MXNet 1.4.0 أو أعلى وHorovod الإصدار 0.16.0 أو أعلى لاستخدام التعلم الموزع. ستحتاج أيضًا إلى تثبيت مكتبات لتدريب GPU. بالنسبة لحالاتنا، اخترنا Ubuntu 16.04 Linux، مع GPU Driver 396.44 وCUDA 9.2 ومكتبة cuDNN 7.2.1 وجهاز الاتصال NCCL 2.2.13 وOpenMPI 3.1.1. كما يمكنك استخدام
الخطوة 2
أضف القدرة على العمل مع Horovod API إلى البرنامج النصي للتدريب الخاص بـ MXNet. يمكن استخدام البرنامج النصي أدناه المستند إلى واجهة برمجة تطبيقات MXNet Gluon كقالب بسيط. الأسطر بالخط العريض مطلوبة إذا كان لديك بالفعل برنامج تدريبي مطابق. فيما يلي بعض التغييرات المهمة التي يتعين عليك إجراؤها للتعلم باستخدام Horovod:
- اضبط السياق وفقًا لرتبة Horovod المحلية (السطر 8) لفهم أن التدريب يتم على النواة الرسومية الصحيحة.
- تمرير المعلمات الأولية من عامل واحد إلى الجميع (السطر 18) للتأكد من أن جميع العمال يبدأون بنفس المعلمات الأولية.
- إنشاء هوروفود محسن الموزعة (السطر 25) لتحديث المعلمات بطريقة موزعة.
للحصول على النص الكامل، يرجى الرجوع إلى أمثلة Horovod-MXNet
1 import mxnet as mx
2 import horovod.mxnet as hvd
3
4 # Horovod: initialize Horovod
5 hvd.init()
6
7 # Horovod: pin a GPU to be used to local rank
8 context = mx.gpu(hvd.local_rank())
9
10 # Build model
11 model = ...
12
13 # Initialize parameters
14 model.initialize(initializer, ctx=context)
15 params = model.collect_params()
16
17 # Horovod: broadcast parameters
18 hvd.broadcast_parameters(params, root_rank=0)
19
20 # Create optimizer
21 optimizer_params = ...
22 opt = mx.optimizer.create('sgd', **optimizer_params)
23
24 # Horovod: wrap optimizer with DistributedOptimizer
25 opt = hvd.DistributedOptimizer(opt)
26
27 # Create trainer and loss function
28 trainer = mx.gluon.Trainer(params, opt, kvstore=None)
29 loss_fn = ...
30
31 # Train model
32 for epoch in range(num_epoch):
33 ...
الخطوة 3
قم بتسجيل الدخول إلى أحد العاملين لبدء التدريب الموزع باستخدام توجيه MPI. في هذا المثال، يتم تشغيل التدريب الموزع على أربع مثيلات تحتوي كل منها على 4 وحدات معالجة رسومات، وإجمالي 16 وحدة معالجة رسومات في المجموعة. سيتم استخدام مُحسِّن Stochastic Gradient Descent (SGD) مع المعلمات الفائقة التالية:
- حجم الدفعة الصغيرة: 256
- معدل التعلم: 0.1
- الزخم: 0.9
- تسوس الوزن: 0.0001
عندما قمنا بالتوسيع من وحدة معالجة رسومات واحدة إلى 64 وحدة معالجة رسوميات، قمنا بقياس معدل التدريب خطيًا وفقًا لعدد وحدات معالجة الرسومات (من 0,1 لوحدة معالجة رسومات واحدة إلى 1 لـ 6,4 وحدة معالجة رسومات)، مع الحفاظ على عدد الصور لكل وحدة معالجة رسومات عند 64 (من مجموعة من 256 صورة لوحدة معالجة رسومات واحدة إلى 256 لـ 1 وحدة معالجة رسومات). تغيرت معلمات تسوس الوزن والزخم مع زيادة عدد وحدات معالجة الرسومات. استخدمنا تدريبًا دقيقًا مختلطًا مع نوع بيانات float16 للتمرير الأمامي ونوع بيانات float384 للتدرجات لتسريع حسابات float64 التي تدعمها وحدات معالجة الرسوميات NVIDIA Tesla.
$ mpirun -np 16
-H server1:4,server2:4,server3:4,server4:4
-bind-to none -map-by slot
-mca pml ob1 -mca btl ^openib
python mxnet_imagenet_resnet50.py
اختتام
في هذه المقالة، نظرنا إلى نهج قابل للتطوير للتدريب على النماذج الموزعة باستخدام Apache MXNet وHorovod. لقد أظهرنا كفاءة التوسع وفعالية التكلفة مقارنة بنهج خادم المعلمات في مجموعة بيانات ImageNet التي تم تدريب نموذج ResNet50-v1 عليها. لقد قمنا أيضًا بتضمين الخطوات التي يمكنك استخدامها لتعديل البرنامج النصي الموجود لتشغيل تدريب متعدد المثيلات باستخدام Horovod.
إذا كنت قد بدأت للتو في استخدام MXNet والتعلم العميق، فانتقل إلى صفحة التثبيت
إذا كنت قد عملت بالفعل مع MXNet وترغب في تجربة التعلم الموزع باستخدام Horovod، فقم بإلقاء نظرة على
* يتم احتساب التكلفة على أساس
تعلم المزيد عن الدورة
المصدر: www.habr.com