рд▓реЗрдЦрд╛рдЪрд╛ рдЕрдиреБрд╡рд╛рдж рдЕрднреНрдпрд╛рд╕рдХреНрд░рдо рд╕реБрд░реВ рд╣реЛрдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрджрд▓реНрдпрд╛ рджрд┐рд╡рд╢реА рддрдпрд╛рд░ рдХреЗрд▓рд╛ рд╣реЛрддрд╛
рдПрдХрд╛рд╣реВрди рдЕрдзрд┐рдХ рдЙрдЪреНрдЪ-рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рдВрдЧрдгрдХреАрдп рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╡рд░ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЖрдзреБрдирд┐рдХ рдбреАрдк рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХреНрд╕рдЪреНрдпрд╛ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдбреЗрдЯрд╛рд╡рд░реАрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╡реЗрд│ рдЖрдард╡рдбреНрдпрд╛рдВрдкрд╛рд╕реВрди рддрд╛рд╕ рдХрд┐рдВрд╡рд╛ рдЕрдЧрджреА рдорд┐рдирд┐рдЯрд╛рдВрдкрд░реНрдпрдВрдд рдХрдореА рдХрд░реВ рд╢рдХрддреЗ, рдЬреНрдпрд╛рдореБрд│реЗ рд╣реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рддрдВрддреНрд░ рд╕рдЦреЛрд▓ рд╢рд┐рдХреНрд╖рдгрд╛рдЪреНрдпрд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдордзреНрдпреЗ рдкреНрд░рдЪрд▓рд┐рдд рд╣реЛрддреЗ. рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдиреА рдЕрдиреЗрдХ рдШрдЯрдирд╛рдВрдордзреНрдпреЗ рдбреЗрдЯрд╛ рдХрд╕рд╛ рд╢реЗрдЕрд░ рдЖрдгрд┐ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЭ рдХрд░рд╛рдпрдЪрд╛ рд╣реЗ рд╕рдордЬреВрди рдШреЗрддрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ, рдЬреНрдпрд╛рдореБрд│реЗ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрд╡рд░ рдореЛрдард╛ рдкреНрд░рднрд╛рд╡ рдкрдбрддреЛ. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рд╣реЗ рджреЗрдЦреАрд▓ рдорд╛рд╣рд┐рдд рдЕрд╕рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ рдХреА рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╢реА рддреИрдирд╛рдд рдХрд░рд╛рд╡реА рдЬреА рдПрдХрд╛рдЪ рдкреНрд░рд╕рдВрдЧрд╛рд╡рд░ рдЕрдиреЗрдХ рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╡рд░ рдЪрд╛рд▓рддреЗ.
рдпрд╛ рд▓реЗрдЦрд╛рдд рдЖрдкрдг рдУрдкрди рдбреАрдк рд▓рд░реНрдирд┐рдВрдЧ рд▓рд╛рдпрдмреНрд░рд░реА Apache MXNet рдЖрдгрд┐ Horovod рдбрд┐рд╕реНрдЯреНрд░рд┐рдмреНрдпреБрдЯреЗрдб рд▓рд░реНрдирд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд╛рдкрд░реВрди рд╢рд┐рдХреНрд╖рдг рд╡рд┐рддрд░рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЬрд▓рдж рдЖрдгрд┐ рд╕реЛрдкреНрдпрд╛ рдорд╛рд░реНрдЧрд╛рдмрджреНрджрд▓ рдмреЛрд▓реВ. рдЖрдореНрд╣реА Horovod рдлреНрд░реЗрдорд╡рд░реНрдХрдЪреЗ рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдлрд╛рдпрджреЗ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВ рдЖрдгрд┐ MXNet рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╢реА рд▓рд┐рд╣рд╛рдпрдЪреА рддреЗ рджрд╛рдЦрд╡реВ рдЬреЗрдгреЗрдХрд░реВрди рддреЗ Horovod рд╕рд╣ рд╡рд┐рддрд░рд┐рдд рдкрджреНрдзрддреАрдиреЗ рдХрд╛рд░реНрдп рдХрд░реЗрд▓.
Apache MXNet рдореНрд╣рдгрдЬреЗ рдХрд╛рдп
рдкреЕрд░рд╛рдореАрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░рд╕рд╣ MXNet рдордзреНрдпреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╡рд┐рддрд░рд┐рдд рдХреЗрд▓реЗ
Horovod рдХрд╛рдп рдЖрд╣реЗ
MXNet рдЖрдгрд┐ Horovod рдПрдХрддреНрд░реАрдХрд░рдг
MXNet Horovod рдордзреНрдпреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ Distributed Learning API рджреНрд╡рд╛рд░реЗ Horovod рд╕рд╣ рд╕рдорд╛рдХрд▓рд┐рдд рд╣реЛрддреЗ. Horovod рд╕рдВрдкреНрд░реЗрд╖рдг APIs horovod.broadcast(), horovod.allgather() ╨╕ horovod.allreduce() MXNet рдЗрдВрдЬрд┐рдирдЪреЗ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓рдмреЕрдХ рд╡рд╛рдкрд░реВрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рддреНрдпрд╛рдЪреНрдпрд╛ рдХрд╛рд░реНрдп рдЖрд▓реЗрдЦрд╛рдЪрд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди. рдЕрд╢рд╛рдкреНрд░рдХрд╛рд░реЗ, рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЭреЗрд╢рдирдореБрд│реЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрдЪреЗ рдиреБрдХрд╕рд╛рди рдЯрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА MXNet рдЗрдВрдЬрд┐рдирджреНрд╡рд╛рд░реЗ рд╕рдВрдкреНрд░реЗрд╖рдг рдЖрдгрд┐ рдЧрдгрдиреЗрдордзреАрд▓ рдбреЗрдЯрд╛ рдЕрд╡рд▓рдВрдмрд┐рддреНрд╡ рд╕рд╣рдЬрдкрдгреЗ рд╣рд╛рддрд╛рд│рд▓реЗ рдЬрд╛рддреЗ. Horovod рдордзреНрдпреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рддрд░рд┐рдд рдСрдкреНрдЯрд┐рдорд╛рдпрдЭрд░ рдСрдмреНрдЬреЗрдХреНрдЯ horovod.DistributedOptimizer рд╡рд┐рд╕реНрддрд╛рд░рддреЗ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭрд░ MXNet рдордзреНрдпреЗ рдЬреЗрдгреЗрдХрд░реВрди рддреЗ рд╡рд┐рддрд░рд┐рдд рдкреЕрд░рд╛рдореАрдЯрд░ рдЕрджреНрдпрддрдирд╛рдВрд╕рд╛рдареА рд╕рдВрдмрдВрдзрд┐рдд Horovod API рд▓рд╛ рдХреЙрд▓ рдХрд░реЗрд▓. рд╣реЗ рд╕рд░реНрд╡ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рддрдкрд╢реАрд▓ рдЕрдВрддрд┐рдо рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрд╕рд╛рдареА рдкрд╛рд░рджрд░реНрд╢рдХ рдЖрд╣реЗрдд.
рдЬрд▓рдж рд╕реБрд░реБрд╡рд╛рдд
рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ MacBook рд╡рд░реАрд▓ MXNet рдЖрдгрд┐ Horovod рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди MNIST рдбреЗрдЯрд╛рд╕реЗрдЯрд╡рд░ рд▓рд╣рд╛рди рдХрдВрд╡реНрд╣реЛрд▓реНрдпреБрд╢рдирд▓ рдиреНрдпреВрд░рд▓ рдиреЗрдЯрд╡рд░реНрдХрдЪреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рддреНрд╡рд░реАрдд рд╕реБрд░реВ рдХрд░реВ рд╢рдХрддрд╛.
рдкреНрд░рдердо, PyPI рд╡рд░реВрди mxnet рдЖрдгрд┐ horovod рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛:
pip install mxnet
pip install horovod
рдЯреАрдк: рдпрд╛рджрд░рдореНрдпрд╛рди рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдЦрд╛рджреА рддреНрд░реБрдЯреА рдЖрдврд│рд▓реНрдпрд╛рд╕ pip horovod рдкреНрд░рддрд┐рд╖реНрдард╛рдкреАрддрдХрджрд╛рдЪрд┐рдд рддреБрдореНрд╣рд╛рд▓рд╛ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рдЬреЛрдбрд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ MACOSX_DEPLOYMENT_TARGET=10.vvрдХреБрдареЗ vv - рд╣реА рддреБрдордЪреНрдпрд╛ MacOS рдЖрд╡реГрддреНрддреАрдЪреА рдЖрд╡реГрддреНрддреА рдЖрд╣реЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, MacOSX Sierra рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рд▓рд┐рд╣рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ MACOSX_DEPLOYMENT_TARGET=10.12 pip install 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
рдХрд╛рдордЧрд┐рд░реА рдбреЗрдореЛ
рдЖрда рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╕рд╣ 50 GPU рд╡рд░ рдЗрдореЗрдЬрдиреЗрдЯ рдбреЗрдЯрд╛рд╕реЗрдЯрд╡рд░ ResNet1-v64 рдореЙрдбреЗрд▓рд▓рд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рджреЗрддрд╛рдирд╛ p3.16x рдореЛрдард╛ EC2, рдкреНрд░рддреНрдпреЗрдХрд╛рдордзреНрдпреЗ AWS рдХреНрд▓рд╛рдЙрдбрд╡рд░ 8 NVIDIA Tesla V100 GPUs рдЖрд╣реЗрдд, рдЖрдореНрд╣реА 45000 рдкреНрд░рддрд┐рдорд╛/рд╕реЗрдХрдВрдж (рдореНрд╣рдгрдЬреЗ, рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдирдореБрдиреНрдпрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛) рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдереНрд░реВрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗ. 44% рдЪреНрдпрд╛ рдЙрддреНрдХреГрд╖реНрдЯ рдЕрдЪреВрдХрддреЗрд╕рд╣ 90 рдпреБрдЧрд╛рдВрдирдВрддрд░ 75.7 рдорд┐рдирд┐рдЯрд╛рдВрдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреВрд░реНрдг рдЭрд╛рд▓реЗ.
рдЖрдореНрд╣реА MXNet рдЪреНрдпрд╛ 8, 16, 32 рдЖрдгрд┐ 64 GPU рд╡рд░ рдкреЕрд░рд╛рдореАрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╡рд┐рддрд░реАрдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкрджреНрдзрддреАрд╢реА рддреБрд▓рдирд╛ рдХреЗрд▓реА рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдПрдХрд▓ рдкреЕрд░рд╛рдореАрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░ рдЖрдгрд┐ 1 рддреЗ 1 рдЖрдгрд┐ 2 рддреЗ 1 рдЪреНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░ рддреЗ рд╡рд░реНрдХрд░ рдЧреБрдгреЛрддреНрддрд░ рдЖрд╣реЗ. рдЖрдкрдг рдЦрд╛рд▓реАрд▓ рдЖрдХреГрддреА 1 рдордзреНрдпреЗ рдкрд░рд┐рдгрд╛рдо рдкрд╛рд╣реВ рд╢рдХрддрд╛. рдбрд╛рд╡реАрдХрдбреАрд▓ y-рдЕрдХреНрд╖рд╛рд╡рд░, рдкрдЯреНрдЯреНрдпрд╛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдж рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд░рддрд┐рдорд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рджрд░реНрд╢рд╡рддрд╛рдд, рд░реЗрд╖рд╛ рдЙрдЬрд╡реАрдХрдбреАрд▓ y-рдЕрдХреНрд╖рд╛рд╡рд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ (рдореНрд╣рдгрдЬреЗрдЪ, рдЖрджрд░реНрд╢ рдереНрд░реБрдкреБрдЯрдЪреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреБрдгреЛрддреНрддрд░) рджрд░реНрд╢рд╡рддрд╛рдд. рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддрд╛, рд╕рд░реНрд╡реНрд╣рд░рдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдЪреА рдирд┐рд╡рдб рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддреЗрд╡рд░ рдкрд░рд┐рдгрд╛рдо рдХрд░рддреЗ. рдлрдХреНрдд рдПрдХ рдкреЕрд░рд╛рдореАрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░ рдЕрд╕рд▓реНрдпрд╛рд╕, рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ 38 GPU рд╡рд░ 64% рдкрд░реНрдпрдВрдд рдШрд╕рд░рддреЗ. Horovod рдкреНрд░рдорд╛рдгреЗрдЪ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдордЧрд╛рд░рд╛рдВрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд рд╕рд░реНрд╡реНрд╣рд░рдЪреА рд╕рдВрдЦреНрдпрд╛ рджреБрдкреНрдкрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдЖрдХреГрддреА 1. Horovod рдЖрдгрд┐ рдкреЕрд░рд╛рдореАрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░рд╕рд╣ MXNet рд╡рд╛рдкрд░реВрди рд╡рд┐рддрд░рд┐рдд рд╢рд┐рдХреНрд╖рдгрд╛рдЪреА рддреБрд▓рдирд╛
рдЦрд╛рд▓реАрд▓ рддрдХреНрддреНрдпрд╛ 1 рдордзреНрдпреЗ, рдЖрдореНрд╣реА 64 GPU рд╡рд░ рдкреНрд░рдпреЛрдЧ рдЪрд╛рд▓рд╡рддрд╛рдирд╛ рдкреНрд░рддрд┐ рдЙрджрд╛рд╣рд░рдг рдЕрдВрддрд┐рдо рдЦрд░реНрдЪрд╛рдЪреА рддреБрд▓рдирд╛ рдХрд░рддреЛ. Horovod рд╕рд╣ MXNet рд╡рд╛рдкрд░рдгреЗ рд╕рд░реНрд╡рд╛рдд рдХрдореА рдХрд┐рдорддреАрдд рд╕рд░реНрд╡реЛрддреНрддрдо рдереНрд░реВрдкреБрдЯ рдкреНрд░рджрд╛рди рдХрд░рддреЗ.
рд╕рд╛рд░рдгреА 1. 2 рддреЗ 1 рдЪреНрдпрд╛ рд╕рд░реНрд╡реНрд╣рд░ рддреЗ рдХрд╛рдордЧрд╛рд░ рдЧреБрдгреЛрддреНрддрд░рд╛рд╕рд╣ Horovod рдЖрдгрд┐ рдкреЕрд░рд╛рдореАрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░ рдпрд╛рдВрдЪреНрдпрд╛рддреАрд▓ рдЦрд░реНрдЪрд╛рдЪреА рддреБрд▓рдирд╛.
рдкреБрдирд░реБрддреНрдкрд╛рджрдирд╛рд╕рд╛рдареА рдкрд╛рдпрд▒реНрдпрд╛
рдкреБрдвреАрд▓ рдЪрд░рдгрд╛рдВрдордзреНрдпреЗ, рдЖрдореНрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ MXNet рдЖрдгрд┐ Horovod рд╡рд╛рдкрд░реВрди рд╡рд┐рддрд░рд┐рдд рдкреНрд░рд╢рд┐рдХреНрд╖рдгрд╛рдЪреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╕реЗ рдкреБрдирд░реБрддреНрдкрд╛рджрд┐рдд рдХрд░рд╛рдпрдЪреЗ рддреЗ рджрд░реНрд╢рд╡реВ. MXNet рд╕рд╣ рд╡рд┐рддрд░рд┐рдд рд╢рд┐рдХреНрд╖рдгрд╛рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рдЬрд╛рдгреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдЪрд╛
1 рдкрд╛рдКрд▓
рд╡рд┐рддрд░рд┐рдд рд╢рд┐рдХреНрд╖рдг рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА MXNet рдЖрд╡реГрддреНрддреА 1.4.0 рдХрд┐рдВрд╡рд╛ рдЙрдЪреНрдЪ рдЖрдгрд┐ Horovod рдЖрд╡реГрддреНрддреА 0.16.0 рдХрд┐рдВрд╡рд╛ рдЙрдЪреНрдЪ рд╕рд╣ рдПрдХрд╕рдВрдз рдЙрджрд╛рд╣рд░рдгрд╛рдВрдЪрд╛ рдХреНрд▓рд╕реНрдЯрд░ рддрдпрд╛рд░ рдХрд░рд╛. рддреБрдореНрд╣рд╛рд▓рд╛ GPU рдкреНрд░рд╢рд┐рдХреНрд╖рдгрд╛рд╕рд╛рдареА рд▓рд╛рдпрдмреНрд░рд░реА рджреЗрдЦреАрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реЗрд▓. рдЖрдордЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдВрд╕рд╛рдареА, рдЖрдореНрд╣реА GPU рдбреНрд░рд╛рдпрд╡реНрд╣рд░ 16.04, CUDA 396.44, cuDNN 9.2 рд▓рд╛рдпрдмреНрд░рд░реА, NCCL 7.2.1 рдХрдореНрдпреБрдирд┐рдХреЗрдЯрд░ рдЖрдгрд┐ OpenMPI 2.2.13 рд╕рд╣ рдЙрдмрдВрдЯреВ 3.1.1 рд▓рд┐рдирдХреНрд╕ рдирд┐рд╡рдбрд▓реЗ. рддрд╕реЗрдЪ рддреБрдореНрд╣реА рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛
2 рдкрд╛рдКрд▓
рддреБрдордЪреНрдпрд╛ MXNet рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреНрдпреЗ Horovod API рд╕рд╣ рдХрд╛рдо рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╛. MXNet Gluon API рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЦрд╛рд▓реАрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рд╕рд╛рдзреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореНрд╣рдгреВрди рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ. рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрд╕рд▓реНрдпрд╛рд╕ рдард│рдХ рдУрд│реА рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд. 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 рдирд┐рд░реНрджреЗрд╢ рд╡рд╛рдкрд░реВрди рд╡рд┐рддрд░рд┐рдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХрд╛рдордЧрд╛рд░рд╛рдВрдкреИрдХреА рдПрдХрд╛рдордзреНрдпреЗ рд▓реЙрдЧ рдЗрди рдХрд░рд╛. рдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдд, рд╡рд┐рддрд░рд┐рдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреНрд░рддреНрдпреЗрдХреА 4 GPU рдЖрдгрд┐ рдХреНрд▓рд╕реНрдЯрд░рдордзреНрдпреЗ рдПрдХреВрдг 16 GPU рд╕рд╣ рдЪрд╛рд░ рдШрдЯрдирд╛рдВрд╡рд░ рдЪрд╛рд▓рддреЗ. рд╕реНрдЯреЛрдХрд╛рд╕реНрдЯрд┐рдХ рдЧреНрд░реЗрдбрд┐рдпрдВрдЯ рдбрд┐рд╕реЗрдВрдЯ (SGD) рдСрдкреНрдЯрд┐рдорд╛рдпрдЭрд░ рдЦрд╛рд▓реАрд▓ рд╣рд╛рдпрдкрд░рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рд╕рд╣ рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рдИрд▓:
- рдорд┐рдиреА-рдмреЕрдЪ рдЖрдХрд╛рд░: 256
- рд╢рд┐рдХрдгреНрдпрд╛рдЪрд╛ рджрд░: 0.1
- рдЧрддреА: реж.реп
- рд╡рдЬрди рдХреНрд╖рдп: 0.0001
рдЖрдореНрд╣реА рдПрдХрд╛ GPU рд╡рд░реВрди 64 GPU рдкрд░реНрдпрдВрдд рд╕реНрдХреЗрд▓ рдХреЗрд▓реНрдпрд╛рдореБрд│реЗ, рдЖрдореНрд╣реА GPU рдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреБрд╕рд╛рд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рджрд░ рд░реЗрд╖реАрдпрд░реАрддреНрдпрд╛ рдореЛрдЬрд▓реЗ (0,1 GPU рд╕рд╛рдареА 1 рд╡рд░реВрди 6,4 GPU рд╕рд╛рдареА 64), рддрд░ рдкреНрд░рддрд┐ GPU рдкреНрд░рддрд┐рдорд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ 256 рд╡рд░ рдареЗрд╡рд▓реА ( рдЪреНрдпрд╛ рдмреЕрдЪрдордзреВрди 256 GPU рд╕рд╛рдареА 1 рдкреНрд░рддрд┐рдорд╛ рддреЗ 16 GPU рд╕рд╛рдареА 384 рдкрд░реНрдпрдВрдд). GPU рдЪреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдврд▓реНрдпрд╛рдиреЗ рд╡рдЬрди рдХреНрд╖рдп рдЖрдгрд┐ рдЧрддреА рдорд╛рдкрджрдВрдб рдмрджрд▓рд▓реЗ. NVIDIA Tesla GPU рджреНрд╡рд╛рд░реЗ рд╕рдорд░реНрдерд┐рдд рдлреНрд▓реЛрдЯ64 рдЧрдгрдирд╛рдВрдирд╛ рдЧрддреА рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рдлреЙрд░рд╡рд░реНрдб рдкрд╛рд╕рд╕рд╛рдареА 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 рдбреЗрдЯрд╛рд╕реЗрдЯрд╡рд░реАрд▓ рдкреЕрд░рд╛рдореАрдЯрд░ рд╕рд░реНрд╡реНрд╣рд░ рдкрдзреНрджрддреАрдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд рдЖрдореНрд╣реА рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЖрдгрд┐ рдЦрд░реНрдЪ-рдкреНрд░рднрд╛рд╡реАрддрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреЗрд▓реА. Horovod рд╡рд╛рдкрд░реВрди рдорд▓реНрдЯреА-рдЗрдиреНрд╕реНрдЯрдиреНрд╕ рдЯреНрд░реЗрдирд┐рдВрдЧ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣реА рд╡рд┐рджреНрдпрдорд╛рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛ рдЕрд╢рд╛ рдкрд╛рдпрд▒реНрдпрд╛ рджреЗрдЦреАрд▓ рдЖрдореНрд╣реА рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд.
рддреБрдореНрд╣реА рдиреБрдХрддреЗрдЪ MXNet рдЖрдгрд┐ рд╕рдЦреЛрд▓ рд╢рд┐рдХреНрд╖рдг рд╕реБрд░реВ рдХрд░рдд рдЕрд╕рд▓реНрдпрд╛рд╕, рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдкреЗрдЬрд╡рд░ рдЬрд╛
рдЬрд░ рддреБрдореНрд╣реА рдЖрдзреАрдЪ MXNet рд╡рд░ рдХрд╛рдо рдХреЗрд▓реЗ рдЕрд╕реЗрд▓ рдЖрдгрд┐ Horovod рд╕рд╣ рд╡рд┐рддрд░реАрдд рд╢рд┐рдХреНрд╖рдг рд╡рд╛рдкрд░реВрди рдкрд╣рд╛рдпрдЪреЗ рдЕрд╕реЗрд▓, рддрд░ рдкрд╣рд╛
*рдЦрд░реНрдЪрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЧрдгрдирд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ
рдХреЛрд░реНрд╕рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рдЬрд╛рдгреВрди рдШреНрдпрд╛
рд╕реНрддреНрд░реЛрдд: www.habr.com