Verdeelt Léieren mat Apache MXNet an Horovod

D'Iwwersetzung vum Artikel gouf um Virowend vum Start vum Cours virbereet "Industriell ML op Big Data"

Verdeelt Training op Multiple High-Performance Computing Instanzen kënnen d'Trainingszäit vu modernen déifneuralen Netzwierker op grouss Quantitéiten un Daten vu Wochen op Stonnen oder souguer Minutten reduzéieren, sou datt dës Trainingstechnik an prakteschen Uwendunge vum Deep Learning verbreet ass. D'Benotzer musse verstoen wéi d'Donnéeën iwwer verschidde Instanzen deelen an synchroniséieren, wat am Tour e groussen Impakt op d'Skaléierungseffizienz huet. Zousätzlech sollten d'Benotzer och wësse wéi een en Trainingsskript ofsetzt deen op enger eenzeger Instanz op verschidde Instanzen leeft.

An dësem Artikel schwätze mir iwwer e séieren an einfache Wee fir Léieren ze verdeelen mat der oppener Deep Learning Bibliothéik Apache MXNet an dem Horovod verdeelt Léierkader. Mir wäerte kloer d'Performance Virdeeler vum Horovod Kader weisen a weisen wéi een en MXNet Trainingsskript schreift sou datt et op eng verdeelt Manéier mat Horovod funktionnéiert.

Wat ass Apache MXNet

Apache MX Net ass en Open-Source Deep Learning Kader dee benotzt gëtt fir déif neural Netzwierker ze kreéieren, ze trainéieren an z'installéieren. MXNet abstrakt d'Komplexitéite verbonne mat der Ëmsetzung vun neurale Netzwierker, ass héich performant a skalierbar, a bitt APIs fir populär Programméierungssprooche wéi z. Python, C ++, Clojure, Java, Julia, R, Scala an anerer.

Verdeelt Training am MXNet mat Parameterserver

Standard verdeelt Léiermodul am MXNet benotzt engem Parameter Server Approche. Et benotzt eng Rei vu Parameterservere fir Gradienten vun all Aarbechter ze sammelen, Aggregatioun auszeféieren an aktualiséiert Gradienten zréck un d'Aarbechter fir déi nächst Optimisatiounsiteratioun ze schécken. D'Bestëmmung vum korrekte Verhältnis vu Serveren zu Aarbechter ass de Schlëssel fir effektiv Skaléieren. Wann et nëmmen ee Parameterserver gëtt, kann et e Flaschenhals an de Berechnunge ginn. Ëmgekéiert, wann ze vill Servere benotzt ginn, kann vill-zu-vill Kommunikatioun all Netzwierkverbindunge verstoppen.

Wat ass Horovod

Horovod ass en oppene verdeelt Deep Learning Kader entwéckelt bei Uber. Et benotzt efficace Cross-GPU an Kräiz-Node Technologien wéi NVIDIA Collective Communications Library (NCCL) a Message Passing Interface (MPI) fir Modellparameter iwwer vorecs ze verdeelen an ze aggregéieren. Et optiméiert d'Benotzung vun der Netzwierkbandbreedung a skaléiert gutt wann Dir mat deep neuralen Netzwierkmodeller schafft. Et ënnerstëtzt de Moment verschidde populär Maschinn Léieren Kaderen, nämlech MX Net, Tensorflow, Keras a PyTorch.

MXNet an Horovod Integratioun

MXNet integréiert mat Horovod duerch d'Distributed Learning APIs definéiert an Horovod. Horovod Kommunikatioun APIen horovod.broadcast(), horovod.allgather() и horovod.allreduce() implementéiert mat asynchronen Callbacks vum MXNet Motor, als Deel vu senger Taskgrafik. Op dës Manéier ginn Datenabhängegkeeten tëscht Kommunikatioun a Berechnung einfach vum MXNet-Motor gehandhabt fir Leeschtungsverloscht wéinst Synchroniséierung ze vermeiden. Verdeelt Optimizer Objet definéiert an Horovod horovod.DistributedOptimizer erweidert Optimizer an MXNet sou datt et déi entspriechend Horovod APIs fir verdeelt Parameterupdates nennt. All dës Ëmsetzungsdetailer sinn transparent fir Endbenotzer.

