Distribuerat lärande med Apache MXNet och Horovod

Översättningen av artikeln förbereddes strax före kursstart "Industriell maskininlärning på stordata"

Distribuerad träning över flera högpresterande datorinstanser kan minska träningstiden för moderna djupa neurala nätverk på stora mängder data från veckor till timmar eller till och med minuter, vilket gör denna träningsteknik vanlig i praktiska djupinlärningsapplikationer. Användare måste förstå hur man delar och synkroniserar data över flera instanser, vilket i sin tur har en stor inverkan på skalningseffektiviteten. Dessutom måste användarna också veta hur man distribuerar ett träningsskript som körs på en enda instans till flera instanser.

I den här artikeln kommer vi att prata om ett snabbt och enkelt sätt att utföra distribuerad träning med hjälp av det öppna källkodsbiblioteket Apache MXNet och det distribuerade träningsramverket Horovod. Vi kommer tydligt att visa fördelarna med Horovod-ramverket vad gäller prestanda och demonstrera hur man skriver ett MXNet-träningsskript så att det fungerar distribuerat med Horovod.

Vad är Apache MXNet

Apache MX Net – ett ramverk för djupinlärning med öppen källkod som används för att bygga, träna och driftsätta djupa neurala nätverk. MXNet abstraherar komplexiteten i samband med implementering av neurala nätverk, är mycket prestandarikt och skalbart och erbjuder API:er för populära programmeringsspråk som Python, C + +, Clojure, java, Julia, R, Skala och andra.

Distribuerad utbildning i MXNet med parameterserver

Standard distribuerad inlärningsmodul i MXNet använder en parameterservermetod. Den använder en uppsättning parameterservrar för att samla in gradienter från varje arbetare, utföra aggregering och skicka uppdaterade gradienter tillbaka till arbetare för nästa optimeringsiteration. Att bestämma rätt förhållande mellan servrar och arbetare är nyckeln till effektiv skalning. Om det bara finns en parameterserver kan den bli en beräkningsflaskhals. Omvänt, om det finns för många servrar, kan många-till-många-relationen täppa till alla nätverksanslutningar.

Vad är Horovod

Horovod – ett distribuerat ramverk för djupinlärning med öppen källkod, utvecklat på Uber. Det använder effektiva kommunikationstekniker för flera GPU:er och flera noder, såsom NVIDIA Collective Communications Library (NCCL) och Message Passing Interface (MPI), för att distribuera och aggregera modellparametrar över virveler. Det optimerar bandbreddsanvändningen och skalar bra vid körning av djupa neurala nätverksmodeller. Det stöder för närvarande flera populära ramverk för maskininlärning, nämligen MX Net, Tensorflow, Keras och PyTorch.

MXNet och Horovod-integration

MXNet integreras med Horovod via de distribuerade inlärnings-API:erna som definieras i Horovod. I Horovod är kommunikations-API:erna horovod.sändning(), horovod.allgather() и horovod.allreduce() implementeras med hjälp av asynkrona återanrop från MXNet-motorn som en del av dess uppgiftsgraf. På så sätt hanteras databeroenden mellan kommunikation och beräkning enkelt av MXNet-motorn för att undvika prestandaförluster på grund av synkronisering. Det distribuerade optimeringsobjektet som definieras i Horovod horovod.DistribueradOptimerare expanderar Optimizer i MXNet så att den anropar lämpliga Horovod-API:er för distribuerade parameteruppdateringar. Alla dessa implementeringsdetaljer är transparenta för slutanvändare.

Snabb start

Du kan snabbt börja träna ett litet faltningsneuralt nätverk på MNIST-datasetet med hjälp av MXNet och Horovod på din MacBook.
För att komma igång, installera mxnet och horovod från PyPI:

pip install mxnet
pip install horovod

Obs: Om du stöter på ett fel under pip installerar horovod, du kan behöva lägga till en variabel MACOSX_DEPLOYMENT_TARGET=10.vvvar vv – detta är versionen av din MacOS-version, till exempel för MacOSX Sierra behöver du skriva MACOSX_DEPLOYMENT_TARGET=10.12 pip installera horovod

Installera sedan OpenMPI hence.

Ladda upp testskriptet till slut mxnet_mnist.py hence och kör följande kommandon i MacBook-terminalen i arbetskatalogen:

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

Detta kommer att köra träningen på två kärnor i din processor. Utdata blir:

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

Prestandademonstration

Vid träning av ResNet50-v1-modellen på ImageNet-datauppsättningen på 64 GPU:er med åtta instanser p3.16xstor Med EC2, som var och en innehöll 8 NVIDIA Tesla V100 GPU:er i AWS-molnet, uppnådde vi en träningsdataflöde på 45000 44 bilder/sek (dvs. antalet tränade samplingar per sekund). Träningen slutfördes på 90 minuter efter 75.7 epoker med en maximal noggrannhet på XNUMX %.

