Distributed Learning karo Apache MXNet lan Horovod

Terjemahan artikel disiapake ing wayah wengi wiwitan kursus "ML Industri ing Big Data"

Latihan sing disebarake babagan macem-macem komputasi kanthi kinerja dhuwur bisa nyuda wektu latihan jaringan saraf jero modern babagan jumlah data sing akeh saka minggu nganti jam utawa malah menit, nggawe teknik latihan iki umum ing aplikasi praktis sinau jero. Pangguna kudu ngerti cara nuduhake lan nyinkronake data ing pirang-pirang kasus, sing uga duwe pengaruh gedhe kanggo efisiensi skala. Kajaba iku, pangguna uga kudu ngerti carane nyebarake skrip latihan sing mlaku ing siji conto nganti pirang-pirang kasus.

Ing artikel iki kita bakal ngomong babagan cara sing cepet lan gampang kanggo nyebarake sinau nggunakake perpustakaan open deep learning Apache MXNet lan kerangka pembelajaran sing disebarake Horovod. Kita bakal nduduhake kanthi jelas keuntungan kinerja kerangka Horovod lan nduduhake carane nulis skrip latihan MXNet supaya bisa digunakake kanthi cara sing disebarake karo Horovod.

Apa Apache MXNet

Apache MX Net minangka kerangka sinau jero open-source sing digunakake kanggo nggawe, nglatih, lan nyebarake jaringan saraf jero. MXNet abstrak babagan kerumitan sing ana gandhengane karo implementasi jaringan saraf, performa banget lan bisa diukur, lan nawakake API kanggo basa pamrograman populer kayata Python, C ++, Clojure, Jawa, Julia, R, Scala lan liyane.

Latihan sing disebarake ing MXNet kanthi server parameter

Modul sinau disebarake standar ing MXNet nggunakake pendekatan server parameter. Iku nggunakake pesawat saka server parameter kanggo ngumpulake gradien saka saben buruh, nindakake aggregation, lan ngirim nganyari gradients bali menyang buruh kanggo pengulangan Optimization sabanjuré. Nemtokake rasio sing bener saka server kanggo buruh minangka kunci kanggo skala efektif. Yen mung ana siji parameter server, iku bisa dadi bottleneck ing petungan. Kosok baline, yen akeh banget server sing digunakake, akeh-kanggo-akeh komunikasi bisa clog munggah kabeh sambungan jaringan.

Apa iku Horovod

Horovod minangka kerangka sinau jero sing disebarake terbuka sing dikembangake ing Uber. Iki nggunakake teknologi lintas-GPU lan cross-node sing efisien kayata NVIDIA Collective Communications Library (NCCL) lan Message Passing Interface (MPI) kanggo nyebarake lan nglumpukake paramèter model ing vorecs. Ngoptimalake panggunaan bandwidth jaringan lan skala kanthi apik nalika nggarap model jaringan saraf jero. Saiki ndhukung sawetara kerangka pembelajaran mesin sing populer, yaiku MX Net, Tensorflow, Keras, lan PyTorch.

Integrasi MXNet lan Horovod

MXNet Integrasi karo Horovod liwat Distributed Learning API ditetepake ing Horovod. API komunikasi Horovod horovod.broadcast(), horovod.allgather() и horovod.allreduce() dileksanakake nggunakake callback bedo saka mesin MXNet, minangka bagéan saka grafik tugas sawijining. Kanthi cara iki, dependensi data antarane komunikasi lan komputasi gampang ditangani dening mesin MXNet kanggo ngindhari mundhut kinerja amarga sinkronisasi. obyek optimizer mbagekke ditetepake ing Horovod horovod.DistributedOptimizer nggedhekake Optimizer ing MXNet supaya nelpon API Horovod cocog kanggo nganyari parameter mbagekke. Kabeh rincian implementasine iki transparan kanggo pangguna pungkasan.

wiwitan cepet

Sampeyan bisa kanthi cepet miwiti latihan jaringan saraf convolutional cilik ing dataset MNIST nggunakake MXNet lan Horovod ing MacBook.
Pisanan, instal mxnet lan horovod saka PyPI:

pip install mxnet
pip install horovod

Cathetan: Yen sampeyan nemoni kesalahan sajrone pip nginstal horovodMungkin sampeyan kudu nambah variabel MACOSX_DEPLOYMENT_TARGET=10.vvngendi vv - iki versi versi MacOS sampeyan, contone, kanggo MacOSX Sierra sampeyan kudu nulis MACOSX_DEPLOYMENT_TARGET=10.12 pip nginstal horovod

Banjur nginstal OpenMPI saka kene.

Ing pungkasan, download script test mxnet_mnist.py saka kene lan jalanake printah ing ngisor iki ing terminal MacBook ing direktori kerja:

mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py

Iki bakal mbukak latihan ing rong inti prosesor sampeyan. Output bakal kaya ing ngisor iki:

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

Demo kinerja

Nalika nglatih model ResNet50-v1 ing dataset ImageNet ing 64 GPU kanthi wolung conto p3.16x gedhe EC2, saben ngemot 8 NVIDIA Tesla V100 GPUs ing awan AWS, kita entuk throughput latihan 45000 gambar / detik (yaiku, jumlah sampel sing dilatih per detik). Latihan rampung ing 44 menit sawise 90 jaman kanthi akurasi paling apik 75.7%.

