Uczenie rozproszone z Apache MXNet i Horovod

Tłumaczenie artykułu zostało przygotowane w przeddzień rozpoczęcia kursu „Przemysłowe ML na Big Data”

Rozproszone szkolenie na wielu wysokowydajnych instancjach obliczeniowych może skrócić czas uczenia nowoczesnych głębokich sieci neuronowych na dużych ilościach danych z tygodni do godzin, a nawet minut, dzięki czemu ta technika szkoleniowa jest powszechna w praktycznych zastosowaniach głębokiego uczenia się. Użytkownicy muszą wiedzieć, jak udostępniać i synchronizować dane w wielu instancjach, co z kolei ma duży wpływ na efektywność skalowania. Ponadto użytkownicy powinni także wiedzieć, jak wdrożyć skrypt szkoleniowy uruchamiany w jednej instancji w wielu instancjach.

W tym artykule omówimy szybki i łatwy sposób dystrybucji nauki przy użyciu otwartej biblioteki głębokiego uczenia się Apache MXNet i platformy uczenia się rozproszonego Horovod. Wyraźnie zademonstrujemy korzyści wydajnościowe frameworka Horovod i pokażemy, jak napisać skrypt szkoleniowy MXNet, aby działał w sposób rozproszony z Horovodem.

Co to jest Apache MXNet

Apache MX Net to platforma głębokiego uczenia się typu open source, która służy do tworzenia, uczenia i wdrażania głębokich sieci neuronowych. MXNet eliminuje złożoność związaną z wdrażaniem sieci neuronowych, jest wysoce wydajny i skalowalny oraz oferuje interfejsy API dla popularnych języków programowania, takich jak Python, C + +, Clojure, Java, Julia, R, Scala i innych.

Szkolenie rozproszone w MXNet z serwerem parametrów

Standardowy moduł rozproszonego uczenia się w MXNet wykorzystuje podejście serwera parametrów. Wykorzystuje zestaw serwerów parametrów do zbierania gradientów od każdego procesu roboczego, przeprowadzania agregacji i wysyłania zaktualizowanych gradientów z powrotem do pracowników w celu następnej iteracji optymalizacji. Określenie prawidłowego stosunku serwerów do pracowników jest kluczem do skutecznego skalowania. Jeśli jest tylko jeden serwer parametrów, może się to okazać wąskim gardłem w obliczeniach. I odwrotnie, jeśli używanych jest zbyt wiele serwerów, komunikacja wiele do wielu może spowodować zablokowanie wszystkich połączeń sieciowych.

Co to jest Horovod

Horowod to otwarta, rozproszona platforma głębokiego uczenia się opracowana przez firmę Uber. Wykorzystuje wydajne technologie obsługujące wiele procesorów graficznych i wiele węzłów, takie jak NVIDIA Collective Communications Library (NCCL) i Message Passing Interface (MPI), aby dystrybuować i agregować parametry modelu pomiędzy vorecami. Optymalizuje wykorzystanie przepustowości sieci i dobrze skaluje się podczas pracy z modelami głębokich sieci neuronowych. Obecnie obsługuje kilka popularnych frameworków uczenia maszynowego, a mianowicie Sieć MX, Tensorflow, Keras i PyTorch.

Integracja MXNet i Horovod

MXNet integruje się z Horovodem poprzez interfejsy API rozproszonego uczenia się zdefiniowane w Horovod. Interfejsy API komunikacji Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() zaimplementowany przy użyciu asynchronicznych wywołań zwrotnych silnika MXNet, jako część jego wykresu zadań. W ten sposób zależności danych między komunikacją a obliczeniami są łatwo obsługiwane przez silnik MXNet, aby uniknąć strat wydajności spowodowanych synchronizacją. Rozproszony obiekt optymalizatora zdefiniowany w Horovodzie horovod.DistributedOptimizer rozszerza się Optimizer w MXNet, aby wywoływał odpowiednie interfejsy API Horovoda w celu rozproszonych aktualizacji parametrów. Wszystkie szczegóły implementacji są przejrzyste dla użytkowników końcowych.

