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?
Distribiye fòmasyon nan MXNet ak sèvè paramèt
Ki sa ki Horovod
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 horovod
Nò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
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py
Sa 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.870000
Pè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 gwoup enstans omojèn ak MXNet vèsyon 1.4.0 oswa pi wo ak vèsyon Horovod 0.16.0 oswa pi wo pou itilize aprantisaj distribiye. Ou pral bezwen tou enstale bibliyotèk pou fòmasyon GPU. Pou ka nou yo, nou te chwazi Ubuntu 16.04 Linux, ak GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 bibliyotèk, NCCL 2.2.13 kominikatè ak OpenMPI 3.1.1. Epitou ou ka itilize
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.py
Konklizyon
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
Si ou te deja travay ak MXNet epi ou vle eseye distribye aprantisaj ak Horovod, Lè sa a, gade nan
*Pri a kalkile baze sou
Aprann plis sou kou a
Sous: www.habr.com