Kita mbandhingake iki karo pendekatan latihan sing disebarake MXNet nggunakake server parameter ing 8, 16, 32 lan 64 GPU kanthi server parameter siji lan rasio server kanggo buruh 1 kanggo 1 lan 2 kanggo 1. Sampeyan bisa ndeleng asil ing Figure 1 ngisor. Ing sumbu y ing sisih kiwa, bar makili jumlah gambar sing kudu dilatih saben detik, garis kasebut nggambarake efisiensi skala (yaiku rasio aktual kanggo throughput sing cocog) ing sumbu y ing sisih tengen. Kaya sing sampeyan ngerteni, pilihan saka jumlah server mengaruhi efisiensi skala. Yen mung ana siji parameter server, irungnya efficiency njongko kanggo 38% ing 64 GPUs. Kanggo entuk efisiensi skala sing padha karo Horovod, sampeyan kudu tikel kaping pindho jumlah server sing ana gandhengane karo jumlah karyawan.

Distributed Learning karo Apache MXNet lan Horovod
Gambar 1. Perbandingan distributed learning nggunakake MXNet karo Horovod lan server parameter

Ing Tabel 1 ing ngisor iki, kita mbandhingake biaya pungkasan saben conto nalika nindakake eksperimen ing 64 GPU. Nggunakake MXNet karo Horovod nyedhiyakake throughput paling apik kanthi biaya paling murah.

Distributed Learning karo Apache MXNet lan Horovod
Tabel 1. Perbandingan biaya antarane Horovod lan Server Parameter kanthi rasio server kanggo buruh 2 nganti 1.

Langkah kanggo reproduksi

Ing langkah sabanjure, kita bakal nuduhake sampeyan carane ngasilake asil latihan sing disebarake nggunakake MXNet lan Horovod. Kanggo mangerteni sing luwih lengkap babagan sinau disebarake karo MXNet maca kirim iki.

langkah 1

Nggawe kluster conto homogen karo MXNet versi 1.4.0 utawa luwih dhuwur lan Horovod versi 0.16.0 utawa luwih dhuwur kanggo nggunakake sinau sing disebarake. Sampeyan uga kudu nginstal perpustakaan kanggo latihan GPU. Kanggo conto, kita milih Ubuntu 16.04 Linux, karo GPU Driver 396.44, CUDA 9.2, perpustakaan cuDNN 7.2.1, NCCL 2.2.13 communicator lan OpenMPI 3.1.1. Sampeyan uga bisa nggunakake Amazon Deep Learning AMI, ing ngendi perpustakaan iki wis diinstal sadurunge.

langkah 2

Tambah kemampuan kanggo nggarap API Horovod menyang skrip latihan MXNet. Skrip ing ngisor iki adhedhasar MXNet Gluon API bisa digunakake minangka cithakan prasaja. Garis kanthi kandel dibutuhake yen sampeyan wis duwe skrip latihan sing cocog. Mangkene sawetara owah-owahan kritis sing kudu sampeyan lakoni kanggo sinau karo Horovod:

  • Setel konteks miturut peringkat Horovod lokal (baris 8) kanggo mangerteni yen latihan ditindakake ing inti grafis sing bener.
  • Pass paramèter dhisikan saka siji buruh kanggo kabeh (baris 18) kanggo mesthekake yen kabeh buruh miwiti karo paramèter dhisikan padha.
  • Nggawe Horovod DistributedOptimizer (baris 25) kanggo nganyari paramèter kanthi cara sing disebarake.

Kanggo entuk skrip lengkap, deleng conto Horovod-MXNet 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    ...

langkah 3

Mlebu menyang salah sawijining buruh kanggo miwiti latihan sing disebarake nggunakake arahan MPI. Ing conto iki, latihan mbagekke ing papat kedadean karo 4 GPU saben, lan total 16 GPUs ing kluster. Pangoptimal Stochastic Gradient Descent (SGD) bakal digunakake kanthi hiperparameter ing ngisor iki:

  • ukuran mini-batch: 256
  • tingkat sinau: 0.1
  • momentum: 0.9
  • bosok bobot: 0.0001

Nalika kita skala saka siji GPU kanggo 64 GPU, kita linearly scaled tingkat latihan miturut nomer GPUs (saka 0,1 kanggo 1 GPU kanggo 6,4 kanggo 64 GPU), nalika tetep nomer gambar saben GPU ing 256 (saka kumpulan saka 256 gambar kanggo 1 GPU nganti 16 kanggo 384 GPU). Bosok bobot lan paramèter momentum diganti nalika jumlah GPU tambah. Kita nggunakake latihan presisi campuran kanthi jinis data float64 kanggo pass maju lan float16 kanggo gradien kanggo nyepetake petungan float32 sing didhukung dening GPU NVIDIA Tesla.

$ 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

kesimpulan

Ing artikel iki, kita ndeleng pendekatan skalabel kanggo latihan model sing disebarake nggunakake Apache MXNet lan Horovod. Kita nuduhake efisiensi skala lan efektifitas biaya dibandhingake pendekatan server parameter ing dataset ImageNet sing model ResNet50-v1 dilatih. Kita uga wis kalebu langkah-langkah sing bisa digunakake kanggo ngowahi script ana kanggo mbukak latihan multi-kayata nggunakake Horovod.

Yen sampeyan lagi miwiti MXNet lan sinau jero, bukak kaca instalasi MXNekanggo pisanan mbangun MXNet. Kita uga nyaranake maca artikel kasebut MXNet ing 60 menitkanggo miwiti.

Yen sampeyan wis nggarap MXNet lan pengin nyoba sinau sing disebarake karo Horovod, banjur deleng Kaca instalasi Horovod, mbangun saka MXNet lan tindakake conto MNIST utawa ImageNet.

* biaya diwilang adhedhasar tarif saben jam AWS kanggo EC2 Instances

Sinau luwih lengkap babagan kursus kasebut "ML Industri ing Big Data"

Source: www.habr.com

Add a comment