یادگیری توزیع شده با Apache MXNet و Horovod

ترجمه مقاله در آستانه شروع دوره آماده شد "ML Industrial ML on Big Data"

آموزش توزیع شده در چندین نمونه محاسباتی با کارایی بالا می تواند زمان آموزش شبکه های عصبی عمیق مدرن را بر روی مقادیر زیادی داده از هفته ها به ساعت ها یا حتی دقیقه ها کاهش دهد و این تکنیک آموزشی را در کاربردهای عملی یادگیری عمیق رایج کند. کاربران باید بدانند که چگونه داده ها را در چندین نمونه به اشتراک بگذارند و همگام کنند، که به نوبه خود تأثیر زیادی بر کارایی مقیاس بندی دارد. علاوه بر این، کاربران همچنین باید بدانند که چگونه یک اسکریپت آموزشی را که بر روی یک نمونه اجرا می‌شود در چندین نمونه اجرا کنند.

در این مقاله ما در مورد یک راه سریع و آسان برای توزیع یادگیری با استفاده از کتابخانه یادگیری عمیق باز Apache MXNet و چارچوب یادگیری توزیع شده Horovod صحبت خواهیم کرد. ما به وضوح مزایای عملکرد چارچوب Horovod را نشان خواهیم داد و نشان خواهیم داد که چگونه یک اسکریپت آموزشی MXNet بنویسیم تا به صورت توزیع شده با Horovod کار کند.

Apache MXNet چیست؟

آپاچی MXNet یک چارچوب یادگیری عمیق منبع باز است که برای ایجاد، آموزش و استقرار شبکه های عصبی عمیق استفاده می شود. MXNet پیچیدگی های مرتبط با پیاده سازی شبکه های عصبی را خلاصه می کند، بسیار کارآمد و مقیاس پذیر است و API هایی را برای زبان های برنامه نویسی محبوب مانند پــایتــون, ++C, Clojure, جاوه, جولیا, R, اسکالا و دیگران است.

آموزش توزیع شده در MXNet با سرور پارامتر

ماژول یادگیری توزیع شده استاندارد در MXNet از رویکرد سرور پارامتر استفاده می کند. از مجموعه‌ای از سرورهای پارامتر برای جمع‌آوری گرادیان‌ها از هر کارگر، انجام تجمیع، و ارسال گرادینت‌های به‌روز شده به کارگران برای تکرار بهینه‌سازی بعدی استفاده می‌کند. تعیین نسبت صحیح سرورها به کارگران کلید مقیاس بندی موثر است. اگر فقط یک سرور پارامتر وجود داشته باشد، ممکن است به یک گلوگاه در محاسبات تبدیل شود. برعکس، اگر از تعداد زیادی سرور استفاده شود، ارتباطات چند به چند می تواند تمام اتصالات شبکه را مسدود کند.

هوروود چیست

هرود یک چارچوب یادگیری عمیق توزیع شده باز است که در اوبر توسعه یافته است. این فناوری از فناوری‌های متقابل GPU و کراس نود مانند NVIDIA Collective Communications Library (NCCL) و Message Passing Interface (MPI) برای توزیع و تجمیع پارامترهای مدل در سراسر vorecs استفاده می‌کند. هنگام کار با مدل های شبکه عصبی عمیق، استفاده از پهنای باند شبکه را بهینه می کند و به خوبی مقیاس می شود. در حال حاضر از چندین چارچوب یادگیری ماشینی محبوب پشتیبانی می کند MXNet، Tensorflow، Keras و PyTorch.

ادغام MXNet و Horovod

MXNet با Horovod از طریق APIهای یادگیری توزیع شده تعریف شده در Horovod ادغام می شود. API های ارتباطی Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() با استفاده از تماس های ناهمزمان موتور MXNet، به عنوان بخشی از نمودار وظیفه آن، پیاده سازی شده است. به این ترتیب، وابستگی های داده بین ارتباطات و محاسبات به راحتی توسط موتور MXNet کنترل می شود تا از افت عملکرد به دلیل همگام سازی جلوگیری شود. شیء بهینه ساز توزیع شده در هوروود تعریف شده است horovod.DistributedOptimizer گسترش می یابد بهینه ساز در MXNet به طوری که API های Horovod مربوطه را برای به روز رسانی پارامترهای توزیع شده فراخوانی می کند. همه این جزئیات پیاده سازی برای کاربران نهایی شفاف هستند.

شروع سریع

با استفاده از MXNet و Horovod در مک بوک خود می توانید به سرعت آموزش یک شبکه عصبی کانولوشن کوچک را بر روی مجموعه داده MNIST شروع کنید.
ابتدا mxnet و horovod را از PyPI نصب کنید:

pip install mxnet
pip install horovod

توجه: در صورت مواجه شدن با خطا در طول pip install 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 پردازنده گرافیکی با هشت نمونه p3.16xlarge EC2، که هر کدام شامل 8 پردازنده گرافیکی NVIDIA Tesla V100 در فضای ابری AWS است، به یک توان عملیاتی آموزشی 45000 تصویر در ثانیه (یعنی تعداد نمونه های آموزش دیده در ثانیه) دست یافتیم. تمرین در 44 دقیقه پس از 90 دوره با بهترین دقت 75.7٪ تکمیل شد.

