Maqolaning tarjimasi kurs boshlanishi arafasida tayyorlangan
Bir nechta yuqori unumli hisoblash misollari bo'yicha taqsimlangan trening zamonaviy chuqur neyron tarmoqlarni katta hajmdagi ma'lumotlarga o'qitish vaqtini haftalardan soatlarga yoki hatto daqiqalarga qisqartirishi mumkin, bu esa chuqur o'rganishning amaliy qo'llanilishida ushbu o'quv texnikasini keng qo'llash imkonini beradi. Foydalanuvchilar ma'lumotlarni bir nechta misollarda qanday almashish va sinxronlashtirishni tushunishlari kerak, bu esa o'z navbatida masshtablash samaradorligiga katta ta'sir ko'rsatadi. Bundan tashqari, foydalanuvchilar bir nusxada ishlaydigan o'quv skriptini bir nechta misollarga qanday joylashtirishni ham bilishlari kerak.
Ushbu maqolada biz ochiq chuqur o'rganish kutubxonasi Apache MXNet va Horovod taqsimlangan ta'lim tizimi yordamida ta'limni tarqatishning tez va oson usuli haqida gaplashamiz. Biz Horovod ramkasining ishlash afzalliklarini aniq ko'rsatamiz va MXNet o'quv skriptini Horovod bilan taqsimlangan holda ishlashi uchun qanday yozishni ko'rsatamiz.
Apache MXNet nima
chuqur neyron tarmoqlarni yaratish, o‘rgatish va o‘rnatish uchun foydalaniladigan ochiq manbali chuqur o‘rganish tizimidir. MXNet neyron tarmoqlarni amalga oshirish bilan bog'liq murakkabliklarni qisqacha bayon qiladi, yuqori samarali va kengaytiriladigan va mashhur dasturlash tillari uchun API'larni taklif qiladi, masalan , , , , , , va boshqalar.
Parametr serveri bilan MXNet-da taqsimlangan trening
parametr server yondashuvidan foydalanadi. U har bir ishchidan gradientlarni yig'ish, agregatsiyani amalga oshirish va yangilangan gradientlarni keyingi optimallashtirish iteratsiyasi uchun ishchilarga qaytarish uchun parametr serverlari to'plamidan foydalanadi. Serverlarning ishchilarga to'g'ri nisbatini aniqlash samarali masshtablashning kalitidir. Agar faqat bitta parametr serveri bo'lsa, u hisob-kitoblarda muammo bo'lib chiqishi mumkin. Aksincha, agar juda ko'p serverlar ishlatilsa, ko'p-ko'p aloqa barcha tarmoq ulanishlarini yopishi mumkin.
Horovod nima
Uber’da ishlab chiqilgan ochiq taqsimlangan chuqur ta’lim tizimidir. U NVIDIA Kollektiv Aloqa Kutubxonasi (NCCL) va Xabarlarni o'tkazish interfeysi (MPI) kabi samarali o'zaro GPU va o'zaro bog'liq texnologiyalardan foydalanadi va model parametrlarini voreclar bo'ylab taqsimlaydi va jamlaydi. U tarmoq o'tkazish qobiliyatidan foydalanishni optimallashtiradi va chuqur neyron tarmoq modellari bilan ishlashda yaxshi miqyosda. Hozirda u bir nechta mashhur mashina o'rganish ramkalarini qo'llab-quvvatlaydi, xususan , Tensorflow, Keras va PyTorch.
MXNet va Horovod integratsiyasi
MXNet Horovod bilan Horovodda belgilangan Distributed Learning API orqali integratsiyalashgan. Horovod aloqa API'lari horovod.broadcast(), horovod.allgather() и horovod.allreduce() MXNet dvigatelining asinxron qayta qo'ng'iroqlari yordamida uning vazifalar grafigining bir qismi sifatida amalga oshirildi. Shu tarzda, aloqa va hisoblash o'rtasidagi ma'lumotlarga bog'liqlik MXNet dvigateli tomonidan sinxronizatsiya tufayli ishlash yo'qotilishining oldini olish uchun osonlik bilan boshqariladi. Horovodda aniqlangan taqsimlangan optimallashtiruvchi ob'ekt horovod.DistributedOptimizer kengayadi Optimizator MXNet-da taqsimlangan parametrlarni yangilash uchun tegishli Horovod API-larini chaqirishi uchun. Ushbu amalga oshirishning barcha tafsilotlari oxirgi foydalanuvchilar uchun shaffofdir.
Tez boshlash
Siz MacBook-da MXNet va Horovod yordamida MNIST ma'lumotlar to'plamida kichik konvolyutsion neyron tarmog'ini tezda o'rganishni boshlashingiz mumkin.
Birinchidan, PyPI dan mxnet va horovodni o'rnating:
pip install mxnet
pip install horovodEslatma: Agar ish paytida xatolikka duch kelsangiz pip o'rnatish horovodehtimol siz o'zgaruvchini qo'shishingiz kerak MACOSX_DEPLOYMENT_TARGET=10.vvqayerda vv - bu sizning MacOS versiyangizning versiyasi, masalan, MacOSX Sierra uchun siz yozishingiz kerak bo'ladi MACOSX_DEPLOYMENT_TARGET=10.12 pip o'rnatish horovod
Keyin OpenMPI-ni o'rnating .
Oxirida test skriptini yuklab oling mxnet_mnist.py va ishchi katalogdagi MacBook terminalida quyidagi buyruqlarni bajaring:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyBu sizning protsessoringizning ikkita yadrosi bo'yicha treningni amalga oshiradi. Chiqish quyidagicha bo'ladi:
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.870000Ishlash demo
ResNet50-v1 modelini ImageNet ma'lumotlar to'plamida sakkizta misolga ega 64 GPUda o'rgatishda p3.16x katta Har birida AWS bulutida 2 ta NVIDIA Tesla V8 GPU o‘z ichiga olgan EC100 biz sekundiga 45000 44 tasvirni (ya’ni, sekundiga o‘qitilgan namunalar soni) o‘tkazish qobiliyatiga erishdik. Mashg'ulot 90 davrdan keyin 75.7 daqiqada XNUMX% eng yaxshi aniqlik bilan yakunlandi.
Biz buni MXNet-ning 8, 16, 32 va 64 GPU-larda parametr serverlarini bitta parametrli server va mos ravishda 1 dan 1 gacha va 2 dan 1 gacha bo'lgan serverga ishchi nisbati bilan ishlatish bo'yicha taqsimlangan o'quv yondashuvi bilan solishtirdik. Natijani quyidagi 1-rasmda ko'rishingiz mumkin. Chapdagi y o'qida chiziqlar soniyada o'rgatish kerak bo'lgan tasvirlar sonini, chiziqlar o'ngdagi y o'qida masshtablash samaradorligini (ya'ni haqiqiy va ideal o'tkazuvchanlik nisbati) aks ettiradi. Ko'rib turganingizdek, serverlar sonini tanlash masshtablash samaradorligiga ta'sir qiladi. Agar faqat bitta parametr serveri mavjud bo'lsa, 38 GPUda masshtablash samaradorligi 64% gacha tushadi. Horovod bilan bir xil masshtablash samaradorligiga erishish uchun ishchilar soniga nisbatan serverlar sonini ikki baravar oshirish kerak.