Szybki start

Możesz szybko rozpocząć trenowanie małej splotowej sieci neuronowej na zbiorze danych MNIST, korzystając z MXNet i Horovod na MacBooku.
Najpierw zainstaluj mxnet i horovod z PyPI:

pip install mxnet
pip install horovod

Uwaga: jeśli napotkasz błąd podczas pip zainstaluj horovodmoże trzeba dodać zmienną MACOSX_DEPLOYMENT_TARGET=10.vvGdzie vv – to jest wersja Twojej wersji MacOS, np. dla MacOSX Sierra będziesz musiał napisać MACOSX_DEPLOYMENT_TARGET=10.12 pip instaluje horovod

Następnie zainstaluj OpenMPI stąd.

Na koniec pobierz skrypt testowy mxnet_mnist.py stąd i uruchom następujące polecenia na terminalu MacBook w katalogu roboczym:

mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py

Spowoduje to uruchomienie szkolenia na dwóch rdzeniach procesora. Dane wyjściowe będą następujące:

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

Demo wydajności

Podczas uczenia modelu ResNet50-v1 na zestawie danych ImageNet na 64 procesorach graficznych z ośmioma instancjami p3.16xduży EC2, każdy zawierający 8 procesorów graficznych NVIDIA Tesla V100 w chmurze AWS, osiągnęliśmy przepustowość szkoleniową wynoszącą 45000 44 obrazów/s (tj. liczbę trenowanych próbek na sekundę). Trening ukończony w 90 minuty po 75.7 epokach z najlepszą dokładnością XNUMX%.

Porównaliśmy to z podejściem rozproszonego szkolenia MXNet, polegającym na wykorzystaniu serwerów parametrów na 8, 16, 32 i 64 procesorach graficznych z serwerem z jednym parametrem i stosunkiem serwera do procesora roboczego wynoszącym odpowiednio 1 do 1 i 2 do 1. Wynik możesz zobaczyć na rysunku 1 poniżej. Na osi Y po lewej stronie słupki reprezentują liczbę obrazów do wytrenowania na sekundę, a linie odzwierciedlają wydajność skalowania (to znaczy stosunek rzeczywistej do idealnej przepustowości) na osi Y po prawej stronie. Jak widać wybór ilości serwerów wpływa na efektywność skalowania. Jeśli jest tylko jeden serwer parametrów, wydajność skalowania spada do 38% w przypadku 64 procesorów graficznych. Aby osiągnąć taką samą wydajność skalowania jak w przypadku Horovoda, należy podwoić liczbę serwerów w stosunku do liczby pracowników.

Uczenie rozproszone z Apache MXNet i Horovod
Rysunek 1. Porównanie rozproszonego uczenia się przy użyciu MXNet z Horovodem i serwerem parametrów

W Tabeli 1 poniżej porównujemy ostateczny koszt na instancję podczas przeprowadzania eksperymentów na 64 procesorach graficznych. Korzystanie z MXNet z Horovodem zapewnia najlepszą przepustowość przy najniższych kosztach.

Uczenie rozproszone z Apache MXNet i Horovod
Tabela 1. Porównanie kosztów Horovoda i Parameter Server przy stosunku serwera do liczby pracowników wynoszącym 2 do 1.

kroki ku reprodukcji

W kolejnych krokach pokażemy Ci, jak odtworzyć wynik rozproszonego szkolenia przy użyciu MXNet i Horovod. Aby dowiedzieć się więcej o nauczaniu rozproszonym za pomocą MXNet, przeczytaj ten post.

Krok 1

Utwórz klaster jednorodnych instancji z MXNet w wersji 1.4.0 lub nowszej i Horovodem w wersji 0.16.0 lub nowszej, aby korzystać z uczenia rozproszonego. Będziesz także musiał zainstalować biblioteki do szkolenia GPU. W naszych przypadkach wybraliśmy Ubuntu 16.04 Linux ze sterownikiem GPU 396.44, CUDA 9.2, biblioteką cuDNN 7.2.1, komunikatorem NCCL 2.2.13 i OpenMPI 3.1.1. Możesz także użyć Amazon Deep Learning AMI, gdzie te biblioteki są już preinstalowane.