Schnell Start

Dir kënnt séier ufänken e klengt convolutional neuralt Netzwierk op der MNIST Dataset mat MXNet an Horovod op Ärem MacBook ze trainéieren.
Als éischt installéiere mxnet an horovod vu PyPI:

pip install mxnet
pip install horovod

Notiz: Wann Dir e Feeler begéint während pip installéieren horovodvläicht musst Dir eng Variabel derbäisetzen MACOSX_DEPLOYMENT_TARGET=10.vvwou vv - dëst ass d'Versioun vun Ärer MacOS Versioun, zum Beispill, fir MacOSX Sierra musst Dir schreiwen MACOSX_DEPLOYMENT_TARGET=10.12 Pip installéieren Horovod

Installéiert dann OpenMPI vun hei.

Um Enn luet den Testskript erof mxnet_mnist.py vun hei a lafen déi folgend Kommandoen am MacBook Terminal am Aarbechtsverzeechnes:

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

Dëst wäert Training op zwee Käre vun Ärem Prozessor lafen. D'Ausgab wäert déi folgend sinn:

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

Leeschtung Demo

Wann Dir e ResNet50-v1 Modell trainéiert op engem ImageNet Dataset op 64 GPUs mat aacht Instanzen p3.16x grouss EC2, jidderee mat 8 NVIDIA Tesla V100 GPUs op AWS Cloud, hu mir en Trainingsduerchgang vu 45000 Biller / Sek erreecht (dh d'Zuel vun trainéierte Proben pro Sekonn). Training ofgeschloss an 44 Minutten no 90 Epochen mat enger bescht Genauegkeet vu 75.7%.

Mir verglach dëst mat MXNet verdeelt Training Approche fir Parameterserveren op 8, 16, 32 an 64 GPUs mat engem eenzege Parameterserver an engem Server an Aarbechtsverhältnis vun 1 bis 1 respektiv 2 bis 1 ze benotzen. Dir kënnt d'Resultat an der Figur 1 hei ënnen gesinn. Op der Y-Achs op der lénker Säit representéieren d'Barren d'Zuel vun de Biller fir pro Sekonn ze trainéieren, d'Linnen reflektéieren d'Skaléierungseffizienz (dat ass d'Verhältnis vum aktuellen an idealen Duerchsatz) op der Y-Achs op der rietser. Wéi Dir kënnt gesinn, beaflosst d'Wiel vun der Zuel vun de Serveren d'Skaléierungseffizienz. Wann et nëmmen ee Parameterserver gëtt, fällt d'Skaléierungseffizienz op 38% op 64 GPUs. Fir déi selwecht Skaléierungseffizienz wéi mat Horovod z'erreechen, musst Dir d'Zuel vun de Serveren relativ zu der Unzuel vun den Aarbechter verdoppelen.

Verdeelt Léieren mat Apache MXNet an Horovod
Figur 1. Verglach vun verdeelt Léieren benotzt MXNet mat Horovod a mat Parameter Server

An der Tabell 1 hei drënner vergläichen mir d'Finale Käschten pro Instanz wann Dir Experimenter op 64 GPUs leeft. Benotzt MXNet mat Horovod bitt de beschten Duerchsatz zu de niddregsten Käschten.

Verdeelt Léieren mat Apache MXNet an Horovod
Dësch 1. Käschte Verglach tëscht Horovod a Parameter Server mat engem Server zu Aarbechter Verhältnis vun 2 zu 1.

Schrëtt fir ze reproduzéieren

An den nächste Schrëtt wäerte mir Iech weisen wéi Dir d'Resultat vun der verdeelerer Training mat MXNet an Horovod reproduzéiert. Fir méi iwwer verdeelt Léieren mat MXNet ze léieren, liest dësem Post.

Schrëtt 1

Erstellt e Cluster vun homogenen Instanzen mat MXNet Versioun 1.4.0 oder méi héich an Horovod Versioun 0.16.0 oder méi héich fir verdeelt Training ze benotzen. Dir musst och d'Bibliothéike fir GPU-Training installéieren. Fir eis Instanzen hu mir gewielt Ubuntu 16.04 Linux, mat GPU Driver 396.44, CUDA 9.2, cuDNN Bibliothéik 7.2.1, NCCL Kommunikator 2.2.13 an OpenMPI 3.1.1. Dir kënnt och benotzen Amazon Deep Learning AMI, wou dës Bibliothéike scho virinstalléiert sinn.

