Мақаланың аудармасы курстың басталу қарсаңында дайындалды
Бірнеше жоғары өнімді есептеу даналары бойынша таратылған оқыту қазіргі заманғы терең нейрондық желілерді үлкен көлемдегі деректерге оқыту уақытын аптадан сағатқа немесе тіпті минутқа дейін қысқартуы мүмкін, бұл оқыту әдісін терең оқытудың практикалық қолдануларында басым етеді. Пайдаланушылар деректерді бірнеше даналар бойынша бөлісу және синхрондауды түсінуі керек, бұл өз кезегінде масштабтау тиімділігіне үлкен әсер етеді. Бұған қоса, пайдаланушылар бір данада бірнеше данаға жұмыс істейтін оқу сценарийін қолдану жолын білуі керек.
Бұл мақалада біз Apache MXNet терең оқытудың ашық кітапханасын және Horovod таратылған оқыту негізін пайдаланып оқуды таратудың жылдам және оңай жолы туралы айтатын боламыз. Біз Horovod құрылымының өнімділік артықшылықтарын нақты көрсетеміз және MXNet оқу сценарийін Horovod бағдарламасымен бөлінген түрде жұмыс істейтін етіп жазу жолын көрсетеміз.
Apache MXNet дегеніміз не
терең нейрондық желілерді құру, оқыту және орналастыру үшін пайдаланылатын ашық бастапқы терең оқыту жүйесі. MXNet нейрондық желілерді енгізумен байланысты күрделіліктерді қысқартады, жоғары өнімді және масштабталады және танымал бағдарламалау тілдері үшін API ұсынады. , , , , , , және басқалар.
Параметр сервері бар MXNet-те таратылған оқыту
параметр сервері тәсілін қолданады. Ол әрбір жұмысшыдан градиенттерді жинау, біріктіруді орындау және келесі оңтайландыру итерациясы үшін жаңартылған градиенттерді жұмысшыларға жіберу үшін параметр серверлерінің жинағын пайдаланады. Серверлердің жұмысшыларға дұрыс қатынасын анықтау тиімді масштабтаудың кілті болып табылады. Егер бір ғана параметр сервері болса, ол есептеулерде тығырыққа тірелуі мүмкін. Керісінше, тым көп серверлер пайдаланылса, көптен көпке байланыс барлық желі қосылымдарын бітеп тастауы мүмкін.
Хоровод дегеніміз не
Uber-те әзірленген ашық бөлінген терең оқыту жүйесі. Ол NVIDIA ұжымдық коммуникациялар кітапханасы (NCCL) және хабарламаларды жіберу интерфейсі (MPI) сияқты тиімді кросс-GPU және торапаралық технологияларды пайдаланады, бұл модель параметрлерін vorecs бойынша тарату және біріктіру үшін. Ол желінің өткізу қабілеттілігін пайдалануды оңтайландырады және терең нейрондық желі үлгілерімен жұмыс істегенде жақсы масштабтайды. Қазіргі уақытта ол бірнеше танымал машиналық оқыту негіздерін қолдайды, атап айтқанда , Tensorflow, Keras және PyTorch.
MXNet және Horovod интеграциясы
MXNet Horovod-та анықталған Бөлінген оқыту API интерфейстері арқылы Horovod-пен интеграцияланады. Horovod байланыс API интерфейстері horovod.broadcast(), horovod.allgather() и horovod.allreduce() MXNet қозғалтқышының асинхронды кері шақырулары арқылы оның тапсырмалар графигінің бөлігі ретінде жүзеге асырылады. Осылайша, синхрондау салдарынан өнімділік жоғалуын болдырмау үшін байланыс пен есептеу арасындағы деректер тәуелділігін MXNet қозғалтқышы оңай өңдейді. Горовода анықталған бөлінген оңтайландыру нысаны horovod.DistributedOptimizer ұзартады Оңтайландырушы MXNet жүйесінде таратылған параметр жаңартулары үшін сәйкес Horovod API интерфейстерін шақырады. Барлық осы іске асыру мәліметтері соңғы пайдаланушылар үшін ашық.
Жылдам бастау
MacBook компьютеріңізде MXNet және Horovod көмегімен MNIST деректер жинағында шағын конвульсиялық нейрондық желіні оқытуды жылдам бастауға болады.
Алдымен PyPI-ден mxnet және horovod орнатыңыз:
pip install mxnet
pip install horovodЕскертпе: кезінде қатеге тап болсаңыз pip орнату 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 графикалық процессорында оқыту кезінде p3.16xlarge EC2, әрқайсысында AWS бұлтындағы 8 NVIDIA Tesla V100 GPU бар, біз 45000 44 кескін/сек (яғни, секундына оқытылатын үлгілердің саны) оқыту өткізу қабілетіне қол жеткіздік. Жаттығу 90 дәуірден кейін 75.7 минутта XNUMX% ең жақсы дәлдікпен аяқталды.
Біз мұны MXNet-тің бір параметр сервері және сәйкесінше 8-ден 16-ге және 32-ден 64-ге дейінгі серверден жұмысшыға қатынасы бар 1, 1, 2 және 1 GPU-де параметр серверлерін пайдалану бойынша бөлінген оқыту тәсілімен салыстырдық. Нәтижені төмендегі 1-суреттен көре аласыз. Сол жақтағы y осінде жолақтар секундына жаттықтырылатын кескіндер санын, сызықтар оң жақтағы у осінде масштабтау тиімділігін (яғни, нақты және идеалды өткізу қабілетінің қатынасын) көрсетеді. Көріп отырғаныңыздай, серверлер санын таңдау масштабтау тиімділігіне әсер етеді. Бір ғана параметр сервері болса, масштабтау тиімділігі 38 GPU-да 64%-ға дейін төмендейді. Horovod сияқты масштабтау тиімділігіне қол жеткізу үшін жұмысшылар санына қатысты серверлер санын екі есе арттыру керек.

