Wergera gotarê di êvara destpêkirina kursê de hat amadekirin
Perwerdehiya belavkirî li ser gelek mînakên hesabkirina performansa bilind dikare dema perwerdehiya torên neuralî yên kûr ên nûjen li ser mîqdarên mezin daneyan ji hefte heta saet an jî hûrdeman kêm bike, ev teknîka perwerdehiyê di sepanên pratîkî yên fêrbûna kûr de berbelav dike. Bikarhêner pêdivî ye ku fêm bikin ka meriv çawa daneyan di nav gelek bûyeran de parve dike û hevdeng dike, ku di encamê de bandorek mezin li ser karîgeriya pîvanê dike. Wekî din, pêdivî ye ku bikarhêner her weha zanibin ka meriv çawa skrîptek perwerdehiyê ya ku li ser yek mînakek ji gelek mînakan re dimeşe bicîh dikin.
Di vê gotarê de em ê li ser rêgezek bilez û hêsan a belavkirina fêrbûnê bi karanîna pirtûkxaneya fêrbûna kûr a vekirî Apache MXNet û çarçoveya fêrbûna belavkirî ya Horovod biaxivin. Em ê feydeyên performansê yên çarçoveya Horovod bi zelalî destnîşan bikin û destnîşan bikin ka meriv çawa skrîptek perwerdehiya MXNet dinivîse da ku ew bi Horovod re bi rengek belavkirî bixebite.
Apache MXNet çi ye
çarçoveyek fêrbûna kûr-çavkaniya vekirî ye ku ji bo afirandina, perwerdekirin û bicîhkirina torên neuralî yên kûr tê bikar anîn. MXNet tevliheviyên ku bi pêkanîna torên neuralî ve girêdayî ne berhev dike, pir bikêrhatî û berbelav e, û API-yên ji bo zimanên bernamenûsê yên populer ên wekî , , , , , , û yên din.
Di MXNet-ê de bi servera parametreyê re perwerdehiya belav kirin
nêzîkatiya serverek parametreyê bikar tîne. Ew komek pêşkêşkerên parametreyê bikar tîne da ku ji her karkerek gradient berhev bike, berhevkirinê pêk bîne, û ji bo dubarekirina xweşbîniya paşîn gradientên nûvekirî paşde ji karkeran re bişîne. Diyarkirina rêjeya rast a pêşkêşkeran bi karkeran re mifteya pîvandina bi bandor e. Ger tenê serverek parametre hebe, dibe ku ew di hesaban de bibe astengek. Berevajî vê, heke pir servers werin bikar anîn, pêwendiya pir-bi-gelek dikare hemî girêdanên torê asteng bike.
Horovod çi ye
çarçoveyek fêrbûna kûr a vekirî ya belavkirî ye ku li Uber hatî pêşve xistin. Ew teknolojiyên cross-GPU û cross-node yên wekî Pirtûkxaneya Ragihandina Kolektîf a NVIDIA (NCCL) û Navbera Derbaskirina Peyamê (MPI) bi kar tîne da ku parametreyên modelê li ser vorecan belav bike û berhev bike. Dema ku bi modelên tora neuralî ya kûr re dixebite, ew karanîna bandpêdeya torê xweştir dike û baş pîvan dike. Ew naha gelek çarçoveyên fêrbûna makîneyê yên populer piştgirî dike, ne , Tensorflow, Keras, û PyTorch.
Yekbûna MXNet û Horovod
MXNet bi Horovod-ê re bi navgîniya API-yên Fêrbûna Dabeşkirî yên ku li Horovod-ê hatine destnîşan kirin yek dike. API-yên ragihandinê yên Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() wekî beşek ji grafika peywira wê, bi karanîna paşvekêşana asînkron a motora MXNet ve hatî bicîh kirin. Bi vî rengî, girêdanên daneyê di navbera ragihandin û hesabkirinê de bi hêsanî ji hêla motora MXNet ve têne rêve kirin da ku ji ber hevdemkirinê windahiyên performansê nebin. Tişta optimîzatorê belavkirî ku di Horovod de hatî destnîşankirin horovod.DistributedOptimizer berfireh dike Optimizer di MXNet de da ku ew ji bo nûvekirinên parameterê yên belavkirî bangî API-yên Horovod-ên têkildar dike. Hemî van hûrguliyên pêkanînê ji bikarhênerên dawîn re zelal in.
Destpêka bilez
Hûn dikarin zû dest bi perwerdehiya torgilokek neuralî ya piçûk a li ser daneya MNIST bi karanîna MXNet û Horovod li MacBook-a xwe bikin.
Pêşîn, mxnet û horovod ji PyPI saz bikin:
pip install mxnet
pip install horovodNîşe: Heke hûn di dema xeletiyek de rûbirû bibin pip saz horovoddibe ku hûn hewce ne ku guhêrbarek lê zêde bikin MACOSX_DEPLOYMENT_TARGET=10.vvko vv - ev guhertoya guhertoya MacOS-a we ye, mînakî, ji bo MacOSX Sierra hûn ê hewce binivîsin MACOSX_DEPLOYMENT_TARGET=10.12 pip horovod saz dike
Piştre OpenMPI saz bikin .
Di dawiyê de, skrîpta testê dakêşin mxnet_mnist.py û emrên jêrîn di termînala MacBook-ê de di pelrêça xebatê de bimeşînin:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyEv ê perwerdehiyê li ser du bingehên pêvajoya we bimeşîne. Hilber dê wiha be:
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.870000Demo Performansa
Dema ku modelek ResNet50-v1 li ser databasek ImageNet-ê li ser 64 GPU bi heşt mînakan re perwerde dike p3.16xmezin EC2, ku her yek li ser ewrê AWS-ê 8 NVIDIA Tesla V100 GPU-yên NVIDIA Tesla V45000 vedihewîne, me gihaştek perwerdehiyê ya 44 wêne / sec (ango, hejmara nimûneyên perwerdekirî di çirkeyê de) bi dest xist. Perwerde di 90 hûrdeman de piştî 75.7 serdeman bi rastbûna çêtirîn XNUMX%.
Me vê yekê bi nêzîkatiya perwerdehiya belavkirî ya MXNet-ê ya karanîna pêşkêşkerên parametreyê li ser 8, 16, 32 û 64 GPU-yê bi yek-parameterek û rêjeya server-karkerê bi rêzê 1 ber 1 û 2 ber 1 berhev kir. Hûn dikarin encamê di Figure 1 li jêr bibînin. Li ser tebeqeya y ya çepê, bar hejmara wêneyên ku di çirkeyê de têne perwerde kirin temsîl dikin, xet li ser tebeqeya y-ya rastê karîgeriya pîvanê (ango, rêjeya rêjeya rastîn a îdeal) nîşan dide. Wekî ku hûn dikarin bibînin, bijartina hejmara serveran bandorê li serhevhatina pîvanê dike. Ger tenê serverek parametre hebe, li ser 38 GPU karbidestiya pîvandinê dadikeve %64. Ji bo ku hûn bi Horovod re heman karîgeriya pîvanê bi dest bixin, hûn hewce ne ku hejmara serveran li gorî hejmara karkeran ducar bikin.

