ΠΡΠ΅Π²ΠΎΠ΄ΡΡ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° Π±Π΅ΡΠ΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ Π² Π½Π°Π²Π΅ΡΠ΅ΡΠΈΠ΅ΡΠΎ Π½Π° Π½Π°ΡΠ°Π»ΠΎΡΠΎ Π½Π° ΠΊΡΡΡΠ°
Π Π°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎΡΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π²ΠΈΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ·ΡΠΈΡΠ»ΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ½ΡΡΠ°Π½ΡΠΈΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΡΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΈΡΠ΅ Π΄ΡΠ»Π±ΠΎΠΊΠΈ Π½Π΅Π²ΡΠΎΠ½Π½ΠΈ ΠΌΡΠ΅ΠΆΠΈ Π²ΡΡΡ Ρ Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ ΡΠ΅Π΄ΠΌΠΈΡΠΈ Π΄ΠΎ ΡΠ°ΡΠΎΠ²Π΅ ΠΈΠ»ΠΈ Π΄ΠΎΡΠΈ ΠΌΠΈΠ½ΡΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠ°Π²ΠΈ ΡΠ°Π·ΠΈ ΡΠ΅Ρ Π½ΠΈΠΊΠ° Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅ΠΎΠ±Π»Π°Π΄Π°Π²Π°ΡΠ° Π² ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° Π΄ΡΠ»Π±ΠΎΠΊΠΎΡΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅. ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΠΊΠ°ΠΊ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΡΡ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Ρ Π΄Π°Π½Π½ΠΈ Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° ΠΈΠΌΠ° Π³ΠΎΠ»ΡΠΌΠΎ Π²Π»ΠΈΡΠ½ΠΈΠ΅ Π²ΡΡΡ Ρ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΠ° Π½Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΡΡΡΠ±Π²Π° ΡΡΡΠΎ Π΄Π° Π·Π½Π°ΡΡ ΠΊΠ°ΠΊ Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ°Ρ ΠΎΠ±ΡΡΠΈΡΠ΅Π»Π΅Π½ ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π½Π° Π΅Π΄ΠΈΠ½ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΈ.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° Π±ΡΡΠ· ΠΈ Π»Π΅ΡΠ΅Π½ Π½Π°ΡΠΈΠ½ Π·Π° ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΎΡΠ²ΠΎΡΠ΅Π½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° Π΄ΡΠ»Π±ΠΎΠΊΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Apache MXNet ΠΈ ΡΠ°ΠΌΠΊΠ°ΡΠ° Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Horovod. Π©Π΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°ΠΌΠ΅ ΡΡΠ½ΠΎ ΠΏΠΎΠ»Π·ΠΈΡΠ΅ ΠΎΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΡΠ°ΠΌΠΊΠ°ΡΠ° Horovod ΠΈ ΡΠ΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠΊΡΠΈΠΏΡ Π·Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° MXNet, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΠΏΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π½Π°ΡΠΈΠ½ Ρ Horovod.
ΠΠ°ΠΊΠ²ΠΎ Π΅ Apache MXNet
Π Π°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π² MXNet ΡΡΡ ΡΡΡΠ²ΡΡ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ
ΠΠ°ΠΊΠ²ΠΎ Π΅ Horovod
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π½Π° MXNet ΠΈ Horovod
MXNet ΡΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ° Ρ Horovod ΡΡΠ΅Π· API Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅, Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π² Horovod. API Π·Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ Π½Π° Horovod horovod.broadcast(), Ρ ΠΎΡΠΎΠ²ΠΎΠ΄.allgather() ΠΈ Ρ ΠΎΡΠΎΠ²ΠΎΠ΄.allreduce() ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ MXNet, ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° Π³ΡΠ°ΡΠΈΠΊΠ° Π½Π° Π·Π°Π΄Π°ΡΠΈΡΠ΅. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡ ΠΈ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Ρ Π»Π΅ΡΠ½ΠΎ ΠΎΡ MXNet Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ, Π·Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π°Ρ Π·Π°Π³ΡΠ±ΠΈ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ. ΠΠ±Π΅ΠΊΡ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡ, Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ Π² Horovod Ρ ΠΎΡΠΎΠ²ΠΎΠ΄.DistributedOptimizer ΡΠ°Π·ΡΠΈΡΡΠ²Π° ΡΠ΅ Optimizer Π² MXNet, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΠ΅ API Π½Π° Horovod Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ. ΠΡΠΈΡΠΊΠΈ ΡΠ΅Π·ΠΈ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ ΡΠ° ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΈ Π·Π° ΠΊΡΠ°ΠΉΠ½ΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ.
ΠΡΡΠ· ΡΡΠ°ΡΡ
ΠΠΎΠΆΠ΅ΡΠ΅ Π±ΡΡΠ·ΠΎ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° ΠΎΠ±ΡΡΠ°Π²Π°ΡΠ΅ ΠΌΠ°Π»ΠΊΠ° ΠΊΠΎΠ½Π²ΠΎΠ»ΡΡΠΈΠΎΠ½Π½Π° Π½Π΅Π²ΡΠΎΠ½Π½Π° ΠΌΡΠ΅ΠΆΠ° Π²ΡΡΡ
Ρ Π½Π°Π±ΠΎΡΠ° ΠΎΡ Π΄Π°Π½Π½ΠΈ MNIST, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ MXNet ΠΈ Horovod Π½Π° Π²Π°ΡΠΈΡ MacBook.
ΠΡΡΠ²ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ mxnet ΠΈ horovod ΠΎΡ PyPI:
pip install mxnet
pip install horovod
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°: ΠΠΊΠΎ ΡΡΠ΅ΡΠ½Π΅ΡΠ΅ Π³ΡΠ΅ΡΠΊΠ° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° pip ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Ρ ΠΎΡΠΎΠ²ΠΎΠ΄ΠΌΠΎΠΆΠ΅ Π±ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° MACOSX_DEPLOYMENT_TARGET=10.vvΠΡΠ΄Π΅ΡΠΎ vv β ΡΠΎΠ²Π° Π΅ Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° Π²Π°ΡΠ°ΡΠ° MacOS Π²Π΅ΡΡΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° MacOSX Sierra ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ MACOSX_DEPLOYMENT_TARGET=10.12 ΠΏΠΈΠΏΡΠ° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΠΎΠ½Π΅Π½ Ρ ΠΎΡΠΎΠ²ΠΎΠ΄
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ 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 Π² AWS ΠΎΠ±Π»Π°ΠΊ, ΠΏΠΎΡΡΠΈΠ³Π½Π°Ρ ΠΌΠ΅ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΠ΅Π»Π½Π° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ Π·Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΡ 45000 44 ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ/ΡΠ΅ΠΊ (Ρ.Π΅. Π±ΡΠΎΡ Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΡΠ΅ ΠΏΡΠΎΠ±ΠΈ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°). ΠΠ±ΡΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ Π·Π°Π²ΡΡΡΠ΅Π½ΠΎ Π·Π° 90 ΠΌΠΈΠ½ΡΡΠΈ ΡΠ»Π΅Π΄ 75.7 Π΅ΠΏΠΎΡ ΠΈ Ρ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ° ΡΠΎΡΠ½ΠΎΡΡ ΠΎΡ XNUMX%.
Π‘ΡΠ°Π²Π½ΠΈΡ ΠΌΠ΅ ΡΠΎΠ²Π° Ρ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° MXNet Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡΠΈ Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π½Π° 8, 16, 32 ΠΈ 64 GPU Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ΅Π½ ΡΡΡΠ²ΡΡ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ ΡΡΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΡΡΡΠ²ΡΡ ΠΊΡΠΌ ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ 1 ΠΊΡΠΌ 1 ΠΈ 2 ΠΊΡΠΌ 1. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° Π½Π° ΡΠΈΠ³ΡΡΠ° 1 ΠΏΠΎ-Π΄ΠΎΠ»Ρ. ΠΠ° ΠΎΡΡΠ° y Π²Π»ΡΠ²ΠΎ Π»Π΅Π½ΡΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π°Ρ Π±ΡΠΎΡ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡΠ° Π·Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Π² ΡΠ΅ΠΊΡΠ½Π΄Π°, Π»ΠΈΠ½ΠΈΠΈΡΠ΅ ΠΎΡΡΠ°Π·ΡΠ²Π°Ρ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΠ° Π½Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ (Ρ.Π΅. ΡΡΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»Π½Π°ΡΠ° ΠΊΡΠΌ ΠΈΠ΄Π΅Π°Π»Π½Π°ΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ) Π½Π° ΠΎΡΡΠ° y Π²Π΄ΡΡΠ½ΠΎ. ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, ΠΈΠ·Π±ΠΎΡΡΡ Π½Π° Π±ΡΠΎΠΉ ΡΡΡΠ²ΡΡΠΈ Π²Π»ΠΈΡΠ΅ Π²ΡΡΡ Ρ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΠ° Π½Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅. ΠΠΊΠΎ ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΡΡΡΠ²ΡΡ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ, Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΠ° Π½Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅ ΠΏΠ°Π΄Π° Π΄ΠΎ 38% Π½Π° 64 GPU. ΠΠ° Π΄Π° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΡΠ΅ ΡΡΡΠ°ΡΠ° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡ Π½Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Π½Π΅, ΠΊΠ°ΠΊΡΠΎ ΠΏΡΠΈ Horovod, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΄Π²ΠΎΠΈΡΠ΅ Π±ΡΠΎΡ Π½Π° ΡΡΡΠ²ΡΡΠΈΡΠ΅ ΡΠΏΡΡΠΌΠΎ Π±ΡΠΎΡ Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈΡΠ΅.
Π€ΠΈΠ³ΡΡΠ° 1. Π‘ΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° MXNet Ρ Horovod ΠΈ ΡΡΡ ΡΡΡΠ²ΡΡ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ
Π ΡΠ°Π±Π»ΠΈΡΠ° 1 ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΡΡΠ°Π²Π½ΡΠ²Π°ΠΌΠ΅ ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠ΅Π½Π° Π½Π° ΠΈΠ½ΡΡΠ°Π½ΡΠΈΡ ΠΏΡΠΈ ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ Π½Π° 64 GPU. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° 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 Π΄ΡΠ°ΠΉΠ²Π΅Ρ 396.44, CUDA 9.2, Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° cuDNN 7.2.1, ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΎΡ NCCL 2.2.13 ΠΈ OpenMPI 3.1.1. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅
Π‘ΡΡΠΏΠΊΠ° 2
ΠΠΎΠ±Π°Π²Π΅ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Horovod API ΠΊΡΠΌ Π²Π°ΡΠΈΡ ΡΠΊΡΠΈΠΏΡ Π·Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ MXNet. Π‘ΠΊΡΠΈΠΏΡΡΡ ΠΏΠΎ-Π΄ΠΎΠ»Ρ, Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° MXNet Gluon API, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΠ°ΡΠΎ ΠΏΡΠΎΡΡ ΡΠ°Π±Π»ΠΎΠ½. Π Π΅Π΄ΠΎΠ²Π΅ΡΠ΅ Ρ ΡΠ΄Π΅Π±Π΅Π»Π΅Π½ ΡΡΠΈΡΡ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ, Π°ΠΊΠΎ Π²Π΅ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΡΡΠΎΡΠ²Π΅ΡΠ΅Π½ ΡΠΊΡΠΈΠΏΡ Π·Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅. ΠΡΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΊΡΠΈΡΠΈΡΠ½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅, Π·Π° Π΄Π° Π½Π°ΡΡΠΈΡΠ΅ Ρ Horovod:
- ΠΠ°Π΄Π°ΠΉΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΡΠΏΠΎΡΠ΅Π΄ ΠΌΠ΅ΡΡΠ½ΠΈΡ ΡΠ°Π½Π³ Π½Π° 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 Π³ΡΠ°ΡΠΈΡΠ½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ° Π²ΡΠ΅ΠΊΠΈ ΠΈ ΠΎΠ±ΡΠΎ 16 Π³ΡΠ°ΡΠΈΡΠ½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ° Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ°. ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡΡΡ Π·Π° ΡΡΠΎΡ Π°ΡΡΠΈΡΠ΅Π½ Π³ΡΠ°Π΄ΠΈΠ΅Π½Ρ (SGD) ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΡ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Ρ ΠΈΠΏΠ΅ΡΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ:
- ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΠΌΠΈΠ½ΠΈΠΏΠ°ΡΡΠΈΠ΄Π°: 256
- ΡΠΊΠΎΡΠΎΡΡ Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅: 0.1
- ΠΈΠΌΠΏΡΠ»Ρ: 0.9
- Π·Π°Π³ΡΠ±Π° Π½Π° ΡΠ΅Π³Π»ΠΎ: 0.0001
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Ρ ΠΌΠ΅ ΠΎΡ Π΅Π΄ΠΈΠ½ Π³ΡΠ°ΡΠΈΡΠ΅Π½ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π΄ΠΎ 64 Π³ΡΠ°ΡΠΈΡΠ½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°, Π½ΠΈΠ΅ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ ΠΌΠ°ΡΠ°Π±ΠΈΡΠ°Ρ ΠΌΠ΅ ΡΠΊΠΎΡΠΎΡΡΡΠ° Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΎΡΠ΅Π΄ Π±ΡΠΎΡ Π½Π° Π³ΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ (ΠΎΡ 0,1 Π·Π° 1 Π³ΡΠ°ΡΠΈΡΠ΅Π½ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π΄ΠΎ 6,4 Π·Π° 64 Π³ΡΠ°ΡΠΈΡΠ½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ°), ΠΊΠ°ΡΠΎ Π·Π°ΠΏΠ°Π·ΠΈΡ ΠΌΠ΅ Π±ΡΠΎΡ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡΠ° Π½Π° Π³ΡΠ°ΡΠΈΡΠ΅Π½ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° 256 (ΠΎΡ ΠΏΠ°ΡΡΠΈΠ΄Π° ΠΎΡ 256 ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π·Π° 1 GPU Π΄ΠΎ 16 384 Π·Π° 64 GPU). ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° Π·Π°ΡΠΈΡ Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅Π³Π»ΠΎΡΠΎ ΠΈ ΠΈΠΌΠΏΡΠ»ΡΠ° ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡ Π° Ρ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π±ΡΠΎΡ Π½Π° Π³ΡΠ°ΡΠΈΡΠ½ΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΎ ΠΏΡΠ΅ΡΠΈΠ·Π½ΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ Ρ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΠΈ float16 Π·Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ Π½Π°ΠΏΡΠ΅Π΄ ΠΈ float32 Π·Π° Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΈ, Π·Π° Π΄Π° ΡΡΠΊΠΎΡΠΈΠΌ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡΡΠ° float16, ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ ΠΎΡ GPU Π½Π° NVIDIA Tesla.
$ 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