Tradiksyon atik la te prepare lavèy kòmansman kou a
Fòmasyon distribiye sou plizyè sikonstans enfòmatik pèfòmans-wo ka diminye tan fòmasyon modèn rezo neral gwo twou san fon sou gwo kantite done soti nan semèn rive èdtan oswa menm minit, fè teknik fòmasyon sa a répandus nan aplikasyon pratik nan aprantisaj pwofon. Itilizatè yo dwe konprann ki jan yo pataje ak senkronize done atravè plizyè ka, ki an vire gen yon gwo enpak sou efikasite dekale. Anplis de sa, itilizatè yo ta dwe konnen tou ki jan yo deplwaye yon script fòmasyon ki kouri sou yon sèl egzanp nan plizyè ka.
Nan atik sa a nou pral pale sou yon fason rapid ak fasil pou distribye aprantisaj lè l sèvi avèk bibliyotèk aprantisaj pwofon Apache MXNet ak fondasyon aprantisaj distribiye Horovod. Nou pral klèman demontre benefis pèfòmans ki genyen nan fondasyon an Horovod epi demontre ki jan yo ekri yon script fòmasyon MXNet pou li travay nan yon fason distribiye ak Horovod.
Ki sa ki Apache MXNet?
se yon kad aprantisaj pwofon sous ouvè ki itilize pou kreye, fòme ak deplwaye rezo neral pwofon. MXNet abstrè konpleksite ki asosye ak enplemante rezo neral, li trè pèfòmans ak évolutive, epi li ofri API pou lang pwogramasyon popilè tankou , , , , , , ak lòt moun.
Distribiye fòmasyon nan MXNet ak sèvè paramèt
sèvi ak yon apwòch sèvè paramèt. Li itilize yon seri sèvè paramèt pou kolekte gradyan nan chak travayè, fè agrégation, epi voye gradyan ajou tounen bay travayè yo pou pwochen iterasyon optimize a. Detèmine rapò ki kòrèk la nan serveurs ak travayè se kle nan dekale efikas. Si gen yon sèl sèvè paramèt, li ka tounen yon goudwon nan kalkil yo. Kontrèman, si yo itilize twòp serveurs, kominikasyon anpil-a-anpil ka bouche tout koneksyon rezo.
Ki sa ki Horovod
se yon kad aprantisaj pwofon distribye ouvè devlope nan Uber. Li pwofite teknoloji efikas kwa-GPU ak kwa-nœud tankou Bibliyotèk Kominikasyon Kolektif NVIDIA (NCCL) ak Message Passing Interface (MPI) pou distribye ak total paramèt modèl atravè vorecs. Li optimize itilizasyon Pleasant rezo a ak balans byen lè w ap travay ak modèl rezo neral gwo twou san fon. Kounye a li sipòte plizyè kad aprantisaj machin popilè, sètadi , Tensorflow, Keras, ak PyTorch.
MXNet ak Horovod entegrasyon
MXNet entegre ak Horovod atravè API aprantisaj distribiye yo defini nan Horovod. Horovod kominikasyon APIs horovod.broadcast(), horovod.allgather() и horovod.allreduce() aplike lè l sèvi avèk callback asynchrone nan motè MXNet la, kòm yon pati nan graf travay li yo. Nan fason sa a, depandans done ant kominikasyon ak kalkil yo fasil okipe pa motè a MXNet pou fè pou evite pèt pèfòmans akòz senkronizasyon. Objè optimiseur distribiye defini nan Horovod horovod.DistributedOptimizer elaji Optimizer nan MXNet pou li rele API Horovod korespondan yo pou mizajou paramèt distribiye yo. Tout detay aplikasyon sa yo transparan pou itilizatè final yo.
Vit kòmanse
Ou ka byen vit kòmanse fòme yon ti rezo neral konvolusyonèl sou dataset MNIST lè l sèvi avèk MXNet ak Horovod sou MacBook ou.
Premyèman, enstale mxnet ak horovod soti nan PyPI:
pip install mxnet
pip install horovodNòt: Si ou rankontre yon erè pandan pip enstale horovodpetèt ou bezwen ajoute yon varyab MACOSX_DEPLOYMENT_TARGET=10.vvkote vv – sa a se vèsyon an nan vèsyon MacOS ou a, pou egzanp, pou MacOSX Sierra w ap bezwen ekri MACOSX_DEPLOYMENT_TARGET=10.12 pip enstale horovod
Lè sa a, enstale OpenMPI .
Nan fen a, telechaje script tès la mxnet_mnist.py epi kouri kòmandman sa yo nan tèminal MacBook nan anyè k ap travay la:
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pySa a pral kouri fòmasyon sou de nwayo nan processeur ou a. Pwodiksyon an pral sa ki annapre yo:
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.870000Pèfòmans Demo
Lè w fòme yon modèl ResNet50-v1 sou yon seri done ImageNet sou 64 GPU ak uit ka. p3.16xlarge EC2, chak ki gen 8 GPU NVIDIA Tesla V100 sou AWS nwaj, nou reyalize yon debi fòmasyon nan 45000 imaj / sec (sa vle di, kantite echantiyon ki resevwa fòmasyon pou chak segonn). Fòmasyon fini nan 44 minit apre 90 epòk ak yon pi bon presizyon nan 75.7%.
Nou konpare sa a ak apwòch fòmasyon distribiye MXNet nan sèvi ak sèvè paramèt sou 8, 16, 32 ak 64 GPU ak yon sèl sèvè paramèt ak yon rapò sèvè ak travayè nan 1 a 1 ak 2 a 1, respektivman. Ou ka wè rezilta a nan Figi 1 anba a. Sou aks y sou bò gòch la, ba yo reprezante kantite imaj pou antrene pou chak segonn, liy yo reflete efikasite dekale (ki vle di, rapò aktyèl ak debi ideyal) sou aks y sou bò dwat la. Kòm ou ka wè, chwa a nan kantite serveurs afekte efikasite nan dekale. Si gen yon sèl sèvè paramèt, efikasite dekale a desann a 38% sou 64 GPU. Pou reyalize efikasite dekale menm jan ak Horovod, ou bezwen double kantite serveurs parapò ak kantite travayè yo.