Wêne 1. Berawirdkirina fêrbûna belavbûyî ya bi karanîna MXNet bi Horovod û bi servera parametreyê re
Di Tabloya 1-ê ya li jêr de, em lêçûna paşîn ji bo nimûne gava ku ceribandinan li ser 64 GPU dimeşînin berhev dikin. Bikaranîna MXNet-ê bi Horovod re bi lêçûna herî hindik vekêşana çêtirîn peyda dike.

Tablo 1. Berhevdana lêçûn di navbera Horovod û Parametreya Pêşkêşkar de bi rêjeya server-karkerê 2 ber 1.
Gavên ji nû ve hilberînê
Di gavên paşîn de, em ê nîşanî we bidin ka meriv çawa bi karanîna MXNet û Horovod encama perwerdehiya belavkirî dubare dike. Ji bo bêtir fêrbûna fêrbûna belavkirî bi MXNet re bixwînin .
gav 1
Bi guhertoya MXNet 1.4.0 an mezintir û guhertoya Horovod 0.16.0 an mezintir komek mînakên homojen biafirînin da ku fêrbûna belavbûyî bikar bînin. Her weha hûn ê hewce bikin ku pirtûkxane ji bo perwerdehiya GPU saz bikin. Ji bo nimûneyên xwe, me Ubuntu 16.04 Linux, bi GPU Driver 396.44, CUDA 9.2, pirtûkxaneya cuDNN 7.2.1, ragihandinkarê NCCL 2.2.13 û OpenMPI 3.1.1 hilbijart. Her weha hûn dikarin bikar bînin , cihê ku ev pirtûkxane ji berê ve hatine saz kirin.
gav 2
Hêza xebata bi Horovod API-ê li skrîpta perwerdehiya MXNet-a xwe zêde bikin. Nivîsara jêrîn li ser bingeha MXNet Gluon API dikare wekî şablonek hêsan were bikar anîn. Ger jixwe nivîsarek perwerdehiya têkildar hebe, rêzikên bi qelew hewce ne. Li vir çend guhertinên krîtîk hene ku hûn hewce ne ku hûn bi Horovod re fêr bibin:
- Li gorî rêza Horovodê ya herêmî (xêza 8) çarçovê bicîh bikin da ku fêm bikin ku perwerde li ser bingeha grafîkî ya rast tê kirin.
- Parametreyên destpêkê ji karkerek ji hemîyan re derbas bikin (xêza 18) da ku bicîh bikin ku hemî karker bi heman pîvanên destpêkê dest pê dikin.
- Horovodek çêbikin DistributedOptimizer (xêza 25) ji bo nûvekirina pîvanan bi rengek belavkirî.
Ji bo bidestxistina skrîpta tevahî, ji kerema xwe serî li mînakên Horovod-MXNet bidin и .
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 ...gav 3
Têkeve yek ji karkeran da ku dest bi perwerdehiya belavkirî bi karanîna rêwerza MPI-yê bikin. Di vê nimûneyê de, perwerdehiya belavkirî li ser çar mînakan bi her yekê 4 GPU, û bi tevahî 16 GPU di komê de dimeşe. Optimîzatora Stochastic Gradient Descent (SGD) dê bi hîperparametreyên jêrîn were bikar anîn:
- Mezinahiya piçûk: 256
- rêjeya fêrbûnê: 0.1
- leza: 0.9
- hilweşîna giran: 0.0001
Gava ku me ji yek GPU berbi 64 GPU-yan vekir, me rêjeya perwerdehiyê li gorî hejmara GPU-yê bi rêzikî pîvan kir (ji 0,1-ê ji bo 1 GPU-yê berbi 6,4-ê ji bo 64 GPU-yan), dema ku jimara wêneyan ji bo her GPU-yê 256 (ji komek ji 256 wêne ji bo 1 GPU heya 16 ji bo 384 GPU). Her ku hejmara GPU-yan zêde bû, pîvanên hilweşîna giran û gavê guherî. Me perwerdehiya rastîn a tevlihev bi celebê daneya float64 re ji bo derbasbûna pêş û float16 ji bo gradientan bikar anî da ku hesabên float32 yên ku ji hêla GPU-yên NVIDIA Tesla ve têne piştgirî kirin zûtir bikin.
$ 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.pyencamê
Di vê gotarê de, me li nêzîkatiyek pîvanbar a perwerdehiya modela belavkirî bi karanîna Apache MXNet û Horovod nihêrî. Me li gorî nêzîkatiya servera parametreyê ya li ser databasa ImageNet-ê ya ku modela ResNet50-v1 li ser hatî perwerde kirin, bikêrhatina pîvandinê û lêçûn-bandorkirinê nîşan da. Di heman demê de me gavên ku hûn dikarin bikar bînin ji bo guheztina skrîptek heyî veguhezînin da ku bi karanîna Horovod perwerdehiya pir-nimûne bimeşînin.
Ger hûn nû dest bi MXNet û fêrbûna kûr dikin, biçin rûpela sazkirinê da ku pêşî MXNet ava bikin. Em jî bi tundî xwendina gotarê pêşniyar dikin dest pê bikin.
Ger we berê bi MXNet re xebitî û hûn dixwazin fêrbûna belavkirî bi Horovod re biceribînin, wê hingê li , wê ji MXNet ava bikin û nimûneyê bişopînin an .
* lêçûn li gorî tê hesibandin AWS ji bo Mînakên EC2
Di derbarê qursê de bêtir fêr bibin
Source: www.habr.com