Schrëtt 2

Füügt d'Fäegkeet fir mat der Horovod API an Ärem MXNet Trainingsskript ze schaffen. De Skript hei ënnen baséiert op der MXNet Gluon API kann als einfach Schabloun benotzt ginn. D'Linnen a Fett sinn néideg wann Dir schonn en entspriechend Trainingsskript hutt. Hei sinn e puer kritesch Ännerungen déi Dir maache musst fir mat Horovod ze léieren:

  • Setzt de Kontext no der lokaler Horovod Rank (Linn 8) fir ze verstoen datt d'Ausbildung op de richtege Grafikkär ausgefouert gëtt.
  • Passe initial Parameteren vun engem Aarbechter un all (Linn 18) fir sécherzestellen datt all Aarbechter mat de selwechte initialen Parameteren ufänken.
  • Schafen eng Horovod DistributedOptimizer (Linn 25) fir d'Parameteren op eng verdeelt Manéier ze aktualiséieren.

Fir de komplette Skript ze kréien, kuckt op d'Horovod-MXNet Beispiller 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    ...

Schrëtt 3

Mellt Iech bei engem vun den Aarbechter un fir verdeelt Training mat der MPI-Direktiv ze starten. An dësem Beispill leeft verdeelt Training op véier Instanzen mat 4 GPUs all, an am Ganzen 16 GPUs am Cluster. De Stochastic Gradient Descent (SGD) Optimizer gëtt mat de folgenden Hyperparameter benotzt:

  • Mini-Batch Gréisst: 256
  • Léierrate: 0.1
  • Momentum: 0.9
  • Gewiicht Zerfall: 0.0001

Wéi mir vun enger GPU op 64 GPUs skaléiert hunn, hu mir den Trainingsquote linear skaléiert no der Unzuel vun de GPUs (vu 0,1 fir 1 GPU op 6,4 fir 64 GPUs), wärend d'Zuel vun de Biller pro GPU op 256 behalen (vun enger Partie vun 256 Biller fir 1 GPU op 16 fir 384 GPUs). D'Gewiicht Zerfall an Dynamik Parameteren geännert wéi d'Zuel vun GPUs erop. Mir hunn gemëschte Präzisiounstraining mam Float64 Datentyp fir de Forward Pass a Float16 fir Gradienten benotzt fir d'float32 Berechnungen ze beschleunegen ënnerstëtzt vun NVIDIA Tesla GPUs.

$ 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

Konklusioun

An dësem Artikel hu mir eng skalierbar Approche fir verdeelt Modelltraining mat Apache MXNet an Horovod gekuckt. Mir hunn d'Skaléierungseffizienz a Käschteneffizienz bewisen am Verglach mat der Parameterserver Approche op der ImageNet Dataset, op där de ResNet50-v1 Modell trainéiert gouf. Mir hunn och Schrëtt abegraff déi Dir benotze kënnt fir en existente Skript z'änneren fir Multi-Instance Training mat Horovod ze lafen.

Wann Dir just mat MXNet an Deep Learning ufänkt, gitt op d'Installatiounssäit MXNefir d'éischt MXNet ze bauen. Mir recommandéieren och staark den Artikel ze liesen MXNet an 60 Minuttenunzefänken.

Wann Dir scho mat MXNet geschafft hutt a wëllt verdeelt Léieren mat Horovod probéieren, da kuckt op Horovod Installatioun Säit, baut et aus MXNet a befollegt d'Beispill MNIST oder IMAGEnet.

* Käschten sinn berechent baséiert op Stonn Tariffer AWS fir EC2 Instanzen

Léiert méi iwwer de Cours "Industriell ML op Big Data"

Source: will.com

Kaaft zouverlässeg Hosting fir Site mat DDoS Schutz, VPS VDS Server 🔥 Kaaft zouverléissegt Websäithosting mat DDoS-Schutz, VPS VDS Server | ProHoster