แกแขแแขแแแก แแแ แแแแแ แแแแแแแแ แแฃแ แกแแก แแแฌแงแแแแก แฌแแแ แแฆแแก
แแแแแฌแแแแแฃแแแ แขแ แแแแแแแ แแ แแแแแฏแแ แแแ แแแฆแแแ แฎแแ แแกแฎแแก แแแแแแแแแ แแแกแขแแแชแแแแแ แจแแแซแแแแ แจแแแแชแแ แแก แแแแแแแแ แแแ แฆแ แแ แแแ แแฃแแ แฅแกแแแแแแก แแแ แฏแแจแแก แแ แ แแแแ แ แแแแแแแแแ แแแแแชแแแแแแ แแแแ แแแแแแ แกแแแแแแแ แแ แแฃแแแแช แฌแฃแแแแแ, แ แแช แแแฎแแแก แแ แขแ แแแแแแแก แแแแ แชแแแแแฃแแก แฆแ แแ แกแฌแแแแแก แแ แแฅแขแแแฃแ แแแแแงแแแแแแจแ. แแแแฎแแแ แแแแแแแ แฃแแแ แแแแชแแแแแแ แแ, แแฃ แ แแแแ แแแแแแแ แแ แแ แกแแแฅแ แแแแแแชแแ แแแฃแแแแแ แแแแแชแแแแ แแ แแแแ แแแกแขแแแชแแแก, แ แแช แแแแแก แแฎแ แแ แแแ แแแแแแแแก แแฎแแแแก แกแแแแแ แแแแก แแคแแฅแขแฃแ แแแแแ. แแแ แแ แแแแกแ, แแแแฎแแแ แแแแแแแ แแกแแแ แฃแแแ แแชแแแแแ, แ แแแแ แแแแแแแแกแแ แกแแกแฌแแแแ แกแแ แแแขแ, แ แแแแแแช แแฃแจแแแแก แแ แ แแแแแแแแแ แแ แแ แแแแ แแแกแขแแแชแแแแ.
แแ แกแขแแขแแแจแ แแแกแแฃแแ แแแ แกแฌแแแแแก แแแแ แชแแแแแแก แกแฌแ แแค แแ แแแ แขแแ แแแแแ แฆแแ แฆแ แแ แกแฌแแแแแแแก แแแแแแแแแแแก Apache MXNet-แแกแ แแ Horovod-แแก แแแแแฌแแแแแฃแแ แกแแกแฌแแแแ แฉแแ แฉแแก แแแแแงแแแแแแ. แฉแแแ แแแแแแ แฌแแ แแแแแฉแแแ Horovod-แแก แคแ แแแแแแ แแแก แจแแกแ แฃแแแแแก แฃแแแ แแขแแกแแแแแก แแ แแแฉแแแแแแ, แแฃ แ แแแแ แฃแแแ แแแแฌแแ แแ MXNet แกแแกแฌแแแแ แกแแ แแแขแ แแกแ, แ แแ แแก แแฃแจแแแแก แแแแแฌแแแแแฃแแแ Horovod-แแแ.
แ แ แแ แแก Apache MXNet
แแแแแฌแแแแแฃแแ แขแ แแแแแแ MXNet-แจแ แแแ แแแแขแ แฃแแ แกแแ แแแ แแ
แ แ แแ แแก แฐแแ แแแแแ
MXNet แแ Horovod แแแขแแแ แแชแแ
MXNet แแแขแแแ แแ แแแแ Horovod-แแแ Horovod-แจแ แแแแกแแแฆแแ แฃแแ แแแแแฌแแแแแฃแแ แกแแกแฌแแแแ API-แแแแก แแแจแแแแแแ. Horovod แกแแแแแฃแแแแแชแแ API horovod.broadcast(), horovod.allgather() ะธ horovod.allreduce() แแแแฎแแ แชแแแแแแฃแแแ MXNet แซแ แแแแก แแกแแแฅแ แแแฃแแ แแแแแซแแฎแแแแก แแแแแงแแแแแแ, แ แแแแ แช แแแกแ แแแแชแแแแแแก แแ แแคแแแแก แแแฌแแแ. แแ แแแแ, แแแแแชแแแแ แแแแแแแแแแฃแแแแแแ แแแแฃแแแแแชแแแกแ แแ แแแแแแแแแก แจแแ แแก แแแแแแแ แฃแแแแแแแแแ MXNet แซแ แแแแก, แ แแแ แแแแแแแ แแแชแแแแก แจแแกแ แฃแแแแแก แแแแแแแ แแแแ แกแแแฅแ แแแแแแชแแแก แแแแ. Horovod-แจแ แแแแกแแแฆแแ แฃแแ แแแแแฌแแแแแฃแแ แแแขแแแแแแขแแ แ แแแแแฅแขแ horovod.DistributedOptimizer แแคแแ แแแแแก แแแขแแแแแแขแแ แ MXNet-แจแ แแกแ, แ แแ แแก แแแแแแซแแฎแแแก แจแแกแแแแแแก Horovod API-แแแก แแแแแฌแแแแแฃแแ แแแ แแแแขแ แแแแก แแแแแฎแแแแแกแแแแก. แแแแฎแแ แชแแแแแแแก แงแแแแ แแก แแแขแแแ แแแแญแแแ แแแแแ แกแแแแแแ แแแแฎแแแ แแแแแแแกแแแแก.
แกแฌแ แแคแ แแแฌแงแแแ
แแฅแแแ แจแแแแซแแแแ แกแฌแ แแคแแ แแแแฌแงแแ แแชแแ แ แแแแแแแฃแชแแฃแ แ แแแ แแฃแแ แฅแกแแแแก แแแ แฏแแจแ MNIST แแแแแชแแแแ แแแแแแ MXNet-แแกแ แแ Horovod-แแก แแแแแงแแแแแแ แแฅแแแแก MacBook-แแ.
แแแ แแแแ, แแแแแแกแขแแแแ แแ mxnet แแ horovod PyPI-แแแ:
pip install mxnet
pip install horovod
แจแแแแจแแแ: แแฃ แจแแแแฅแแแแ แจแแชแแแแ แแ แแก pip install horovodแจแแกแแซแแแ แแแแญแแ แแแ แชแแแแแแก แแแแแขแแแ MACOSX_DEPLOYMENT_TARGET=10.vvแกแแ vv โ แแก แแ แแก แแฅแแแแ MacOS แแแ แกแแแก แแแ แกแแ, แแแแแแแแแ, MacOSX Sierra-แกแแแแก แแแแญแแ แแแแแ แฉแแฌแแ แ MACOSX_DEPLOYMENT_TARGET=10.12 แแแแแก แแแกแขแแแแชแแ horovod
แจแแแแแ แแแแแแกแขแแแแ แแ OpenMPI
แแแกแแกแ แฃแแก, แฉแแแแขแแแ แแแ แขแแกแขแแก แกแแ แแแขแ mxnet_mnist.py
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py
แแก แฉแแแขแแ แแแก แขแ แแแแแแก แแฅแแแแ แแ แแชแแกแแ แแก แแ แแแ แแแแ. แแแแแแแแแแ แแฅแแแแ แจแแแแแแ:
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
แจแแกแ แฃแแแแแก แแแแ
ResNet50-v1 แแแแแแแก แกแฌแแแแแแแกแแก ImageNet แแแแแชแแแแ แแแแแแ 64 GPU-แแ แ แแ แแแแแแแแแ แแ p3.16x แแแแ EC2, แแแแแแฃแแ แจแแแชแแแก 8 NVIDIA Tesla V100 GPU-แก AWS แฆแ แฃแแแแแ, แฉแแแ แแแแแฆแฌแแแ แขแ แแแแแแแก แแแแขแแ แฃแแแ แแแแแแแก 45000 แกแฃแ แแแ/แฌแ (แแแฃ, แแแแแแแแแฃแแ แแแแฃแจแแแแก แ แแแแแแแแ แฌแแแจแ). แแแ แฏแแจแ แแแกแ แฃแแแ 44 แฌแฃแแจแ 90 แแแแฅแแก แจแแแแแ แกแแฃแแแแแกแ แกแแแฃแกแขแแ 75.7%.
แฉแแแ แแก แจแแแแแแ แแ MXNet-แแก แแแแแฌแแแแแฃแ แกแแกแฌแแแแ แแแแแแแแก แแแ แแแแขแ แฃแแ แกแแ แแแ แแแแก แแแแแงแแแแแแก แจแแกแแฎแแ 8, 16, 32 แแ 64 GPU-แแ แแ แแ แแแ แแแแขแ แแแแ แกแแ แแแ แแ แแ แกแแ แแแ แแก แแแแแแจแ แแแแแแแ แแแแแคแแ แแแแแ 1-แแแ 1-แแแ แแ 2-แแแ 1-แแแ, แจแแกแแแแแแกแแ. แจแแแแแ แจแแแแซแแแแ แแฎแแแแ แกแฃแ แแแแ 1 แฅแแแแแ. y-แฆแแ แซแแ แแแ แชแฎแแแ, แแแแแแ แฌแแ แแแแแแแแก แแแแแกแแฎแฃแแแแแก แ แแแแแแแแแก แฌแแแจแ แแแกแแแแ แฏแแจแแแแแ, แฎแแแแแ แแกแแฎแแแก แกแแแแแ แแแแก แแคแแฅแขแฃแ แแแแก (แแแฃ แ แแแแฃแ แ แแ แแแแแแฃแ แ แแแแขแแ แฃแแแ แแแแแแแก แแแแแคแแ แแแแ) y-แฆแแ แซแแ แแแ แฏแแแแ. แ แแแแ แช แฎแแแแแ, แกแแ แแแ แแแแก แ แแแแแแแแแก แแ แฉแแแแแ แแแแแแแแก แแฎแแแแก แกแแแแแ แแแแก แแคแแฅแขแฃแ แแแแแ. แแฃ แแ แกแแแแแก แแฎแแแแ แแ แแ แแแ แแแแขแ แ แกแแ แแแ แ, แกแแแแแ แแแแก แแคแแฅแขแฃแ แแแ แแชแแแ 38%-แแแ 64 GPU-แแ. แกแแแแแ แแแแก แแแแแ แแคแแฅแขแฃแ แแแแก แแแกแแฆแฌแแแแ, แ แแแแ แช Horovod-แแแ, แแฅแแแ แฃแแแ แแแแแ แแแแแ แกแแ แแแ แแแแก แ แแแแแแแแ แแฃแจแแแแแแก แ แแแแแแแแแกแแแ แจแแแแ แแแแ.
แกแฃแ แแแ 1. MXNet-แแก แแแแแงแแแแแแ แแแแแฌแแแแแฃแแ แกแฌแแแแแแแก แจแแแแ แแแ Horovod-แแแ แแ แแแ แแแแขแ แฃแ แกแแ แแแ แแแ
แฅแแแแแ แชแฎแ แแแจแ 1, แฉแแแ แจแแแแแแ แแแ แกแแแแแแ แฆแแ แแแฃแแแแแก 64 GPU-แแ แแฅแกแแแ แแแแแขแแแแก แแแจแแแแแกแแก. Horovod-แแแ MXNet-แแก แแแแแงแแแแแ แฃแแ แฃแแแแแงแแคแก แกแแฃแแแแแกแ แแแแขแแ แฃแแแ แแแแแแแก แงแแแแแแ แแแแแ แคแแกแแ.
แชแฎแ แแแ 1. แฆแแ แแแฃแแแแแก แจแแแแ แแแ Horovod-แกแ แแ แแแ แแแแขแ แฃแ แกแแ แแแ แก แจแแ แแก แกแแ แแแ แแก แแแแแแจแ แแแแแแแ แแแแแคแแ แแแแแ 2-แแแ 1-แแแ.
แ แแแ แแแฃแชแแ แแแแก แแแแแฏแแแ
แแแแแแแแ แแแแแฏแแแจแ แฉแแแ แแแฉแแแแแแ, แแฃ แ แแแแ แฃแแแ แแแแแแแ แแ แแแแแฌแแแแแฃแแ แแแ แฏแแจแแก แจแแแแแ MXNet-แแกแ แแ Horovod-แแก แแแแแงแแแแแแ. MXNet-แแ แแแแแฌแแแแแฃแแ แกแฌแแแแแก แจแแกแแฎแแ แแแขแ แแแคแแ แแแชแแแกแแแแก แฌแแแแแแฎแแ
แแแแแฏแ 1
แจแแฅแแแแแ แฐแแแแแแแฃแ แ แจแแแแฎแแแแแแแก แแแแกแขแแ แ MXNet 1.4.0 แแ แฃแคแ แ แแแฆแแแ แแแ แกแแแ แแ Horovod 0.16.0 แแ แฃแคแ แ แแแฆแแแ แแแ แกแแแ, แ แแแ แแแแแแงแแแแ แแแแแฌแแแแแฃแแ แกแฌแแแแแแ. แแฅแแแ แแกแแแ แแแแญแแ แแแแแ แแแแแแแแแแแแแก แแแงแแแแแ GPU แขแ แแแแแแแกแแแแก. แฉแแแแ แแแแแแแแแกแแแแก, แฉแแแ แแแแ แฉแแแ Ubuntu 16.04 Linux, GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 แแแแแแแแแแ, NCCL 2.2.13 แแแแฃแแแแแขแแ แ แแ OpenMPI 3.1.1. แแกแแแ แจแแแแซแแแแ แแแแแแงแแแแ
แแแแแฏแ 2
แแแแแแขแแ Horovod API-แกแแแ แแฃแจแแแแแก แจแแกแแซแแแแแแแ แแฅแแแแก MXNet แกแแกแฌแแแแ แกแแ แแแขแก. แฅแแแแแ แแแงแแแแแแ แกแแ แแแขแ, แ แแแแแแช แแแคแฃแซแแแแฃแแแ MXNet Gluon API-แแ, แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แ แแแแ แช แแแ แขแแแ แจแแแแแแ. แกแขแ แแฅแแแแแ แแแแแแแ แกแแญแแ แแ, แแฃ แฃแแแ แแแฅแแ แจแแกแแแแแแกแ แขแ แแแแแแแก แกแแ แแแขแ. แแฅ แแแชแแแฃแแแ แ แแแแแแแแ แแแแจแแแแแแแแแ แชแแแแแแแ, แ แแแแแแช แฃแแแ แจแแแขแแแแ แฐแแ แแแแแแก แกแฌแแแแแกแแแแก:
- แแแแงแแแแ แแแแขแแฅแกแขแ แแแแแแแแ แแแ แฐแแ แแแแแแก แ แแแแแก แแแฎแแแแแ (แกแขแ แแฅแแแ 8) แแแแก แแแกแแแแแแ, แ แแ แขแ แแแแแแ แขแแ แแแแ แกแฌแแ แแ แแคแแแฃแ แแแ แแแแ.
- แแแแแกแชแแก แกแแฌแงแแกแ แแแ แแแแขแ แแแ แแ แแ แแฃแจแแแแแแ แงแแแแแแ (แกแขแ แแฅแแแ 18), แ แแแ แฃแแ แฃแแแแแงแแก, แ แแ แงแแแแ แแฃแจแแแ แแฌแงแแแก แแแแแ แกแแฌแงแแกแ แแแ แแแแขแ แแแแ.
- แจแแฅแแแแแ แฐแแ แแแแแ DistributedOptimizer (แกแขแ แแฅแแแ 25) แแแ แแแแขแ แแแแก แแแแแฌแแแแแฃแแ แฌแแกแแ แแแแแฎแแแแแกแแแแก.
แกแ แฃแแ แกแแ แแแขแแก แแแกแแฆแแแแ, แแแฎแแแ, แแฎแแแแ Horovod-MXNet-แแก แแแแแแแแแแ
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 ...
แแแแแฏแ 3
แจแแแแ แแ แ-แแ แ แแฃแจแแแจแ, แ แแแ แแแแฌแงแแ แแแแแฌแแแแแฃแแ แขแ แแแแแแ MPI แแแ แแฅแขแแแแก แแแแแงแแแแแแ. แแ แแแแแแแแจแ, แแแแแฌแแแแแฃแแ แขแ แแแแแแ แแแแแก แแแฎ แแแกแขแแแชแแแแ แแแแ 4 GPU-แแ แแ แแแแกแขแแ แจแ แกแฃแ 16 GPU-แแ. Stochastic Gradient Descent (SGD) แแแขแแแแแแขแแ แ แแแแแงแแแแแฃแแ แแฅแแแแ แจแแแแแแ แฐแแแแ แแแ แแแแขแ แแแแ:
- แแแแ-แกแแ แแแก แแแแ: 256
- แกแฌแแแแแก แแแฉแแแแแแแแ: 0.1
- แแแแฃแแกแ: 0.9
- แฌแแแแก แแแแแ: 0.0001
แแ แแ GPU-แแแ 64 GPU-แแแ แกแแแแแ แแแแกแแก, แฉแแแ แฌแ แคแแแแ แแแแแคแแ แแแแแ แขแ แแแแแแแก แกแแฎแจแแ แ GPU-แแแแก แ แแแแแแแแแก แแแฎแแแแแ (0,1-แแแ 1 GPU-แแแ 6,4-แแแ 64 GPU-แกแแแแก), แฎแแแ แกแฃแ แแแแแแก แ แแแแแแแแ แแ แ GPU-แแ 256-แแ แจแแแแแแ แฉแฃแแแ ( แแแ แขแแแแแ 256 แกแฃแ แแแ 1 GPU-แกแแแแก 16 384 GPU-แกแแแแก). แฌแแแแก แแแฅแแแแแแแ แแ แแแแฃแแกแแก แแแ แแแแขแ แแแ แจแแแชแแแแ GPU-แแแแก แ แแแแแแแแแก แแแขแแแแกแแแ แแ แแแ. แฉแแแ แแแแแแแงแแแแ แจแแ แแฃแแ แกแแแฃแกแขแแก แแแ แฏแแจแ float64 แแแแแชแแแแ แขแแแแแ แแ แแแ แฌแแ แแแแแกแแกแแแแแแ แแ float16 แแ แแแแแแขแแแแกแแแแก NVIDIA Tesla GPU-แแแแก แแแแ แแฎแแ แแแญแแ แแแ float32 แแแแแแแแแแแก แแแกแแฉแฅแแ แแแแแ.
$ 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
แแแกแแแแ
แแ แกแขแแขแแแจแ แฉแแแ แแแแแแฎแแแแ แแแแแฌแแแแแฃแแ แแแแแแแก แขแ แแแแแแแก แแแกแจแขแแแฃแ แ แแแแแแแ Apache MXNet-แแกแ แแ Horovod-แแก แแแแแงแแแแแแ. แฉแแแ แแแฉแแแแแ แกแแแแแ แแแแก แแคแแฅแขแฃแ แแแ แแ แฎแแ แฏแแแแก แแคแแฅแขแฃแ แแแ แแแ แแแแขแ แฃแแ แกแแ แแแ แแก แแแแแแแแกแแแ แจแแแแ แแแแ ImageNet แแแแแชแแแแ แแแแแแ, แ แแแแแแแแแช แแแฌแแ แแแแแ แแงแ ResNet50-v1 แแแแแแ. แฉแแแ แแกแแแ แแแแแแแขแแ แกแแคแแฎแฃแ แแแ, แ แแแแแแแช แจแแแแซแแแแ แแแแแแงแแแแ แแ แกแแแฃแแ แกแแ แแแขแแก แจแแกแแชแแแแแแ แแ แแแแ แแแกแขแแแชแแแก แขแ แแแแแแแก แแแกแแขแแ แแแแแ Horovod-แแก แแแแแงแแแแแแ.
แแฃ แแฎแแแฎแแ แแฌแงแแแ MXNet-แก แแ แฆแ แแ แกแฌแแแแแก, แแแแแแแ แแแกแขแแแแชแแแก แแแแ แแแ
แแฃ แแฅแแแ แฃแแแ แแฃแจแแแแแแ MXNet-แแแ แแ แแกแฃแ แ แกแชแแแแ แแแแแฌแแแแแฃแแ แกแฌแแแแแแ Horovod-แแแ, แแแจแแ แแแแแฎแแแแ
*แฆแแ แแแฃแแแแ แแแแแแแแแแแ แกแแคแฃแซแแแแแ
แจแแแขแงแแแ แแแขแ แแฃแ แกแแก แจแแกแแฎแแ
แฌแงแแ แ: www.habr.com