Elosztott tanulás Apache MXNet és Horovod segítségével

A cikk fordítása a tanfolyam kezdetének előestéjén készült "Industrial ML on Big Data"

A több nagy teljesítményű számítástechnikai példányon végzett elosztott képzés hetekről órákra vagy akár percekre csökkentheti a modern mély neurális hálózatok tanítási idejét nagy mennyiségű adaton, így ez a képzési technika elterjedt a mély tanulás gyakorlati alkalmazásaiban. A felhasználóknak meg kell érteniük, hogyan oszthatnak meg és szinkronizálhatnak adatokat több példányban, ami viszont nagy hatással van a méretezési hatékonyságra. Ezen túlmenően a felhasználóknak tudniuk kell, hogyan kell egy példányon futó betanító szkriptet több példányra telepíteni.

Ebben a cikkben a tanulás elosztásának gyors és egyszerű módjáról fogunk beszélni az Apache MXNet nyílt mélytanulási könyvtár és a Horovod elosztott tanulási keretrendszer használatával. Világosan bemutatjuk a Horovod keretrendszer teljesítménybeli előnyeit, és bemutatjuk, hogyan írjunk egy MXNet képzési szkriptet úgy, hogy az elosztott módon működjön a Horovoddal.

Mi az Apache MXNet

Apache MX Net egy nyílt forráskódú mély tanulási keretrendszer, amelyet mély neurális hálózatok létrehozására, betanítására és telepítésére használnak. Az MXNet elvonatkoztatja a neurális hálózatok megvalósításával kapcsolatos bonyolultságokat, nagy teljesítményű és méretezhető, valamint API-kat kínál olyan népszerű programozási nyelvekhez, mint pl. Piton, C + +, Clojure, Jáva, Julia, R, Scala és mások.

Elosztott oktatás MXNetben paraméterszerverrel

Szabványos elosztott tanulási modul az MXNetben paraméterkiszolgáló megközelítést használ. Paraméterkiszolgálók készletét használja az egyes dolgozóktól gradiensek gyűjtésére, összesítés végrehajtására, és a frissített gradiensek visszaküldésére a dolgozóknak a következő optimalizálási iterációhoz. A hatékony skálázás kulcsa a szerverek és a dolgozók arányának helyes meghatározása. Ha csak egy paraméterkiszolgáló van, akkor ez szűk keresztmetszetnek bizonyulhat a számításokban. Ezzel szemben, ha túl sok szervert használnak, a sok-sok kommunikáció eltömítheti az összes hálózati kapcsolatot.

Mi az a Horovod

Horovod egy nyílt elosztott mély tanulási keretrendszer, amelyet az Uber fejlesztett ki. Hatékony GPU és csomópontok közötti technológiákat használ, mint például az NVIDIA Collective Communications Library (NCCL) és az Message Passing Interface (MPI) a modellparaméterek elosztására és összesítésére a vorecek között. Optimalizálja a hálózati sávszélesség használatát, és jól skálázódik, ha mély neurális hálózati modellekkel dolgozik. Jelenleg számos népszerű gépi tanulási keretrendszert támogat, nevezetesen MX Net, Tensorflow, Keras és PyTorch.

MXNet és Horovod integráció

Az MXNet a Horovodban meghatározott Distributed Learning API-kon keresztül integrálódik a Horovoddal. Horovod kommunikációs API-k horovod.broadcast(), horovod.allgather() и horovod.allreduce() az MXNet motor aszinkron visszahívásaival valósul meg, a feladatgráf részeként. Ily módon az MXNet motor könnyen kezeli a kommunikáció és a számítás közötti adatfüggőségeket, hogy elkerülje a szinkronizálás miatti teljesítményveszteséget. Horovodban definiált elosztott optimalizáló objektum horovod.DistributedOptimizer kitágul Optimizer az MXNetben, így meghívja a megfelelő Horovod API-kat az elosztott paraméterfrissítésekhez. Mindezek a megvalósítási részletek átláthatóak a végfelhasználók számára.