Shakl 1. MXNet yordamida Horovod va parametr serveri bilan taqsimlangan o'rganishni taqqoslash
Quyidagi 1-jadvalda biz 64 ta grafik protsessorda eksperimentlar o'tkazishda har bir misol uchun yakuniy xarajatlarni solishtiramiz. MXNet-dan Horovod bilan foydalanish eng past narxda eng yaxshi o'tkazuvchanlikni ta'minlaydi.

Jadval 1. Xorovod va Parametr serveri o'rtasidagi xarajat taqqoslash, server va ishchi nisbati 2 dan 1 gacha.
Ko'paytirish uchun qadamlar
Keyingi bosqichlarda biz sizga MXNet va Horovod yordamida taqsimlangan trening natijasini qanday ko'paytirishni ko'rsatamiz. MXNet bilan taqsimlangan ta'lim haqida ko'proq ma'lumot olish uchun o'qing .
1 bosqichma
Tarqatilgan treningdan foydalanish uchun MXNet 1.4.0 yoki undan yuqori versiyasi va Horovod 0.16.0 yoki undan yuqori versiyasi bilan bir hil misollar klasterini yarating. Shuningdek, siz GPU treningi uchun kutubxonalarni o'rnatishingiz kerak bo'ladi. Bizning misollarimiz uchun biz tanladik Ubuntu 16.04 Linux, GPU drayveri 396.44, CUDA 9.2, cuDNN kutubxonasi 7.2.1, NCCL kommunikatori 2.2.13 va OpenMPI 3.1.1 bilan. Siz shuningdek foydalanishingiz mumkin , bu kutubxonalar allaqachon oldindan o'rnatilgan.
2 bosqichma
MXNet trening skriptingizga Horovod API bilan ishlash qobiliyatini qo'shing. MXNet Gluon API asosidagi quyidagi skript oddiy shablon sifatida ishlatilishi mumkin. Agar sizda tegishli o'quv skriptingiz bo'lsa, qalin chizilgan chiziqlar kerak bo'ladi. Horovod bilan o'rganish uchun bir nechta muhim o'zgarishlarni amalga oshirishingiz kerak:
- Trening to'g'ri grafik yadroda amalga oshirilganligini tushunish uchun mahalliy Horovod darajasiga (8-qator) muvofiq kontekstni o'rnating.
- Barcha ishchilar bir xil boshlang'ich parametrlar bilan boshlanishini ta'minlash uchun boshlang'ich parametrlarni bitta ishchidan hammaga (18-qator) o'tkazing.
- Horovod yarating Distributed Optimizer (25-satr) parametrlarni taqsimlangan tarzda yangilash.
To'liq skriptni olish uchun Horovod-MXNet misollariga qarang и .
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 bosqichma
MPI direktivasi yordamida taqsimlangan treningni boshlash uchun ishchilardan biriga kiring. Ushbu misolda taqsimlangan trening har birida 4 ta GPU va klasterda jami 16 GPU bo'lgan to'rtta misolda ishlaydi. Stochastic Gradient Descent (SGD) optimallashtiruvchisi quyidagi giperparametrlar bilan ishlatiladi:
- mini-partiya hajmi: 256
- o'rganish darajasi: 0.1
- impuls: 0.9
- vaznning pasayishi: 0.0001
Bitta GPU dan 64 ta GPUgacha masshtablashtirganimizdan so‘ng, biz o‘quv tezligini GPU soni bo‘yicha (0,1 GPU uchun 1 dan 6,4 GPU uchun 64 gacha) chiziqli ravishda kengaytirdik, shu bilan birga har bir GPU uchun tasvirlar sonini 256 ta (to‘plamdan) ushlab turdik. 256 GPU uchun 1 ta rasmdan 16 ta GPU uchun 384 64 tagacha). GPU soni ortishi bilan vaznning pasayishi va momentum parametrlari o'zgardi. NVIDIA Tesla GPU’lari tomonidan qo‘llab-quvvatlanadigan float16 hisob-kitoblarini tezlashtirish uchun oldinga o‘tish uchun float32 ma’lumotlar turi va gradientlar uchun float16 bilan aralash aniqlikdagi treningdan foydalandik.
$ 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.pyxulosa
Ushbu maqolada biz Apache MXNet va Horovod yordamida taqsimlangan modellarni o'qitishning kengaytiriladigan yondashuvini ko'rib chiqdik. ResNet50-v1 modeli o'qitilgan ImageNet ma'lumotlar to'plamida parametr server yondashuviga nisbatan biz masshtablash samaradorligi va iqtisodiy samaradorligini ko'rsatdik. Biz, shuningdek, Horovod yordamida ko'p nusxali treningni o'tkazish uchun mavjud skriptni o'zgartirish uchun foydalanishingiz mumkin bo'lgan qadamlarni ham kiritdik.
Agar siz MXNet va chuqur o'rganishni endigina boshlayotgan bo'lsangiz, o'rnatish sahifasiga o'ting birinchi MXNet qurish uchun. Shuningdek, maqolani o'qishni tavsiya etamiz boshlash uchun.
Agar siz allaqachon MXNet bilan ishlagan bo'lsangiz va Horovod bilan tarqatilgan o'rganishni sinab ko'rmoqchi bo'lsangiz, u holda qarang. , uni MXNet-dan yarating va misolga amal qiling yoki .
*xarajat asosida hisoblanadi EC2 nusxalari uchun AWS
Kurs haqida ko'proq bilib oling
Manba: www.habr.com
