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
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. , , , , , , és mások.
Elosztott oktatás MXNetben paraméterszerverrel
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
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 , 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 horovodMegjegyzé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 é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.pyEz 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.870000Teljesí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
Создайте кластер однородных экземпляров с 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. Также вы можете использовать , 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 и .
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.pyKö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 az MXNet első felépítéséhez. Erősen ajánljuk a cikk elolvasását is kezdeni.
Ha már dolgozott az MXNettel, és szeretné kipróbálni az elosztott tanulást a Horovoddal, akkor nézze meg , készítse el az MXNetből, és kövesse a példát vagy .
*a költség számítása alapján történik AWS EC2 példányokhoz
Tudjon meg többet a tanfolyamról
Forrás: will.com