Gyors kezdés

Gyorsan megkezdheti egy kis konvolúciós neurális hálózat betanítását az MNIST adatkészleten az MXNet és a Horovod használatával MacBookján.
Először telepítse az mxnet-et és a horovodot a PyPI-ből:

pip install mxnet
pip install horovod

Megjegyzés: Ha hibát észlel közben pip install horovodtalán hozzá kell adni egy változót MACOSX_DEPLOYMENT_TARGET=10.vvAhol vv – ez az Ön MacOS verziójának verziója, például MacOSX Sierra esetén írnia kell MACOSX_DEPLOYMENT_TARGET=10.12 pip telepítés horovod

Ezután telepítse az OpenMPI-t ezért.

A végén töltse le a tesztszkriptet mxnet_mnist.py ezért és futtassa a következő parancsokat a MacBook terminálban a munkakönyvtárban:

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

Ez a processzor két magján futtatja a képzést. A kimenet a következő lesz:

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

Teljesítmény bemutató

Amikor egy ResNet50-v1 modellt oktat egy ImageNet adatkészleten 64 GPU-n, nyolc példányban p3.16xnagy Az EC2-vel, amelyek mindegyike 8 NVIDIA Tesla V100 GPU-t tartalmaz az AWS felhőn, 45000 44 kép/mp (vagyis a betanított minták száma másodpercenként) képzési sebességet értünk el. A képzés 90 perc alatt fejeződött be 75.7 epocha után, a legjobb XNUMX%-os pontossággal.

Összehasonlítottuk ezt az MXNet elosztott betanítási módszerével, amely szerint a paraméterszervereket 8, 16, 32 és 64 GPU-n használták egyetlen paraméteres szerverrel, valamint 1:1, illetve 2:1 kiszolgáló és dolgozó arányú. Az eredményt az alábbi 1. ábrán láthatja. A bal oldali y-tengelyen az oszlopok a másodpercenként betanítandó képek számát, a vonalak pedig a skálázási hatékonyságot (vagyis a tényleges és ideális átviteli sebesség arányát) tükrözik a jobb oldali y-tengelyen. Mint látható, a kiszolgálók számának megválasztása befolyásolja a méretezési hatékonyságot. Ha csak egy paraméterkiszolgáló van, a skálázási hatékonyság 38%-ra csökken 64 GPU-n. A Horovoddal megegyező méretezési hatékonyság eléréséhez meg kell duplázni a szerverek számát a dolgozók számához képest.

Elosztott tanulás Apache MXNet és Horovod segítségével
1. ábra. Elosztott tanulás összehasonlítása MXNet használatával Horovoddal és paraméterkiszolgálóval

Az alábbi 1. táblázatban összehasonlítjuk a végső példányonkénti költséget, amikor kísérleteket futtatunk 64 GPU-n. Az MXNet és a Horovod használata a legjobb átviteli sebességet biztosítja a legalacsonyabb költségek mellett.

Elosztott tanulás Apache MXNet és Horovod segítségével
1. táblázat: Költség-összehasonlítás a Horovod és a Parameter Server között, ahol a szerver/dolgozó arány 2:1.

A szaporodás lépései

A következő lépésekben megmutatjuk, hogyan reprodukálhatja az MXNet és a Horovod segítségével megosztott edzések eredményét. Ha többet szeretne megtudni az MXNet segítségével történő elosztott tanulásról, olvassa el ezt a részt ez a poszt.

Lépés 1

Hozzon létre egy homogén példányok fürtjét az MXNet 1.4.0 vagy újabb verziójával és a Horovod 0.16.0 vagy újabb verziójával az elosztott tanulás használatához. A GPU-oktatáshoz könyvtárakat is telepítenie kell. Példányainkhoz az Ubuntu 16.04 Linuxot választottuk, 396.44-es GPU-illesztőprogrammal, CUDA 9.2-vel, cuDNN 7.2.1-es könyvtárral, NCCL 2.2.13-as kommunikátorral és OpenMPI 3.1.1-gyel. Ön is használhatja Amazon Deep Learning AMI, ahol ezek a könyvtárak már előre telepítve vannak.

