Distribiye Aprantisaj ak Apache MXNet ak Horovod

Tradiksyon atik la te prepare lavèy kòmansman kou a "Endistriyèl ML sou gwo done"

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?

Apache MX Net 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 Piton, C ++, Clojure, Java, Julia, R, Echèl ak lòt moun.

Distribiye fòmasyon nan MXNet ak sèvè paramèt

Modil aprantisaj distribiye estanda nan MXNet 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

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 MX Net, 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 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 kon sa.

Nan fen a, telechaje script tès la mxnet_mnist.py kon sa 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.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.

Distribiye Aprantisaj ak Apache MXNet ak Horovod
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.

Distribiye Aprantisaj ak Apache MXNet ak Horovod
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 pòs sa a.

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 Amazon Deep Learning AMI, 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 MNIST и IMAGEnet.

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 MXNepou premye konstwi MXNet. Nou rekòmande tou fòtman li atik la MXNet nan 60 minitpou kòmanse.

Si ou te deja travay ak MXNet epi ou vle eseye distribye aprantisaj ak Horovod, Lè sa a, gade nan Paj enstalasyon Horovod, bati li nan MXNet epi swiv egzanp lan MNIST oswa IMAGEnet.

*Pri a kalkile baze sou to èdtan AWS pou enstans EC2

Aprann plis sou kou a "Endistriyèl ML sou gwo done"

Sous: www.habr.com

Add nouvo kòmantè