Сурет 1. MXNet көмегімен Horovod және параметр серверімен бөлінген оқытуды салыстыру
Төмендегі 1-кестеде 64 графикалық процессорында эксперименттерді іске қосу кезінде бір дананың соңғы құнын салыстырамыз. MXNet-ті Horovod-пен пайдалану ең төмен бағамен ең жақсы өткізу қабілеттілігін қамтамасыз етеді.

1-кесте. 2-ден 1-ге дейінгі сервер мен жұмысшы қатынасы бар Horovod және Параметр сервері арасындағы шығындарды салыстыру.
Көбею қадамдары
Келесі қадамдарда біз MXNet және Horovod көмегімен таратылған оқыту нәтижесін қалай шығару керектігін көрсетеміз. MXNet арқылы бөлінген оқыту туралы қосымша ақпарат алу үшін оқыңыз .
қадам 1
Таратылған оқытуды пайдалану үшін MXNet 1.4.0 немесе одан жоғары нұсқасымен және Horovod 0.16.0 немесе одан жоғары нұсқасымен біртекті даналардың кластерін жасаңыз. Сондай-ақ, GPU оқытуына арналған кітапханаларды орнату қажет болады. Біздің даналары үшін біз таңдадық Ubuntu 16.04 Linux, GPU драйвері 396.44, CUDA 9.2, cuDNN кітапханасы 7.2.1, NCCL коммуникаторы 2.2.13 және OpenMPI 3.1.1 арқылы. Сіз сондай-ақ пайдалана аласыз , бұл кітапханалар алдын ала орнатылған.
қадам 2
MXNet оқу сценарийіне Horovod API интерфейсімен жұмыс істеу мүмкіндігін қосыңыз. MXNet Gluon API негізіндегі төмендегі сценарийді қарапайым үлгі ретінде пайдалануға болады. Егер сізде сәйкес оқу сценарийі бар болса, қалың қаріппен жазылған жолдар қажет. Міне, Хороводпен үйрену үшін сізге қажет бірнеше маңызды өзгерістер:
- Жаттығу дұрыс графикалық ядрода орындалатынын түсіну үшін жергілікті Хоровод дәрежесіне сәйкес мәтінмәнді орнатыңыз (8-жол).
- Барлық жұмысшылардың бірдей бастапқы параметрлерден басталуын қамтамасыз ету үшін бастапқы параметрлерді бір жұмысшыдан барлығына (18-жол) өткізіңіз.
- Хоровод жасаңыз DistributedOptimizer (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 GPU және кластерде барлығы 16 GPU бар төрт данада орындалады. Стохастикалық градиентті түсіру (SGD) оңтайландырғышы келесі гиперпараметрлермен бірге пайдаланылады:
- шағын топтама мөлшері: 256
- оқу жылдамдығы: 0.1
- импульс: 0.9
- салмақ ыдырауы: 0.0001
Бір GPU-дан 64 GPU-ға дейін масштабтаған кезде, біз GPU санына қарай (0,1 GPU үшін 1-ден 6,4 GPU үшін 64-ке дейін), GPU-дағы кескіндер санын 256-да (бір топтамадан) сақтай отырып, жаттығу жылдамдығын сызықты түрде масштабтадық. 256 GPU үшін 1 сурет пен 16 GPU үшін 384 64 сурет). Салмақ ыдырауы мен импульс параметрлері GPU саны артқан сайын өзгерді. Біз NVIDIA Tesla графикалық процессорлары қолдайтын float16 есептеулерін жылдамдату үшін алға өту үшін float32 деректер түрімен және градиенттер үшін float16 арқылы аралас дәлдік жаттығуларын қолдандық.
$ 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 көмегімен бөлінген үлгіні оқытудың масштабталатын тәсілін қарастырдық. Біз ResNet50-v1 моделі оқытылған ImageNet деректер жинағындағы параметр сервері тәсілімен салыстырғанда масштабтау тиімділігі мен үнемділігін көрсеттік. Біз сонымен қатар Horovod арқылы көп даналық оқытуды іске қосу үшін бар сценарийді өзгерту үшін пайдалануға болатын қадамдарды қостық.
Егер сіз MXNet және терең үйренуді енді бастасаңыз, орнату бетіне өтіңіз алдымен MXNet құру үшін. Сондай-ақ мақаланы оқуды ұсынамыз бастау үшін.
Егер сіз MXNet-те бұрыннан жұмыс істеген болсаңыз және Horovod көмегімен бөлінген оқытуды қолданғыңыз келсе, мынаны қараңыз. , оны MXNet сайтынан құрастырыңыз және мысалды орындаңыз немесе .
*құны негізінде есептеледі EC2 даналарына арналған AWS
Курс туралы көбірек біліңіз
Ақпарат көзі: www.habr.com