Krok 2

Dodaj możliwość pracy z API Horovod do swojego skryptu szkoleniowego MXNet. Poniższy skrypt oparty na API MXNet Gluon może służyć jako prosty szablon. Pogrubione linie są potrzebne, jeśli masz już odpowiedni skrypt szkoleniowy. Oto kilka kluczowych zmian, które musisz wprowadzić, aby uczyć się z Horovodem:

  • Ustaw kontekst zgodnie z lokalną rangą Horovoda (wiersz 8), aby zrozumieć, że szkolenie odbywa się na właściwym rdzeniu graficznym.
  • Przekaż parametry początkowe z jednego procesu roboczego do wszystkich (linia 18), aby mieć pewność, że wszyscy pracownicy rozpoczynają od tych samych parametrów początkowych.
  • Stwórz Horovoda Rozproszony optymalizator (linia 25), aby zaktualizować parametry w sposób rozproszony.

Aby uzyskać pełny skrypt, zapoznaj się z przykładami Horovod-MXNet 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    ...

Krok 3

Zaloguj się do jednego z pracowników, aby rozpocząć rozproszone szkolenie z wykorzystaniem dyrektywy MPI. W tym przykładzie rozproszone szkolenie jest uruchamiane w czterech instancjach z 4 procesorami graficznymi każda i łącznie 16 procesorami graficznymi w klastrze. Optymalizator Stochastic Gradient Descent (SGD) będzie używany z następującymi hiperparametrami:

  • wielkość mini-partii: 256
  • szybkość uczenia się: 0.1
  • pęd: 0.9
  • spadek masy: 0.0001

W miarę skalowania z jednego procesora graficznego do 64 procesorów graficznych liniowo skalowaliśmy częstotliwość uczenia w zależności od liczby procesorów graficznych (od 0,1 dla 1 procesora graficznego do 6,4 dla 64 procesorów graficznych), utrzymując liczbę obrazów na procesor graficzny na poziomie 256 (z partii 256 obrazów dla 1 procesora graficznego do 16 384 dla 64 procesorów graficznych). Parametry zaniku masy i pędu zmieniały się wraz ze wzrostem liczby procesorów graficznych. Zastosowaliśmy trening o mieszanej precyzji z typem danych float16 dla przebiegu w przód i float32 dla gradientów, aby przyspieszyć obliczenia float16 obsługiwane przez procesory graficzne 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

wniosek

W tym artykule przyjrzeliśmy się skalowalnemu podejściu do uczenia modeli rozproszonych przy użyciu Apache MXNet i Horovod. Zademonstrowaliśmy efektywność skalowania i opłacalność w porównaniu z podejściem serwera parametrów w zestawie danych ImageNet, na którym szkolono model ResNet50-v1. Uwzględniliśmy także kroki, które można wykorzystać do zmodyfikowania istniejącego skryptu w celu uruchomienia szkolenia z wieloma instancjami przy użyciu Horovoda.

Jeśli dopiero zaczynasz korzystać z MXNet i głębokiego uczenia się, przejdź do strony instalacji MXNeaby najpierw zbudować MXNet. Gorąco polecamy również przeczytanie artykułu MXNet w 60 minutrozpocząć.

Jeśli pracowałeś już z MXNet i chcesz wypróbować nauczanie rozproszone z Horovodem, spójrz na Strona instalacyjna Horovoda, zbuduj go z MXNet i postępuj zgodnie z przykładem MNIST lub ImageNet.

*koszt obliczany jest na podstawie stawki godzinowe AWS dla instancji EC2

Dowiedz się więcej o kursie „Przemysłowe ML na Big Data”

Źródło: www.habr.com

Dodaj komentarz