التعلم الموزع مع Apache MXNet و Horovod

تم إعداد ترجمة المقال عشية بدء الدورة "تعلم الآلة الصناعي في البيانات الضخمة"

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

سنتحدث في هذه المقالة عن طريقة سريعة وسهلة لتوزيع التعلم باستخدام مكتبة التعلم العميق المفتوحة Apache MXNet وإطار عمل Horovod للتعلم الموزع. سنوضح بوضوح فوائد الأداء لإطار عمل Horovod وسنوضح كيفية كتابة برنامج تدريبي لـ MXNet بحيث يعمل بطريقة موزعة مع Horovod.

ما هو أباتشي MXNet

أباتشي MXNet هو إطار عمل مفتوح المصدر للتعلم العميق يُستخدم لإنشاء وتدريب ونشر الشبكات العصبية العميقة. تلخص MXNet التعقيدات المرتبطة بتنفيذ الشبكات العصبية، وهي عالية الأداء وقابلة للتطوير، وتوفر واجهات برمجة التطبيقات (APIs) للغات البرمجة الشائعة مثل بايثون, C + +, كلوجر, جافا, جوليا, R, سكالا وغيرها.

التدريب الموزع في MXNet مع خادم المعلمات

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

ما هو هوروفود

هوروفود هو إطار عمل مفتوح وموزع للتعلم العميق تم تطويره في Uber. فهو يستفيد من تقنيات فعالة عبر وحدة معالجة الرسومات (GPU) والعقد المتقاطعة مثل مكتبة NVIDIA Collective Communications Library (NCCL) وواجهة تمرير الرسائل (MPI) لتوزيع وتجميع معلمات النموذج عبر vorecs. يعمل على تحسين استخدام النطاق الترددي للشبكة والقياس بشكل جيد عند العمل مع نماذج الشبكات العصبية العميقة. وهو يدعم حاليًا العديد من أطر التعلم الآلي الشائعة، وهي MXNetو Tensorflow و Keras و PyTorch.

التكامل بين 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 من هنا وقم بتشغيل الأوامر التالية في محطة MacBook في دليل العمل:

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، تحتاج إلى مضاعفة عدد الخوادم مقارنة بعدد العاملين.

التعلم الموزع مع Apache MXNet و Horovod
الشكل 1. مقارنة التعلم الموزع باستخدام MXNet مع Horovod ومع خادم المعلمات

في الجدول 1 أدناه، نقوم بمقارنة التكلفة النهائية لكل مثيل عند إجراء التجارب على 64 وحدة معالجة رسوميات. يوفر استخدام MXNet مع Horovod أفضل إنتاجية بأقل تكلفة.

التعلم الموزع مع Apache 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. كما يمكنك استخدام أمازون للتعلم العميق AMI، حيث تم بالفعل تثبيت هذه المكتبات مسبقًا.

الخطوة 2

أضف القدرة على العمل مع Horovod API إلى البرنامج النصي للتدريب الخاص بـ MXNet. يمكن استخدام البرنامج النصي أدناه المستند إلى واجهة برمجة تطبيقات MXNet Gluon كقالب بسيط. الأسطر بالخط العريض مطلوبة إذا كان لديك بالفعل برنامج تدريبي مطابق. فيما يلي بعض التغييرات المهمة التي يتعين عليك إجراؤها للتعلم باستخدام Horovod:

  • اضبط السياق وفقًا لرتبة Horovod المحلية (السطر 8) لفهم أن التدريب يتم على النواة الرسومية الصحيحة.
  • تمرير المعلمات الأولية من عامل واحد إلى الجميع (السطر 18) للتأكد من أن جميع العمال يبدأون بنفس المعلمات الأولية.
  • إنشاء هوروفود محسن الموزعة (السطر 25) لتحديث المعلمات بطريقة موزعة.

للحصول على النص الكامل، يرجى الرجوع إلى أمثلة Horovod-MXNet منيست и IMAGEnet.

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 أولاً. كما نوصي بشدة بقراءة المقال MXNet في 60 دقيقةللبدء.

إذا كنت قد عملت بالفعل مع MXNet وترغب في تجربة التعلم الموزع باستخدام Horovod، فقم بإلقاء نظرة على صفحة التثبيت هوروفودقم بإنشائه من MXNet واتبع المثال منيست أو IMAGEnet.

* يتم احتساب التكلفة على أساس الأسعار لكل ساعة AWS لمثيلات EC2

تعلم المزيد عن الدورة "تعلم الآلة الصناعي في البيانات الضخمة"

المصدر: www.habr.com

إضافة تعليق