Vi jämförde detta med distribuerad träning av MXNet med metoden att använda parameterservrar på 8, 16, 32 och 64 GPU:er med en enda parameterserver och ett server-till-arbetar-förhållande på 1:1 respektive 2:1. Du kan se resultatet i figur 1 nedan. Y-axeln till vänster visar antalet bilder att träna per sekund, och linjerna visar skalningseffektiviteten (dvs. förhållandet mellan faktisk och ideal dataflöde) på y-axeln till höger. Som du kan se påverkar valet av antal servrar skalningseffektiviteten. Med en enda parameterserver sjunker skalningseffektiviteten till 38 % på 64 GPU:er. För att uppnå samma skalningseffektivitet som Horovod måste du öka antalet servrar till dubbelt så många arbetare.

Distribuerat lärande med Apache MXNet och Horovod
Figur 1. Jämförelse av distribuerad träning med MXNet med Horovod och med parameterserver

I tabell 1 nedan jämför vi den slutliga kostnaden per instans när experimenten körs på 64 GPU:er. Att använda MXNet med Horovod ger bästa möjliga dataflöde till lägsta kostnad.

Distribuerat lärande med Apache MXNet och Horovod
Tabell 1. Kostnadsjämförelse mellan Horovod och en parameterserver med ett server-till-arbetar-förhållande på 2:1.

Steg för att reproducera

I följande steg visar vi hur man reproducerar det distribuerade träningsresultatet med hjälp av MXNet och Horovod. För att lära dig mer om distribuerad träning med MXNet, läs den här posten.

Steg 1

Создайте кластер однородных экземпляров с 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. Также вы можете использовать Amazon Deep Learning AMI, där dessa bibliotek redan är förinstallerade.

Steg 2

Förbättra ditt MXNet-träningsskript så att det fungerar med Horovod API. Följande skript, baserat på MXNet Gluon API, kan användas som en enkel mall. Raderna i fetstil behövs om du redan har ett träningsskript för att göra det. Här är några viktiga ändringar du behöver göra för att träna med Horovod:

  • Ställ in kontexten så att den matchar den lokala Horovod-rankningen (rad 8) för att säkerställa att träningen utförs på rätt GPU-kärna.
  • Skicka initialparametrar från en arbetare till alla (rad 18) för att säkerställa att alla arbetare börjar med samma initialparametrar.
  • Skapa Horovod Distribuerad optimering (rad 25) för att uppdatera parametrar på ett distribuerat sätt.

För det fullständiga skriptet, se Horovod-MXNet-exemplen 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    ...

Steg 3

Logga in på en av arbetarna för att köra distribuerad träning med MPI-direktivet. I det här exemplet körs distribuerad träning på fyra instanser med 4 GPU:er vardera, för totalt 16 GPU:er i klustret. Optimeraren som används är stokastisk gradient descent (SGD) med följande hyperparametrar:

  • minibatchstorlek: 256
  • inlärningshastighet: 0.1
  • momentum: 0.9
  • viktminskning: 0.0001

När vi skalade från en enda GPU till 64 GPU:er, skalade vi träningshastigheten linjärt med antalet GPU:er (från 0,1 för 1 GPU till 6,4 för 64 GPU:er) samtidigt som antalet bilder per GPU hölls på 256 (från en sats med 256 bilder för 1 GPU till 16 384 för 64 GPU:er). Viktminskningen och momentumparametrarna varierade allt eftersom antalet GPU:er ökade. Vi använde blandad precisionsträning med float16-datatypen för framåtpassningen och float32 för gradienter för att snabba upp float16-beräkningar som stöds av NVIDIA Tesla GPU:er.

$ 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

Slutsats

I den här artikeln tittade vi på en skalbar metod för distribuerad modellträning med hjälp av Apache MXNet och Horovod. Vi visade skalbarheten och kostnadseffektiviteten jämfört med parameterservermetoden på ImageNet-datasetet, som tränade ResNet50-v1-modellen. Vi visade också stegen du kan vidta för att modifiera ett befintligt skript för att köra träning på flera instanser med hjälp av Horovod.

Om du precis har börjat med MXNet och djupinlärning, gå till installationssidan MXNe, för att först bygga MXNet. Vi rekommenderar också starkt att du läser artikeln MXNet på 60 minuteratt komma igång.

Om du redan har arbetat med MXNet och vill prova distribuerad inlärning med Horovod, kolla då in Horovod installationssida, kompilera den med MXNet och följ exemplet MNIST eller IMAGEnet.

*kostnaden beräknas baserat på timpriser AWS för EC2-instanser

Läs mer om kursen "Industriell maskininlärning på stordata"

Källa: will.com

Köp pålitlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster