A cikk fordítása a tanfolyam kezdetének előestéjén készült
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
Elosztott oktatás MXNetben paraméterszerverrel
Mi az a Horovod
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
A végén töltse le a tesztszkriptet mxnet_mnist.py
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.
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.
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
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
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
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
Ha már dolgozott az MXNettel, és szeretné kipróbálni az elosztott tanulást a Horovoddal, akkor nézze meg
*a költség számítása alapján történik
Tudjon meg többet a tanfolyamról
Forrás: will.com