Apache MXNet və Horovod ilə Paylanmış Öyrənmə

Məqalənin tərcüməsi kursun başlaması ərəfəsində hazırlanıb "Böyük verilənlər üzərində sənaye ML"

Ç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

Apache MX Net 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. Python, C + +, Clojure, Java, Julia, R, Scala və digərləri.

Parametr serveri ilə MXNet-də paylanmış təlim

MXNet-də standart paylanmış öyrənmə modulu 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

Horovod 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 MX Net, 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 horovod

Qeyd: 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 buradan.

Sonda test skriptini yükləyin mxnet_mnist.py buradan 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.py

Bu, 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.870000

Performans 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.

Apache MXNet və Horovod ilə Paylanmış Öyrənmə
Şə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.

Apache MXNet və Horovod ilə Paylanmış Öyrənmə
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 bu post.

1 addım

Paylanmış öyrənmədən istifadə etmək üçün MXNet 1.4.0 və ya daha yüksək versiyası və Horovod versiyası 0.16.0 və ya daha yüksək olan homogen nümunələr toplusu yaradın. Siz həmçinin GPU təlimi üçün kitabxanalar quraşdırmalısınız. Nümunələrimiz üçün GPU Driver 16.04, CUDA 396.44, cuDNN 9.2 kitabxanası, NCCL 7.2.1 kommunikatoru və OpenMPI 2.2.13 ilə Ubuntu 3.1.1 Linux-u seçdik. Siz də istifadə edə bilərsiniz Amazon Dərin Öyrənmə AMI, 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 MNIST и 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 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.py

Nə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 MXNeəvvəlcə MXNet qurmaq üçün. Məqaləni oxumağı da tövsiyə edirik 60 dəqiqə ərzində MXNetbaş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. Horovod quraşdırma səhifəsi, onu MXNet-dən qurun və nümunəyə əməl edin MNIST və ya IMAGEnet.

*qiymət əsasında hesablanır saatlıq tariflər EC2 Nümunələri üçün AWS

Kurs haqqında ətraflı məlumat əldə edin "Böyük verilənlər üzərində sənaye ML"

Mənbə: www.habr.com

Добавить комментарий