áá±á¬ááºážáá«ážááá¬áá¬ááŒááºááᯠáááºáááºážá
ááá·áºáá±á·ááœáẠááŒááºáááºáá²á·áá«áááºá
á áœááºážáá±á¬ááºáááºááŒáá·áº ááœááºááŒá°áᬠááŒá áºáááºáá»á¬ážá áœá¬ááœáẠááŒáá·áºáá±áá¬ážáá±á¬ áá±á·áá»áá·áºáá±ážááẠáá±áá¬á¡ááŒá±á¬ááºá¡áá»á¬ážááᯠáááºááá¹ááááºá០áá¬áá®á¡áá ááá¯á·ááá¯áẠáááá áºá¡áá áá±ááºáá®áááºááŸáá¯ááºážáá±á¬ á¡á¬áá¯á¶ááŒá±á¬ááœááºáááºáá»á¬ážá áá±á·áá»áá·áºáá»áááºááᯠáá»áŸá±á¬á·áá»ááá¯ááºááŒá®ážá á€áá±á·áá»áá·áºáá±ážáááºážá áá áºááẠáááºáá²áá±á¬áááºáá°ááŸá¯ááᯠáááºááœá±á·á¡áá¯á¶ážáá»ááŸá¯ááœáẠáá»á¶á·ááŸá¶á·á á±áá«áááºá á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááẠáá»á¬ážááŒá¬ážááŸáá±á¬ áá¬áááá»á¬ážáá áºáá»áŸá±á¬áẠáá±áá¬áá»á¬ážááᯠáá»áŸáá±ááŒááºážááŸáá·áº áá áºááŒáá¯ááºáááºážáá¯ááºáááºážááᯠáá¬ážáááºááááºááŒá áºááŒá®ážá áááºážááẠá áá±ážáá»á²á·ááŒááºážáááá±á¬ááºááŸá¯á¡áá±á«áº ááŒá®ážáá¬ážáá±á¬á¡áá»áá¯ážáááºáá±á¬ááºááŸá¯ááŸááááºá ááá¯á·á¡ááŒááºá á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááẠinstance áá áºáá¯áááºážááœááºá¡áá¯ááºáá¯ááºáá±á¬áá±á·áá»áá·áºáá±áž script ááá¯áááºááá¯á·á¡áá¯á¶ážááŒá¯ááááºááá¯ááááá·áºáááºá
á€áá±á¬ááºážáá«ážááœáẠApache MXNet ááŸáá·áº Horovod ááŒáá·áºáá±áááºááŒá¬ážááŸá¯áá±á¬ááºááᯠá¡áá¯á¶ážááŒá¯á áááºáá°ááŸá¯ááŒáá·áºáá±ááẠááœááºáá°ááŒááºáááºáá±á¬áááºážáááºážá¡ááŒá±á¬ááºáž ááœá±ážááœá±ážáá«áááºá Horovod áá°áá±á¬ááºá á
áœááºážáá±á¬ááºááẠá¡áá»áá¯ážáá»á±ážáá°ážáá»á¬ážááᯠááŸááºážááŸááºážáááºážáááºáž ááá¯ááºááŒááŒá®áž MXNet áá±á·áá»áá·áºáá±áž áá¬ááºááœáŸááºážáá±ážáá¬ážáááºážááᯠHorovod ááŸáá·áº ááŒáá·áºáá±ááá·áºáá¯á¶á
á¶ááŒáá·áº áá¯ááºáá±á¬ááºááœá¬ážáááºááŒá
áºáááºá
Apache MXNet ááá¯áá¬áá¬áá²
ááá·áºáááºáá¬áá¬ááŒáá·áº MXNet ááœáẠááŒáá·áºáá±áá¬ážáá±á¬ áááºáááºáž
Horovod ááá¯áá¬áá¬áá²
MXNet ááŸáá·áº Horovod áá±á«ááºážá ááºááŸá¯
MXNet ááẠHorovod ááœááºáááºááŸááºáá¬ážáá±á¬ Distributed Learning APIs ááŸáááá·áº Horovod ááŸáá·áº áá±á«ááºážá ááºáá¬ážáááºá Horovod áááºááœááºáá±áž API áá»á¬áž horovod.broadcast(), horovod.allgather() О horovod.allreduce() áááºážááá¯ááºáááºážáá±á¬ááºáá¬ááááºááá áºá áááºáá áºááá¯ááºážá¡áá±ááŒáá·áº MXNet á¡ááºáá»ááºá á¡áááºáááŒááºáá±á«áºááá¯ááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºáá²á·áááºá á€áááºážá¡á¬ážááŒáá·áºá áá»áááºáááºááŸá¯ááŸáá·áº ááœááºáá»ááºááŸá¯ááŒá¬ážááœáẠáá±áá¬ááŸá®ááá¯ááŸá¯ááᯠMXNet á¡ááºáá»ááºá á¡ááœááºááá° ááá¯ááºááœááºááá¯ááºáá±á¬ááŒá±á¬áá·áº á áœááºážáá±á¬ááºáááºáá¯á¶ážááŸá¯á¶ážááŸá¯áá»á¬ážááᯠááŸá±á¬ááºááŸá¬ážááá¯ááºáááºá Horovod ááœáẠáááºááŸááºáá¬ážáá±á¬ ááŒáá·áºáá±áá¬ážáá±á¬ optimizer á¡áá¬ááá¹áᯠhorovod.DistributedOptimizer áá»á²á·ááœááºáááºá Optimizer MXNet ááœáẠááŒáá·áºáá±áá¬ážáá±á¬ ááá·áºáááºáá»ááºááœááºážáá¶ááŸá¯áá»á¬ážá¡ááœáẠáááºááá¯ááºáᬠHorovod APIs áá»á¬ážááᯠáá±á«áºáááºá á€á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á¡áá±ážá áááºá¡áá»ááºáá»á¬ážá¡á¬ážáá¯á¶ážááẠáá¯á¶ážá áœá²áá°áá»á¬ážá¡ááœáẠááœáá·áºáááºážááŒááºáá¬ááŸá¯ááŸááá«áááºá
á¡ááŒááºá áááºáá«á
ááá·áº MacBook áá±á«áºááŸá MXNet ááŸáá·áº Horovod ááᯠá¡áá¯á¶ážááŒá¯á MNIST áá±áá¬á¡ááœá²ááœáẠáá±ážáááºáá±á¬ convolutional neural network ááᯠáá»ááºááŒááºá
áœá¬ á
áááºáá±á·áá»áá·áºááá¯ááºáá«áááºá
ááááŠážá
áœá¬ PyPI á០mxnet ááŸáá·áº horovod ááᯠinstall áá¯ááºáá«á
pip install mxnet
pip install horovod
ááŸááºáá»ááº- áá¬áá¡ááœááºáž á¡ááŸá¬ážá¡ááœááºážáá áºáᯠááŒá¯á¶ááœá±á·ááá«áá pip horovod ááᯠinstall áá¯ááºáá«áááẠvariable áá áºáá¯ááá·áºááẠááá¯á¡ááºáá«áááºá MACOSX_DEPLOYMENT_TARGET=10.vváááºááŸá¬ vv - á€áááºááŸá¬ áááºá MacOS áá¬ážááŸááºážá áá¬ážááŸááºážááŒá áºáááºá á¥ááá¬á MacOSX Sierra á¡ááœáẠáááºáá±ážáá¬ážááẠááá¯á¡ááºáááºááŒá áºáááºá MACOSX_DEPLOYMENT_TARGET=10.12 pip horovod ááᯠááá·áºááœááºážáá«á
ááá¯á·áá±á¬áẠOpenMPI ááᯠinstall áá¯ááºáá«á
á¡áá¯á¶ážááœááºá á
ááºážáááºááŸá¯ script ááá¯áá±á«ááºážáá¯ááºáá¯ááºáá«á mxnet_mnist.py
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py
áááºážááẠáááºááááá¯áááºáá¬á core ááŸá áºáá¯áá±á«áºááœáẠáá±á·áá»áá·áºááŸá¯ááᯠáá¯ááºáá±á¬ááºáááºááŒá áºáááºá output ááẠá¡á±á¬ááºáá«á¡ááá¯ááºáž ááŒá áºáááá·áºáááºá
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
á áœááºážáá±á¬ááºááẠáá®ááá¯
ááááºáá Ạ50 áá¯ááŸá ImageNet dataset áá áºáá¯ááœáẠResNet1-v64 áá±á¬áºáááºááᯠáá±á·áá»áá·áºáá±ážáá±á¬á¡áá« p3.16xlarge AWS cloud ááŸá NVIDIA Tesla V2 GPUs 8 áᯠáá«áááºáá±á¬ EC100 áá áºáá¯á á®ááœáẠáá»áœááºá¯ááºááá¯á·ááẠ45000 áá¯ááºáá¯á¶/sec ááŒáá·áº áá±á·áá»áá·áºáááºááŒá¬ážááŸá¯ááᯠáááŸááá²á·ááẠ(ááá¯ááá¯áááºááŸá¬ áá áºá áá¹ááá·áºáá»áŸáẠáá±á·áá»áá·áºáá¬ážáá±á¬ ááá°áá¬á¡áá±á¡ááœááº)á á¡áá±á¬ááºážáá¯á¶ážáááá»ááŸá¯ 44% ááŒáá·áº á¡áá»ááẠ90 ááŒá®ážáá±á¬áẠ75.7 áááá áºááœáẠáá±á·áá»áá·áºáá±ážááŒá®ážáá¯á¶ážáá²á·áááºá
áááºážááᯠááá·áºáááºáá¬áá¬áá áºáá¯ááŸáá·áº 8á 16á 32á 64 ááŸáá·áº 1 GPU áá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯ááá·áº MXNet áááŒáá·áºáá±áá±á·áá»áá·áºáá±ážáá»ááºážáááºáá¯á¶ááŸáá·áº ááŸáá¯ááºážááŸááºáá«áááºá ááááºááᯠá¡á±á¬ááºáá«áá¯á¶ á ááœáẠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá áááºáááºááŸá y-áááºááá¯ážááœááºá áá¬ážáá»á¬ážááẠáá áºá áá¹ááá·áºáá»áŸáẠáá±á·áá»áá·áºááẠáá¯á¶á¡áá±á¡ááœááºááᯠááá¯ááºá á¬ážááŒá¯áááºá ááá¯ááºážáá»á¬ážááẠáá¬áááºááŸá y-áááºááá¯ážááŸá á¡ááá¯ááºážá¡áá¬áááá±á¬ááºááŸá¯ (ááá¯ááá¯áááºááŸá¬á á¡ááŸááºáááẠá á¶ááŒáá¯ááºááœáŸáá·áºááŸá¯á¡áá»áá¯áž) ááᯠáááºáááºá á±áááºá áááºááœá±á·ááŒááºáááá·áºá¡ááá¯ááºážá áá¬áá¬á¡áá±á¡ááœááºáááœá±ážáá»ááºááŸá¯ááẠá¡ááá¯ááºážá¡áá¬áá»á²á·ááœááºááŸá¯á¡áá±á«áº áááºáá±á¬ááºááŸá¯ááŸááááºá áá«áá¬áá®áá¬áá¬áá¬áá áºáá¯áá¬ááŸááá«áá á¡ááá¯ááºážá¡áá¬á áœááºážáá±á¬ááºáááºááẠ1% ááá¯á· 2 GPUs ááá¯á·áá»áááºážááœá¬ážáááºá Horovod áá²á·ááá¯á· áá°áá®áá±á¬ á¡ááá¯ááºážá¡áá¬áááá±á¬ááºááŸá¯áááŸááááºá á¡áá¯ááºááá¬ážá¡áá±á¡ááœááºááŸáá·áº áááºá ááºáá±á¬ áá¬áá¬á¡áá±á¡ááœáẠááŸá áºáááá¯á¡ááºáááºá
áá¯á¶ 1. Horovod ááŸáá·áº áá«áá¬áá®áá¬áá¬áá¬ááŒáá·áº MXNet ááᯠá¡áá¯á¶ážááŒá¯á ááŒáá·áºáá±áááºááŒá¬ážááŸá¯ááᯠááŸáá¯ááºážááŸááºááŒááºážá
á¡á±á¬ááºáá±á¬áºááŒáá«ááá¬áž 1 ááœááºá áá»áœááºá¯ááºááá¯á·ááẠGPU 64 áá¯áá±á«áºááœáẠá ááºážáááºááŸá¯áá»á¬áž áá¯ááºáá±á¬ááºááá·áºá¡áá« áá±á¬ááºáá¯á¶ážáá¯ááºáá»á ááááºááᯠááŸáá¯ááºážááŸááºáá«áááºá Horovod ááŒáá·áº MXNet ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááẠáá¯ááºáá»á ááááºá¡áááºážáá¯á¶ážááŒáá·áº á¡áá±á¬ááºážáá¯á¶ážááŒááºáááºážááŸá¯ááᯠáá±á¬ááºáá¶á·áá±ážáááºá
ááá¬áž 1. áá¬áá¬ááŸáá·áº á¡áá¯ááºááá¬ážá¡áá»áá¯áž 2 á០1 ááŸááá±á¬ Horovod ááŸáá·áº Parameter áá¬áá¬á¡ááŒá¬áž áá¯ááºáá»á
áááẠááŸáá¯ááºážááŸááºááŒááºážá
áá»áá¯ážááœá¬ážááẠá¡ááá·áºáá»á¬áž
áá±á¬ááºá¡ááá·áºáá»á¬ážááœááºá MXNet ááŸáá·áº Horovod ááá¯á¡áá¯á¶ážááŒá¯á ááŒáá·áºáá±áá±á·áá»áá·áºááŸá¯áááááºááᯠáááºááá¯á·ááŒááºáá¯ááºáá±ážááááºááᯠáá»áœááºá¯ááºááá¯á·ááŒááá«áááºá MXNet ááŒáá·áº ááŒáá·áºáá±áááºááŒá¬ážááŸá¯á¡ááŒá±á¬ááºáž ááá¯ááá¯áá±á·áá¬ááẠáááºááŸá¯áá«á
ááŒá±ááŸááºáž 1
ááŒáá·áºáá±áááºááŒá¬ážááŸá¯ááᯠá¡áá¯á¶ážááŒá¯áááºá¡ááœáẠMXNet áá¬ážááŸááºáž 1.4.0 ááŸáá·áºá¡ááẠááŸáá·áº Horovod áá¬ážááŸááºáž 0.16.0 ááŸáá·áº á¡áááºááœáẠáá
áºáá¬ážáááºážááŒá
áºáá±áá±á¬ ááŒá
áºáááºáá»á¬ážá¡á
á¯á¡áá±ážáá
áºáá¯ááᯠáááºáá®ážáá«á GPU áá±á·áá»áá·áºááŸá¯á¡ááœáẠá
á¬ááŒáá·áºááá¯ááºáá»á¬ážááᯠáááºáááºááẠááá¯á¡ááºáá«áááºá áá»áœááºá¯ááºááá¯á·áá¥ááá¬áá»á¬ážá¡ááœááºá GPU Driver 16.04á CUDA 396.44á cuDNN 9.2 á
á¬ááŒáá·áºááá¯ááºá NCCL 7.2.1 áááºááœááºáá±ážá
áá
áºááŸáá·áº OpenMPI 2.2.13 ááá¯á·áá«ááŸááá±á¬ Ubuntu 3.1.1 Linux ááᯠááœá±ážáá»ááºáá²á·áááºá áááºáááºážáá¯á¶ážááá¯ááºáááºá
ááŒá±ááŸááºáž 2
áááºá MXNet áá±á·áá»áá·áºáá±áž script ááœáẠHorovod API ááŸáá·áº á¡áá¯ááºáá¯ááºááá¯ááºá áœááºážááᯠááá·áºáá«á MXNet Gluon API ááá¯á¡ááŒá±áá¶áá¬ážáá±á¬á¡á±á¬ááºáá« script ááá¯ááá¯ážááŸááºážáá±á¬áá¯á¶á á¶áááááºá¡ááŒá áºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá áááºááá¯ááºáᬠáá±á·áá»áá·áºáá±áž áá¬ááºááœáŸááºážáá áºáᯠááŸááá±ááŒá®ááá¯áá»áŸáẠáá²ááá·áºáá±á¬ ááá¯ááºážáá»á¬áž ááá¯á¡ááºáá«áááºá Horovod ááŸáá·áº áá±á·áá¬ááẠáááºáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáá±á¬ á¡áá±ážááŒá®ážáá±á¬ ááŒá±á¬ááºážáá²ááŸá¯á¡áá»áá¯á·ááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááºá
- áá±á·áá»áá·áºááŸá¯ááᯠááŸááºáááºáá±á¬ááááºáá Ạcore ááœááºáá¯ááºáá±á¬ááºááŒá±á¬ááºáž áá¬ážáááºááẠáá±áááœááºáž Horovod á¡ááá·áº (ááá¯ááºáž 8) á¡á áááºá ááºá¡ááŒá±á¬ááºážá¡áá¬ááᯠáááºááŸááºáá«á
- á¡áá¯ááºááá¬ážá¡á¬ážáá¯á¶ážááẠáá°áá®áá±á¬áááŠážááá·áºáááºáá»ááºáá»á¬ážááŒáá·áº á áááºááŒá±á¬ááºáž áá±áá»á¬á á±ááẠá¡áá¯ááºááá¬ážáá áºáŠážá០(ááá¯ááºáž 18) ááá¯á· áááŠáž ááá·áºáááºáá»ááºáá»á¬ážááᯠáá±ážááá¯á·áá«á
- Horovod ááá¯áááºáá®ážáá«á 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 ááœáŸááºááŒá¬ážáá»ááºááᯠá¡áá¯á¶ážááŒá¯á ááŒáá·áºáá±áá±á·áá»áá·áºááŸá¯á áááºááẠá¡áá¯ááºááá¬ážáá áºáŠážáᶠáááºáá±á¬ááºáá«á á€á¥ááá¬ááœááºá ááŒáá·áºáá±áá±á·áá»áá·áºááŸá¯áá áºáá¯á á®ááœáẠGPU 4 áá¯á á®áá«ááŸááá±á¬ ááŒá áºáááºáá±ážáá¯ááŸáá·áº á á¯á á¯áá±á«ááºáž 16 GPUs á¡á á¯á¡áá±ážááœáẠáá¯ááºáá±á¬ááºáááºá Stochastic Gradient Descent (SGD) optimizer ááᯠá¡á±á¬ááºáá« hyperparameter áá»á¬ážááŒáá·áº á¡áá¯á¶ážááŒá¯áá«áááº-
- áá®áá®á¡áá¯áẠá¡ááœááºá¡á á¬áž- áá á
- áááºáá°ááŸá¯ááŸá¯ááºáž- 0.1
- á¡ááŸáááºá¡áá¯ááº- 0.9
- á¡áá±ážáá»ááẠ0.0001
áá»áœááºá¯ááºááá¯á·ááẠGPU áá áºáá¯á០64 GPU ááá¯á· á áá±ážáá»ááŒááºážááŒáá·áº GPU á¡áá±á¡ááœáẠ(0,1 GPU á¡ááœáẠ1 á០6,4 GPUs á¡ááœáẠ64) ááá¯á· áá±á·áá»áá·áºááŸá¯ááŸá¯ááºážááᯠáá»ááºážá á®á¡ááá¯ááºáž áá»áááºááŸáááŒá®áž GPU áá áºáá¯áá»áŸáẠáá¯ááºáá¯á¶á¡áá±á¡ááœáẠ256 (áá áºáá¯ááºá០256 á¡áá)á GPU 1 áá¯á¡ááœáẠ16 áá¯á¶ 384 áá¯á¶)á GPU á¡áá±á¡ááœáẠááá¯ážáá¬áááºááŸáá·áºá¡áá»áŸ á¡áá±ážáá»ááẠááá¯ááœááºážááŸá¯ááŸáá·áº á¡ááŸáááºá¡áá¯áẠááá·áºáááºáá»ááºáá»á¬áž ááŒá±á¬ááºážáá²ááœá¬ážáááºá NVIDIA Tesla GPUs ááŸáá¶á·ááá¯ážáá±ážáá±á¬ float64 ááœááºáá»ááºááŸá¯áá»á¬ážááᯠá¡ááŸáááºááŒáŸáá·áºáááºá¡ááœáẠgradients áá»á¬ážá¡ááœáẠforward pass ááŸáá·áº float16 á¡ááœáẠ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 ááᯠá¡áá¯á¶ážááŒá¯á ááŒáá·áºáá±áá¬ážáá±á¬ áá±á¬áºáááºáááºáááºážá¡ááœáẠá¡ááá¯ááºážá¡áá¬áá áºáá¯á¡áá áá»ááºážáááºáááºážááᯠááŒáá·áºááŸá¯áá²á·áá«áááºá ResNet50-v1 áá±á¬áºáááºááᯠáá±á·áá»áá·áºáááºááŒá¬ážáá¬ážááá·áº ImageNet dataset ááŸá á¡ááá¯ááºážá¡áá¬áá¬áá¬áá»ááºážáááºááŸá¯ááẠá¡ááá¯ááºážá¡áá¬áááá±á¬ááºááŸá¯ááŸáá·áº áá¯ááºáá»á ááááºáááá±á¬ááºááŸá¯ááᯠáá»áœááºá¯ááºááá¯á· ááá¯ááºááŒáá²á·áááºá Horovod ááᯠá¡áá¯á¶ážááŒá¯á multi-instance áá±á·áá»áá·áºááŸá¯ááᯠáá¯ááºáá±á¬ááºááẠááŸáááŒá®ážáá¬áž script áá áºáá¯ááᯠááŒá¯ááŒááºááẠáááºá¡áá¯á¶ážááŒá¯ááá¯ááºááá·áº á¡ááá·áºáá»á¬ážáá«áááºáá«áááºá
á¡áááºá áááºááẠMXNet ááŸáá·áº áááºááŸáá¯ááºážá
áœá¬ áááºáá°ááŒááºážááá¯á·ááᯠá
áááºáá¯ááºáá±á¬ááºáá±áá«áá ááá·áºááœááºážááŒááºážá
á¬áá»ááºááŸá¬ááá¯á· ááœá¬ážáá«á
á¡áááºá áááºááẠMXNet ááŸáá·áºá¡áá¯ááºáá¯ááºááŒá®áž Horovod ááŒáá·áºááŒáá·áºáá±áááºááŒá¬ážááŸá¯ááá¯ááŒáá¯ážá
á¬ážááá¯áá«áá ááŒáá·áºááŸá¯áá«á
*áá¯ááºáá»á
ááááºáá±á«áºáá°áááºá ááœááºáá»ááºáá«áááºá
áááºáááºážá¡ááŒá±á¬ááºážááá¯ááá¯áá±á·áá¬áá«á
source: www.habr.com