ααΆαααααααα’αααααααααΌαααΆααααα ααα αα»αααααα αΆααααααΎααααααααα·ααααΆ
ααΆαααααα»ααααααΆααααααΆαα ααα αΆαααΎααααΈαα»αααααΌααααααααΆαααααα·αααααΆααααααααΆα αααΎαα’αΆα ααΆααααααααααααααΆααααα»ααααααΆααααααααΆααααααααααΆααααα ααααΎαααΎαα·ααααααααα αααΎαααΈαααααΆα ααα α αααΎααααα α¬ααΌααααΈααααΆααΈ αααααααΎα±αααα αα αααααααααα»ααααααΆααααααΈαααΆαααΆααα αααα»αααΆαα’αα»ααααααΆαααααααααααΆααααααΌααααααα α α’αααααααΎααααΆααααααΌααααααααΈααααα ααααααα αα·αααααΎααααΆααααααα·αααααααα ααΎααααΈααΆα αααΎα αααααΆααα₯αααα·αααααΆαααααΆαααα ααΎααααα·αααααΆαααααΆαααααΎααΆαααααααΆαα ααΎαααΈααα α’αααααααΎααααΆαααααα½αααΉαααΈααααααΆαααααααΆαααααααΈαααααα»ααααααΆααααααααΎαααΆαααΎ instance αααα½ααα ααΆαα instances α αααΎαα
αα αααα»αα’αααααααα ααΎαααΉααα·ααΆαα’αααΈαα·ααΈααΆααααα½α αα·ααα αααααα»αααΆαα ααα αΆαααΆαααααααααααΎαααααΆαααααΎαααΌααΆαααΆαααααααα αααα Apache MXNet αα·αααααααααααα·ααααΆαααααΆαα ααα αΆα Horovod α ααΎαααΉααααα αΆααααΆαα αααΆααα’αααΈα’αααααααααααααααΆαα’αα»ααααααααααααααα Horovod αα·ααααα αΆαααΈαααααααααααααααΈαααααα»ααααααΆα MXNet ααΎααααΈα±ααααΆααααΎαααΆααααα»αααααααα ααα αΆαααΆαα½α Horovod α
ααΎ Apache MXNet ααΆα’αααΈ?
ααΊβααΆβααααααααβααΆαβαα·ααααΆβαααΈααααα βαααααβααΎαα αα βαααβααααΌαβααΆαβααααΎβααΎααααΈβαααααΎα ααααα»ααααααΆα αα·αβααααΎααααΆααβαααααΆαβαααααααααΆαβαααα α MXNet ααααααααΈααΆααααα»αααααΆααααααΆααααααΉαααΆαα’αα»αααααααααΆααααααααααΆα ααααΎαααΆαααΆαααααα αα·αα’αΆα ααααΎααΆαααααααΆαααΆα αα·αααααα APIs αααααΆααααΆααΆααααααααααα·ααΈααααα·ααααΌα ααΆ , , , , , , αα·αααααααααα
ααΆαααααα»ααααααΆαα ααα αΆααααα»α MXNet ααΆαα½ααααΆαααΈααααααΆαααΆαααααα
ααααΎαα·ααΈααΆααααααααΆαααΈααααααΆαααΆααααααα ααΆααααΎαααα»ααααααΆαααΈααααααΆαααΆααααααααΎααααΈαααααΌααααααΆαααΈαααααααα·αα½αα α’αα»ααααααΆααααααΌααααα»α αα·ααααααΌααααααΆααααααΆαααααΎαα αα α»ααααααααΆααααα‘αααα αααααααα·ααααααΆααααΆαααααΎα±αααααααΎαα‘αΎααα·ααααααΆααα ααΆαααααααααΆααΆαααααααΉαααααΌααααααΆαααΈαααα ααααααααααααΊααΆαααααΉαααααΆααααααααΆαααααααΆαααααααααααααα·αααααΆαα ααααα·αααΎβααΆαβαααΆαααΈαααβαααΆαααΆααααααβαααα½α ααΆβα’αΆα βααΉαβααααΆαβααΆβα§αααααβαααα»αβααΆαβααααΆα αααα»ααα αα·α ααααα·αααΎαααΆαααΈαααα αααΎααααααααΌαααΆαααααΎααααΆαα ααΆαααααΆααααααα αααΎααα α αααΎαα’αΆα αα·αααΆαααααΆαααααααΆαααΆααα’ααα
ααΎ Horovod ααΊααΆα’αααΈ
ααΊβααΆβαααααααααβαα·ααααΆβαααα ααααβαααβααΆαβα ααα αΆαβαααβααΎαα αα αβαααβααΆαβαααααΎαβα‘αΎαβαα Uberα ααΆααααΎααααΆαααα αα αααα·ααααΆααααααΆαα GPU αα·αααααΆααααααααααααααα·αααααΆαααΌα ααΆ NVIDIA Collective Communications Library (NCCL) αα·α Message Passing Interface (MPI) ααΎααααΈα ααα αΆα αα·ααααααΌααααα»ααααΆαααΆααααααααααΌαα ααΌααΆαα vorecs α ααΆαααααΎαααααα·αααααΆαααΆαααααΎααααΆααααααα·ααααααΌααααααΆα αα·αααΆαααααΎααΆαααααααΆαααΆααααΆαααα’αα αααααααΎααΆαααΆαα½αααααΌαααααΆααααααααααΆααααα α αα αα α»ααααααβαααβααΆβααΆααααβαααααααααβααΆαβαααβαααΆαααΈαβααβαααβαα·ααβαα½αβα ααα½αβααΊβ , Tensorflow, Keras, αα·α PyTorch α
ααΆααα½ααααα αΌα MXNet αα·α Horovod
MXNet αα½ααααα αΌαααΆαα½α Horovod ααΆαααα Distributed Learning APIs αααααΆαααααααααα»α Horovodα APIs ααααΆαααααα Horovod horovod.broadcast(), horovod.allgather() ΠΈ horovod.allreduce() ααΆαα’αα»αααααααααααΎααΆαα α αααα‘αααααα·αα’ααααΆααααααΆαααΈα MXNet αααααΆααααααα½αααααααΆα ααααΆαααΆαααααααΆα αα αααα»ααα·ααΈααα ααΆαα’αΆααααααα·αααααααααΆαααααΆαααααα αα·αααΆαααααΆααααΌαααΆαααααααααααααΆαααΆααααα½αααααααΆαααΈα MXNet ααΎααααΈαααααΆαααΆαααΆαααααααααΎαααΆααααααΆαααααΆαααααΎααααΆαααααα ααααα»αααααΎαααααα·αααααΆαα ααα αΆααααααΆαααααααα αααα»α Horovod horovod.DistributedOptimizer αααααΈα ααα’αααααΎααααα»αα αα αααα»α MXNet ααΌα ααααααΆα α Horovod APIs αααααααΌαααααΆαααααΆααααΆαααααΎαα αα α»ααααααααΆααααΆαααΆααααααα ααα αΆαα ααααααΆααααα’α·αααααΆαα’αα»ααααααΆαααααααΆααααααΆααΆαα ααααα’αααααααΎααααΆααα α»ααααααα
ααΆαα αΆααααααΎαααΏα
α’αααα’αΆα
α
αΆααααααΎαααααα»ααααααΆααααααΆααααααααααΆαααΌα
ααΆα
αααΆαααΆαααα αααα
ααΎαααα»ααα·αααααα MNIST αααααααΎ MXNet αα·α Horovod αα
ααΎ MacBook ααααα’αααα
ααααΌαααα‘αΎα mxnet αα·α horovod ααΈ PyPIα
pip install mxnet
pip install horovodα αααΆαα ααααα·αααΎα’ααααα½αααααααααα αΆααα‘α»αααα pip ααα‘αΎα horovodαααα ααααΆα’αααααααΌαααααααα’ααα MACOSX_DEPLOYMENT_TARGET=10.vvαααααΆαααααα vv - αααααΊααΆαααααααααα MacOS ααααα’ααα α§ααΆα ααααααααΆαα MacOSX Sierra α’αααααΉαααααΌαααααα MACOSX_DEPLOYMENT_TARGET=10.12 pip ααα‘αΎα horovod
αααααΆααααααα‘αΎα OpenMPI .
αα α α»ααααα αα ααΆαααααααααΈαααΆααααα mxnet_mnist.py α αΎαααααΎαααΆαααΆααααααααΆααΆαααααααα αααα»αααααΆααΈα MacBook αα αααα»αααααΆαααΆαα
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.pyααΆααΉαααααΎαααΆαααΆαααααα»ααααααΆαααΎααααΌαααΈααα processor ααααα’αααα ααααααααΉαααΆαααΌα ααΆααααααα
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 GPUs αααααΆαααααΆαααΈααααΈ p3.16x αα EC2 αααααΈαα½ααααΆα 8 NVIDIA Tesla V100 GPUs αα ααΎ AWS cloud ααΎααααααα ααΆαααΌαααΆαααααα»ααααααΆα 45000 ααΌαααΆα/αα·ααΆααΈ (α§. α ααα½αααααΌαααααΆαααααα»ααααααΆααααα»ααα½ααα·ααΆααΈ)α ααΆαααααα»ααααααΆαααΆααααα αααααα»ααααααα 44 ααΆααΈαααααΆααααΈ 90 ααααααΆαα½αααΉαααΆαααααΉαααααΌαααα’αααα»α 75.7% α
ααΎαααΆαααααααααααΆαα ααΉααα·ααΈααΆαααααααααα»ααααααΆαα ααα αΆααααα MXNet ααααΆαααααΎααααΆαααααΆαααΈααααααΆαααΆαααααααα ααΎ 8, 16, 32 αα·α 64 GPUs ααΆαα½αααΉααααΆαααΈααααααΆαααΆαααααααααα½α αα·ααααΆααΆααααααΆαααΈααααα ααααααααΈ 1 αα 1 αα·α 2 αα 1 αααααααΆα α’αααα’αΆα ααΎααααααααα αααα»αααΌαααΆαααΈ 1 ααΆααααααα αα ααΎα’αααα y αα ααΆαααααα αααΆαααααΆαα±ααα ααα½αααΌαααΆααααααααΌαα αααΉαα αΆαααααα»ααα½ααα·ααΆααΈ αααααΆαααααα»ααααα αΆααααΈααααα·αααααΆαααααΆαααααΎααΆαααααααΆα (αααααΊαααΆααΆαααααααα αΌαααΆααααααααα ααααα’) αα ααΎα’αααα y αα ααΆαααααΆαα ααΌα αααα’αααα’αΆα ααΎααααααΎαααα ααα½ααααΆαααΈααααααααΆαααααααααα·αααααΆαααααΆαααααΎααΆαααααααΆαα ααααα·αααΎααΆααααΆαααΈααααααΆαααΆαααααααααα½α ααααα·αααααΆαααααΆαααααΎααΆαααααααΆαααααΆααα α»αααα 38% ααΎ 64 GPU α ααΎααααΈαααααα ααΆαααΌαααααα·αααααΆαααααΆαααααΎααΆαααααααΆαααΌα ααααΆααΉα Horovod ααα α’αααααααΌααααααΎαα ααα½ααααΆαααΈαααααΈααααααααΉαα ααα½αααααααα

