Məqalənin tərcüməsi kursun başlaması ərəfəsində hazırlanıb
Çoxsaylı yüksək performanslı hesablama nümunələri üzrə paylanmış təlim müasir dərin neyron şəbəkələrinin böyük həcmdə məlumat üzərində təlim vaxtını həftələrdən saatlara və hətta dəqiqələrə qədər azalda bilər və bu təlim texnikasını dərin öyrənmənin praktik tətbiqlərində üstünlük təşkil edir. İstifadəçilər məlumatların bir çox instansiyada necə paylaşılacağını və sinxronizasiya olunacağını başa düşməlidirlər ki, bu da öz növbəsində miqyaslaşdırmanın səmərəliliyinə böyük təsir göstərir. Bundan əlavə, istifadəçilər bir nüsxədə işləyən təlim skriptini birdən çox instansiyaya necə yerləşdirməyi də bilməlidirlər.
Bu yazıda açıq dərin öyrənmə kitabxanası Apache MXNet və Horovod paylanmış təlim çərçivəsindən istifadə edərək öyrənməni yaymağın sürətli və asan yolu haqqında danışacağıq. Biz Horovod çərçivəsinin performans üstünlüklərini aydın şəkildə nümayiş etdirəcəyik və MXNet təlim skriptini Horovod ilə paylanmış şəkildə işləməsi üçün necə yazmağı nümayiş etdirəcəyik.
Apache MXNet nədir
dərin neyron şəbəkələri yaratmaq, öyrətmək və yerləşdirmək üçün istifadə edilən açıq mənbəli dərin öyrənmə çərçivəsidir. MXNet neyron şəbəkələrinin tətbiqi ilə bağlı mürəkkəblikləri mücərrəd edir, yüksək performanslı və genişlənə bilir və kimi məşhur proqramlaşdırma dilləri üçün API təklif edir. , , , , , , və digərləri.
Parametr serveri ilə MXNet-də paylanmış təlim
parametr server yanaşmasından istifadə edir. O, hər bir işçidən gradientləri toplamaq, aqreqasiya yerinə yetirmək və növbəti optimallaşdırma iterasiyası üçün yenilənmiş qradientləri işçilərə göndərmək üçün bir sıra parametr serverlərindən istifadə edir. Serverlərin işçilərə düzgün nisbətinin müəyyən edilməsi effektiv miqyaslamanın açarıdır. Yalnız bir parametr serveri varsa, hesablamalarda darboğaz ola bilər. Əksinə, çox sayda server istifadə edilərsə, çoxlu əlaqə bütün şəbəkə bağlantılarını bağlaya bilər.
Horovod nədir
Uber-də hazırlanmış açıq paylanmış dərin öyrənmə çərçivəsidir. O, model parametrlərini voreclər arasında yaymaq və toplamaq üçün NVIDIA Kollektiv Rabitə Kitabxanası (NCCL) və Mesaj Keçid İnterfeysi (MPI) kimi səmərəli cross-GPU və cross-node texnologiyalarından istifadə edir. O, dərin neyron şəbəkə modelləri ilə işləyərkən şəbəkə bant genişliyindən istifadəni optimallaşdırır və yaxşı miqyas alır. Hal-hazırda bir neçə məşhur maşın öyrənmə çərçivələrini dəstəkləyir, yəni , Tensorflow, Keras və PyTorch.
MXNet və Horovod inteqrasiyası
MXNet Horovodda müəyyən edilmiş Paylanmış Öyrənmə API-ləri vasitəsilə Horovod ilə inteqrasiya edir. Horovod rabitə API-ləri horovod.broadcast(), horovod.allgather() и horovod.allreduce() tapşırıq qrafikinin bir hissəsi kimi MXNet mühərrikinin asinxron geri çağırışlarından istifadə etməklə həyata keçirilir. Bu şəkildə, sinxronizasiya nəticəsində performans itkilərinin qarşısını almaq üçün rabitə və hesablama arasındakı məlumat asılılığı MXNet mühərriki tərəfindən asanlıqla idarə olunur. Horovodda müəyyən edilmiş paylanmış optimallaşdırıcı obyekt horovod.DistributedOptimizer genişlənir Optimizator MXNet-də paylanmış parametr yeniləmələri üçün müvafiq Horovod API-lərini çağırır. Bütün bu icra təfərrüatları son istifadəçilər üçün şəffafdır.
Tez başlanğıc
Siz MacBook-unuzda MXNet və Horovod istifadə edərək MNIST verilənlər bazasında kiçik konvolyusiya neyron şəbəkəsini öyrətməyə tez başlaya bilərsiniz.
Əvvəlcə PyPI-dən mxnet və horovod quraşdırın:
pip install mxnet
pip install horovodQeyd: zamanı xəta ilə qarşılaşsanız pip quraşdırma horovodbəlkə bir dəyişən əlavə etməlisiniz MACOSX_DEPLOYMENT_TARGET=10.vvHara vv – bu sizin MacOS versiyanızın versiyasıdır, məsələn, MacOSX Sierra üçün siz yazmalısınız MACOSX_DEPLOYMENT_TARGET=10.12 pip quraşdırma horovod
Sonra OpenMPI quraşdırın .
Sonda test skriptini yükləyin mxnet_mnist.py və işçi qovluğundakı MacBook terminalında aşağıdakı əmrləri yerinə yetirin:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyBu, prosessorunuzun iki nüvəsində təlim keçirəcək. Çıxış aşağıdakı olacaq:
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.870000Performans nümayişi
ResNet50-v1 modelini səkkiz nümunəsi olan 64 GPU-da ImageNet verilənlər bazasında öyrədərkən p3.16xlarge Hər birində AWS buludunda 2 NVIDIA Tesla V8 GPU olan EC100, biz 45000 şəkil/san təlim ötürmə qabiliyyətinə nail olduq (yəni, saniyədə öyrədilmiş nümunələrin sayı). Təlim ən yaxşı 44% dəqiqliklə 90 dövrdən sonra 75.7 dəqiqə ərzində tamamlandı.
Biz bunu MXNet-in 8, 16, 32 və 64 GPU-larda bir parametr serveri və müvafiq olaraq 1-dən 1-ə və 2-dən 1-ə qədər olan server-işçi nisbəti ilə parametr serverlərindən istifadə etmək üzrə paylanmış təlim yanaşması ilə müqayisə etdik. Nəticəni aşağıdakı Şəkil 1-də görə bilərsiniz. Soldakı y oxunda çubuqlar saniyədə məşq ediləcək şəkillərin sayını, xətlər sağdakı y oxunda miqyaslama səmərəliliyini (yəni faktiki və ideal ötürmə qabiliyyətinə nisbətini) əks etdirir. Gördüyünüz kimi, serverlərin sayının seçimi miqyaslaşdırmanın səmərəliliyinə təsir göstərir. Yalnız bir parametr serveri varsa, miqyaslama səmərəliliyi 38 GPU-da 64%-ə enir. Horovod ilə eyni miqyaslama səmərəliliyinə nail olmaq üçün işçilərin sayına nisbətən serverlərin sayını ikiqat artırmalısınız.

