Tłumaczenie artykułu zostało przygotowane w przeddzień rozpoczęcia kursu
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
Szkolenie rozproszone w MXNet z serwerem parametrów
Co to jest Horovod
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
Na koniec pobierz skrypt testowy mxnet_mnist.py
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.
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.
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
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ć
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
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
Jeśli pracowałeś już z MXNet i chcesz wypróbować nauczanie rozproszone z Horovodem, spójrz na
*koszt obliczany jest na podstawie
Dowiedz się więcej o kursie
Źródło: www.habr.com