ααΌαααΆαααΈ 1. ααΆαααααααααααΆααααα
ααα
αΆααααααααΎ MXNet ααΆαα½α Horovod αα·αααΆαα½ααααΆαααΈααααααΆαααΆαααααα
αα αααα»αααΆααΆαααΈ 1 ααΆαααααα ααΎαααααααααααΆαα αααΆαα α»αααααααααα»ααα½αααααΈ αα αααααααΎαααΆαααΆααα·αααααααΎ 64 GPUs α ααΆαααααΎααααΆαα MXNet ααΆαα½α Horovod αααααααΌαααα αΌαααααα’αααα»ααααα»αααΆαα αααΆαααΆααααα»αα

ααΆααΆαααΈ 1. ααΆαααααααααααααααααΆα Horovod αα·α Parameter Server ααΆαα½αααΉααααΆααΆααααααΆαααΈααααα
ααααααααΈ 2 αα
1 α
ααα αΆααααα»αααΆαααααααΌα
αα ααα αΆααααααΆαα ααΎαααΉααααα αΆαα’αααααΈαααααααααΎαα‘αΎααα·αααΌαααααααααααΆαααααα»ααααααΆααααααΆαα ααα αΆααααααααΎ MXNet αα·α Horovod α ααΎααααΈααααααααααααααα’αααΈααΆααααα ααα αΆαααΆαα½α MXNet ααΌαα’αΆα .
αααααα αΆα 1
αααααΎαα ααααααα instance ααΌα ααααΆααΆαα½α MXNet αααα 1.4.0 α¬αααααααΆαααα αα·α Horovod αααα 0.16.0 α¬αααααααΆαααα ααΎααααΈααααΎααΆαααααα»ααααααΆαΰΉΰΈΰΈα ααα αΆαα α’αααααααΉαααααΌαααα‘αΎααααααΆααααααααΆααααΆαα αααΉαα αΆαα GPU αααααα αααααΆαα instance ααααααΎα ααΎαααΆαααααΎαααΎα Ubuntu 16.04 LinuxααΆαα½ααααααα·ααΈαααααΆ GPU 396.44, CUDA 9.2, αααααΆααα cuDNN 7.2.1, NCCL communicator 2.2.13 αα·α OpenMPI 3.1.1α α’αααααα’αΆα ααααΎ αααααΆααααααααααααααΆαααααΆαααααααααΌαααΆαααα‘αΎαααΆαα»ααα½α α αΎαα
αααααα αΆα 2
αααααααααααααΆααααα»αααΆαααααΎααΆαααΆαα½α Horovod API αα ααααααΈαααααα»ααααααΆα MXNet ααααα’αααα ααααααΈαααΆααααααααα’ααααΎ MXNet Gluon API α’αΆα ααααΌαααΆαααααΎααΆααααΌααΆααααα αααααΆααααΆα’αααααα·αααΊα αΆαααΆα αααααα·αααΎα’αααααΆαααααααΈαααααα»ααααααΆααααααααΌαααααΆαα½α α αΎαα αααααΊααΆααΆαααααΆααααααΌαααααΆααααα½αα ααα½ααααα’αααααααΌαααααΎααΎααααΈαααααΆαα½α Horovodα
- αααααααα·αααααααααα ααΆαα αααΆααααααΆαα Horovod αααα»αααααα (αααααΆααααΈ 8) ααΎααααΈαααααΆααΆαααααα»ααααααΆαααααΌαααΆαα’αα»αααααα ααΎααααΌαααααΆα ααα·αααααΉαααααΌαα
- ααααααΆαααααΆαααΆααααααααααΌαααΈααααααααααΆαααα ααΆααα’αα (αααααΆαα 18) ααΎααααΈααΆααΆααΆααααααααΆααα’ααα αΆααααααΎαααΆαα½αααΉααααΆαααΆααααααααααΌαααΌα ααααΆα
- αααααΎα Horovod αααααα·ααΈα ααα αΆααααααΎαααααα·αααααΆα (αααααΆαα 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 ααα»αα ααα½α XNUMX αα αααα»αα αααααα α§ααααααααααΎαααααα·αααααΆα Stochastic Gradient Descent (SGD) ααΉαααααΌαααΆαααααΎααΆαα½ααααΆαααΆαααααααααααααΆααααααα
- ααα ααα»αααΌα α α’α₯α¦
- α’ααααΆαα·ααααΆα α .α‘
- ααααα»αα α .α©
- ααΆααααααααααα: 0.0001
αα ααααααααΎαααααΎααΆαααααααΆαααΈ GPU αα½ααα 64 GPUs ααΎαααααΎααΆαααααααΆαα’ααααΆααΆαααααα»ααααααΆαααΆαααααΆαααααααααααα ααΆαα ααα½α GPUs (ααΈ 0,1 αααααΆαα 1 GPU αα 6,4 αααααΆαα 64 GPUs) ααααααααααααααΆα ααα½αααΌαααΆααααα»ααα½α GPU αα 256 (ααΈααααα»ααα 256 ααΌαααΆααααααΆαα 1 GPU αα 16 αααααΆαα 384 GPUs) α αααΆαααΆααααααααααΆαααα α»ααααααα αα·αααααα»αααΆαααααΆααααααΌααα ααααααα ααα½α GPUs ααΎαα‘αΎαα ααΎαααΆαααααΎααΆαααααα»ααααααΆαααΆαααΆααααΆααα αααα»αααΆαα½αααΉααααααααα·αααααα float64 αααααΆαα forward pass αα·α float16 αααααΆαααααααΆαααΎααααΈαααααΎαααααΏαααααΆαααααΆ float32 αααααΆααααααα NVIDIA Tesla GPUs α
$ 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 ααααΌαα ααΎαααααΌααααααα’αα»ααΆααααααΆαααααΆααα±ααα’αΆαα’ααααα ααΎααααΈα αΆααααααΎαα
ααααα·αααΎα’αααααΆαααααΎααΆαααΆαα½α MXNet αα½α α αΎα α αΎαα ααααΆαααααααΆααααα ααα αΆαααΆαα½α Horovod αααααΆααααααΎα αααααΎαααΆααΈ MXNet α αΎαααααΎααΆαα§ααΆα ααα α¬ .
* ααΆαα αααΆαααααΌαααΆαααααΆαααααα’ααααΎ AWS αααααΆαα EC2 Instances
ααααααααααααααα’αααΈαααααα·ααααΆ
ααααα: www.habr.com