Şəkil 1. MXNet-dən istifadə edərək Horovod və parametr serveri ilə paylanmış öyrənmənin müqayisəsi
Aşağıdakı Cədvəl 1-də 64 GPU-da eksperimentlər həyata keçirərkən hər nüsxənin yekun dəyərini müqayisə edirik. MXNet-in Horovod ilə istifadəsi ən aşağı qiymətə ən yaxşı ötürmə qabiliyyətini təmin edir.

Cədvəl 1. 2-dən 1-ə qədər bir serverin işçi nisbəti ilə Horovod və Parametr Serveri arasında qiymət müqayisəsi.
Çoxalmaq üçün addımlar
Növbəti addımlarda biz sizə MXNet və Horovod istifadə edərək paylanmış təlimin nəticəsini necə bərpa edəcəyinizi göstərəcəyik. MXNet ilə paylanmış öyrənmə haqqında ətraflı öyrənmək üçün oxuyun .
1 addım
Создайте кластер однородных экземпляров с 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. Также вы можете использовать , bu kitabxanalar artıq əvvəlcədən quraşdırılmışdır.
2 addım
MXNet təlim skriptinizə Horovod API ilə işləmək bacarığını əlavə edin. MXNet Gluon API-yə əsaslanan aşağıdakı skript sadə şablon kimi istifadə edilə bilər. Əgər sizdə artıq müvafiq təlim skriptiniz varsa qalın hərflərlə yazılmış sətirlər lazımdır. Horovod ilə öyrənmək üçün etməli olduğunuz bir neçə kritik dəyişikliklər bunlardır:
- Təlimin düzgün qrafik nüvəsində həyata keçirildiyini başa düşmək üçün yerli Horovod dərəcəsinə (sətir 8) uyğun olaraq konteksti təyin edin.
- Bütün işçilərin eyni ilkin parametrlərlə başlamasını təmin etmək üçün ilkin parametrləri bir işçidən hamıya keçirin (sətir 18).
- Horovod yaradın Distributed Optimizer (sətir 25) paylanmış şəkildə parametrləri yeniləmək üçün.
Tam skripti əldə etmək üçün Horovod-MXNet nümunələrinə müraciət edin и .
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 addım
MPI direktivindən istifadə edərək paylanmış təlimə başlamaq üçün işçilərdən birinə daxil olun. Bu nümunədə paylanmış təlim hər birində 4 GPU və klasterdə cəmi 16 GPU olan dörd instansiyada işləyir. Stokastik Qradient Eniş (SGD) optimallaşdırıcısı aşağıdakı hiperparametrlərlə istifadə olunacaq:
- mini dəstə ölçüsü: 256
- öyrənmə dərəcəsi: 0.1
- impuls: 0.9
- çəki azalması: 0.0001
Bir GPU-dan 64 GPU-ya qədər miqyaslandırdıqca, GPU-ya düşən şəkillərin sayını 0,1-da (bir dəstədən) saxlamaqla, GPU-ların sayına (1 GPU üçün 6,4-dən 64 GPU-ya 256-ə) uyğun olaraq təlim dərəcəsini miqyaslandırdıq. 256 GPU üçün 1 şəkil - 16 GPU üçün 384). GPU-ların sayı artdıqca çəki azalması və impuls parametrləri dəyişdi. NVIDIA Tesla GPU-ları tərəfindən dəstəklənən float64 hesablamalarını sürətləndirmək üçün irəli keçid üçün float16 məlumat növü və gradientlər üçün float32 ilə qarışıq dəqiqlikli təlimdən istifadə etdik.
$ 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.pyNəticə
Bu yazıda biz Apache MXNet və Horovod istifadə edərək paylanmış model təliminə genişlənə bilən yanaşmaya baxdıq. ResNet50-v1 modelinin öyrədildiyi ImageNet verilənlər bazasında parametr server yanaşması ilə müqayisədə miqyaslaşdırma səmərəliliyini və qənaətcilliyini nümayiş etdirdik. Biz həmçinin Horovod istifadə edərək çox instansiya təlimini həyata keçirmək üçün mövcud skripti dəyişdirmək üçün istifadə edə biləcəyiniz addımları daxil etdik.
MXNet və dərin öyrənməyə yenicə başlayırsınızsa, quraşdırma səhifəsinə keçin əvvəlcə MXNet qurmaq üçün. Məqaləni oxumağı da tövsiyə edirik başlamaq üçün.
Əgər siz artıq MXNet ilə işləmisinizsə və Horovod ilə paylanmış öyrənməyə cəhd etmək istəyirsinizsə, o zaman bura nəzər salın. , onu MXNet-dən qurun və nümunəyə əməl edin və ya .
*qiymət əsasında hesablanır EC2 Nümunələri üçün AWS
Kurs haqqında ətraflı məlumat əldə edin
Mənbə: www.habr.com