ما این را با رویکرد آموزشی توزیع شده MXNet در استفاده از سرورهای پارامتر در 8، 16، 32 و 64 GPU با یک سرور تک پارامتری و نسبت سرور به کارگر به ترتیب 1 به 1 و 2 به 1 مقایسه کردیم. نتیجه را در شکل 1 زیر مشاهده می کنید. در محور y در سمت چپ، میله‌ها نشان‌دهنده تعداد تصاویر برای آموزش در هر ثانیه هستند، خطوط نشان‌دهنده کارایی مقیاس‌بندی (یعنی نسبت توان عملیاتی واقعی به ایده‌آل) در محور y در سمت راست هستند. همانطور که می بینید، انتخاب تعداد سرورها بر کارایی مقیاس بندی تأثیر می گذارد. اگر فقط یک سرور پارامتر وجود داشته باشد، بازده مقیاس‌پذیری در 38 GPU به 64 درصد کاهش می‌یابد. برای دستیابی به راندمان مقیاس پذیری مشابه با Horovod، باید تعداد سرورها را نسبت به تعداد کارگران دو برابر کنید.

یادگیری توزیع شده با Apache MXNet و Horovod
شکل 1. مقایسه یادگیری توزیع شده با استفاده از MXNet با Horovod و با سرور پارامتر

در جدول 1 زیر، هزینه نهایی هر نمونه را هنگام اجرای آزمایش‌ها بر روی 64 GPU مقایسه می‌کنیم. استفاده از MXNet با Horovod بهترین خروجی را با کمترین هزینه فراهم می کند.

یادگیری توزیع شده با Apache MXNet و Horovod
جدول 1. مقایسه هزینه هاروود و سرور پارامتر با نسبت سرور به کارگر 2 به 1.

مراحل تکثیر

در مراحل بعدی نحوه بازتولید نتیجه آموزش توزیع شده با استفاده از MXNet و Horovod را به شما نشان خواهیم داد. برای کسب اطلاعات بیشتر در مورد یادگیری توزیع شده با MXNet بخوانید این پست.

مرحله 1

برای استفاده از یادگیری توزیع شده، با MXNet نسخه 1.4.0 یا بالاتر و Horovod نسخه 0.16.0 یا بالاتر، مجموعه ای از نمونه های همگن ایجاد کنید. همچنین برای آموزش GPU باید کتابخانه ها را نصب کنید. برای نمونه، لینوکس اوبونتو 16.04، با درایور GPU 396.44، CUDA 9.2، کتابخانه cuDNN 7.2.1، رابط NCCL 2.2.13 و OpenMPI 3.1.1 را انتخاب کردیم. همچنین می توانید استفاده کنید آمازون Deep Learning AMI، جایی که این کتابخانه ها از قبل نصب شده اند.

مرحله 2

قابلیت کار با Horovod API را به اسکریپت آموزشی MXNet خود اضافه کنید. اسکریپت زیر بر اساس MXNet Gluon API می تواند به عنوان یک الگوی ساده استفاده شود. اگر از قبل اسکریپت آموزشی مربوطه دارید، خطوط پررنگ مورد نیاز است. در اینجا چند تغییر اساسی وجود دارد که باید برای یادگیری با هوروود ایجاد کنید:

  • زمینه را با توجه به رتبه محلی هوروود (خط 8) تنظیم کنید تا متوجه شوید که آموزش بر روی هسته گرافیکی صحیح انجام می شود.
  • پارامترهای اولیه را از یک کارگر به همه ارسال کنید (خط 18) تا مطمئن شوید که همه کارگران با پارامترهای اولیه یکسان شروع به کار می کنند.
  • یک هوروود ایجاد کنید DistributedOptimizer (خط 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 پردازنده گرافیکی در کلاستر اجرا می شود. بهینه ساز گرادیان تصادفی (SGD) با فراپارامترهای زیر استفاده خواهد شد:

  • اندازه مینی دسته: 256
  • میزان یادگیری: 0.1
  • تکانه: 0.9
  • کاهش وزن: 0.0001

همانطور که از یک GPU به 64 GPU مقیاس کردیم، نرخ آموزش را به صورت خطی با توجه به تعداد GPU (از 0,1 برای 1 GPU به 6,4 برای 64 GPU)، در حالی که تعداد تصاویر در هر GPU را 256 نگه داشتیم (از دسته ای از GPU) 256 تصویر برای 1 GPU تا 16 برای 384 GPU). با افزایش تعداد پردازنده‌های گرافیکی، پارامترهای کاهش وزن و تکانه تغییر کردند. ما از آموزش دقیق ترکیبی با نوع داده float64 برای عبور به جلو و float16 برای گرادیان استفاده کردیم تا محاسبات float32 را که توسط پردازنده‌های گرافیکی 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 و یادگیری عمیق شروع کرده اید، به صفحه نصب بروید MXNeبرای اولین بار ساخت MXNet. همچنین خواندن مقاله را به شدت توصیه می کنیم MXNet در 60 دقیقهبرای شروع.

اگر قبلاً با MXNet کار کرده‌اید و می‌خواهید یادگیری توزیع‌شده را با Horovod امتحان کنید، نگاهی به صفحه نصب هرود، آن را از MXNet بسازید و مثال را دنبال کنید منيست یا IMAGEnet.

*هزینه بر اساس محاسبه می شود نرخ ساعتی AWS برای نمونه های EC2

در مورد دوره بیشتر بدانید "ML Industrial ML on Big Data"

منبع: www.habr.com

اضافه کردن نظر