Lépés 2

Adja hozzá a Horovod API-val való együttműködés lehetőségét az MXNet képzési szkriptjéhez. Az alábbi, MXNet Gluon API-n alapuló szkript egyszerű sablonként használható. A vastagon szedett sorokra akkor van szükség, ha már rendelkezik megfelelő képzési szkripttel. Íme néhány fontos változtatás, amelyet meg kell tennie a Horovoddal való tanuláshoz:

  • Állítsa be a kontextust a helyi horovodi rangnak megfelelően (8. sor), hogy megértse, a képzés a megfelelő grafikus magon történik.
  • Adja át a kezdeti paramétereket egy dolgozótól az összesnek (18. sor), hogy minden dolgozó ugyanazokkal a kezdeti paraméterekkel kezdje.
  • Hozzon létre egy Horovodot DistributedOptimizer (25. sor) a paraméterek elosztott módon történő frissítéséhez.

A teljes szkript letöltéséhez tekintse meg a Horovod-MXNet példákat 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    ...

Lépés 3

Jelentkezzen be az egyik dolgozóhoz az elosztott képzés megkezdéséhez az MPI-irányelv használatával. Ebben a példában az elosztott képzés négy példányon fut, egyenként 4 GPU-val, és összesen 16 GPU-val a fürtben. A sztochasztikus gradiens süllyedés (SGD) optimalizálót a következő hiperparaméterekkel fogja használni:

  • mini tétel mérete: 256
  • tanulási arány: 0.1
  • lendület: 0.9
  • súlycsökkenés: 0.0001

Ahogy egy GPU-ról 64 GPU-ra skáláztunk, a betanítási sebességet lineárisan skáláztuk a GPU-k száma szerint (0,1-ről 1 GPU-nál 6,4-re 64 GPU-nál), miközben a GPU-nkénti képek számát 256-on tartottuk (egy kötegből). 256 kép 1 GPU-hoz, 16 384 kép 64 GPU-hoz). A súlycsökkenés és a lendület paraméterei a GPU-k számának növekedésével változtak. Vegyes precíziós képzést alkalmaztunk a float16 adattípussal az előrehaladáshoz és a float32 adattípussal a gradiensekhez, hogy felgyorsítsuk az NVIDIA Tesla GPU-k által támogatott float16 számításokat.

$ 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

Következtetés

Ebben a cikkben az elosztott modellképzés skálázható megközelítését vizsgáltuk az Apache MXNet és a Horovod használatával. Bemutattuk a méretezési hatékonyságot és költséghatékonyságot a paraméterkiszolgáló megközelítéssel összehasonlítva azon az ImageNet adatkészleten, amelyen a ResNet50-v1 modellt betanították. Olyan lépéseket is tartalmaztunk, amelyek segítségével módosíthat egy meglévő szkriptet a többpéldányos képzés futtatásához a Horovod használatával.

Ha még csak most kezdi használni az MXNet-et és a mély tanulást, lépjen a telepítési oldalra MXNeaz MXNet első felépítéséhez. Erősen ajánljuk a cikk elolvasását is MXNet 60 perc alattkezdeni.

Ha már dolgozott az MXNettel, és szeretné kipróbálni az elosztott tanulást a Horovoddal, akkor nézze meg Horovod telepítési oldal, készítse el az MXNetből, és kövesse a példát MNIST vagy ImageNet.

*a költség számítása alapján történik óradíjak AWS EC2 példányokhoz

Tudjon meg többet a tanfolyamról "Industrial ML on Big Data"

Forrás: will.com

Hozzászólás