ααΆαααααααα’αααααααααΌαααΆααααα
ααα
αα»αααααα
αΆααααααΎααααααααα·ααααΆ
ααΆαααααα»ααααααΆααααααΆαα ααα αΆαααΎααααΈαα»αααααΌααααααααΆαααααα·αααααΆααααααααΆα αααΎαα’αΆα ααΆααααααααααααααΆααααα»ααααααΆααααααααΆααααααααααΆααααα ααααΎαααΎαα·ααααααααα αααΎαααΈαααααΆα ααα α αααΎααααα α¬ααΌααααΈααααΆααΈ αααααααΎα±αααα αα αααααααααα»ααααααΆααααααΈαααΆαααΆααα αααα»αααΆαα’αα»ααααααΆαααααααααααΆααααααΌααααααα α α’αααααααΎααααΆααααααΌααααααααΈααααα ααααααα αα·αααααΎααααΆααααααα·αααααααα ααΎααααΈααΆα αααΎα αααααΆααα₯αααα·αααααΆαααααΆαααα ααΎααααα·αααααΆαααααΆαααααΎααΆαααααααΆαα ααΎαααΈααα α’αααααααΎααααΆαααααα½αααΉαααΈααααααΆαααααααΆαααααααΈαααααα»ααααααΆααααααααΎαααΆαααΎ instance αααα½ααα ααΆαα instances α αααΎαα
αα
αααα»αα’αααααααα ααΎαααΉααα·ααΆαα’αααΈαα·ααΈααΆααααα½α αα·ααα αααααα»αααΆαα
ααα
αΆαααΆαααααααααααΎαααααΆαααααΎαααΌααΆαααΆαααααααα
αααα Apache MXNet αα·αααααααααααα·ααααΆαααααΆαα
ααα
αΆα Horovod α ααΎαααΉααααα αΆααααΆαα
αααΆααα’αααΈα’αααααααααααααααΆαα’αα»ααααααααααααααα Horovod αα·ααααα αΆαααΈαααααααααααααααΈαααααα»ααααααΆα MXNet ααΎααααΈα±ααααΆααααΎαααΆααααα»αααααααα
ααα
αΆαααΆαα½α Horovod α
ααΎ Apache MXNet ααΆα’αααΈ?
ααΆαααααα»ααααααΆαα ααα αΆααααα»α MXNet ααΆαα½ααααΆαααΈααααααΆαααΆαααααα
ααΎ Horovod ααΊααΆα’αααΈ
ααΆααα½ααααα αΌα 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
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
αααααΎαα
αααααααααααα»ααΌα
ααααΆααΆαα½α MXNet αααα 1.4.0 α¬αααααααΆαααα αα·α Horovod αααα 0.16.0 α¬αααααααΆαααα ααΎααααΈααααΎααΆααααα
ααα
αΆαα α’αααααααΉαααααΌαααα‘αΎααααααΆααααααααΆααααΆαααααα»ααααααΆα GPU αααααα αααααΆααα§ααΆα αααααααααΎα ααΎαααΆαααααΎαααΎα Ubuntu 16.04 Linux ααΆαα½αααΉα GPU Driver 396.44, CUDA 9.2, cuDNN 7.2.1 library, NCCL 2.2.13 communicator αα·α 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 αα½α
α αΎα α αΎαα
ααααΆαααααααΆααααα
ααα
αΆαααΆαα½α Horovod αααααΆααααααΎα
* ααΆαα
αααΆαααααΌαααΆαααααΆαααααα’ααααΎ
ααααααααααααααα’αααΈαααααα·ααααΆ
ααααα: www.habr.com