Figi 1. Konparezon aprantisaj distribye lè l sèvi avèk MXNet ak Horovod ak ak sèvè paramèt
Nan tablo 1 ki anba a, nou konpare pri final la pou chak egzanp lè nou fè eksperyans sou 64 GPU. Sèvi ak MXNet ak Horovod bay pi bon debi a nan pri ki pi ba a.

Tablo 1. Konparezon pri ant Horovod ak Parameter Server ak yon rapò sèvè ak travayè 2 a 1.
Etap pou repwodui
Nan pwochen etap yo, nou pral montre w kouman pou repwodui rezilta fòmasyon distribye lè l sèvi avèk MXNet ak Horovod. Pou aprann plis sou aprantisaj distribiye ak MXNet li .
Etap 1
Kreye yon gwoupman enstans omojèn ak MXNet vèsyon 1.4.0 oswa pi wo ak Horovod vèsyon 0.16.0 oswa pi wo pou itilize antrènman distribye. Ou pral bezwen enstale bibliyotèk yo tou pou antrènman GPU. Pou enstans nou yo, nou te chwazi Ubuntu 16.04 Linux, avèk chofè GPU 396.44, CUDA 9.2, bibliyotèk cuDNN 7.2.1, kominikatè NCCL 2.2.13 ak OpenMPI 3.1.1. Ou kapab itilize tou , kote bibliyotèk sa yo deja pre-enstale.
Etap 2
Ajoute kapasite pou travay ak API Horovod nan script fòmasyon MXNet ou a. Script ki anba a ki baze sou MXNet Gluon API a ka itilize kòm yon modèl senp. Liy ki an karaktè gra yo nesesè si ou deja gen yon script fòmasyon korespondan. Men kèk chanjman enpòtan ou bezwen fè pou aprann ak Horovod:
- Mete kontèks la dapre ran Horovod lokal la (liy 8) pou w konprann ke fòmasyon yo fèt sou nwayo grafik ki kòrèk la.
- Pase paramèt inisyal yo soti nan yon travayè a tout (liy 18) pou asire ke tout travayè yo kòmanse ak menm paramèt inisyal yo.
- Kreye yon Horovod DistributedOptimizer (liy 25) pou mete ajou paramèt yo nan yon fason distribiye.
Pou jwenn script konplè a, tanpri al gade egzanp Horovod-MXNet yo и .
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 ...Etap 3
Konekte youn nan travayè yo pou kòmanse distribye fòmasyon lè l sèvi avèk direktiv MPI a. Nan egzanp sa a, fòmasyon distribye kouri sou kat ka ak 4 GPU chak, ak yon total de 16 GPU nan gwoup la. Yo pral itilize optimisateur Stochastic Gradient Descent (SGD) ak ipèparamèt sa yo:
- gwosè mini-pakèt: 256
- to aprantisaj: 0.1
- momantòm: 0.9
- pouri pwa: 0.0001
Kòm nou te monte soti nan yon sèl GPU a 64 GPU, nou lineyèman echèl to fòmasyon an selon kantite GPU (soti nan 0,1 pou 1 GPU a 6,4 pou 64 GPU), pandan y ap kenbe kantite imaj pou chak GPU nan 256 (ki soti nan yon pakèt 256 imaj pou 1 GPU rive 16 pou 384 GPU). Pwa pouri ak momantòm paramèt yo chanje kòm kantite GPU ogmante. Nou te itilize fòmasyon presizyon melanje ak kalite done float64 pou pas pi devan ak float16 pou gradyan akselere kalkil float32 sipòte pa GPU NVIDIA Tesla yo.
$ 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.pyKonklizyon
Nan atik sa a, nou te gade yon apwòch évolutive pou distribye fòmasyon modèl lè l sèvi avèk Apache MXNet ak Horovod. Nou te demontre efikasite dekale ak pri-efikasite konpare ak apwòch sèvè paramèt sou seri done ImageNet sou ki te fòme modèl ResNet50-v1 la. Nou te enkli tou etap ke ou ka itilize pou modifye yon script ki egziste deja pou kouri fòmasyon milti-enstans lè l sèvi avèk Horovod.
Si w ap kòmanse kòmanse ak MXNet ak aprantisaj pwofon, ale nan paj enstalasyon an pou premye konstwi MXNet. Nou rekòmande tou fòtman li atik la pou kòmanse.
Si ou te deja travay ak MXNet epi ou vle eseye distribye aprantisaj ak Horovod, Lè sa a, gade nan , bati li nan MXNet epi swiv egzanp lan oswa .
*Pri a kalkile baze sou AWS pou enstans EC2
Aprann plis sou kou a
Sous: www.habr.com
