ΠΡΠ΅Π²ΠΎΠ΄ΠΎΡ Π½Π° ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ Π²ΠΎ ΠΏΡΠ΅ΡΡΠ΅Ρ Π½Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ Π½Π° ΠΊΡΡΡΠΎΡ
ΠΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½Π°ΡΠ° ΠΎΠ±ΡΠΊΠ° Π·Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΡΠΊΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈ ΡΠΎ Π²ΠΈΡΠΎΠΊΠΈ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ°Π»ΠΈ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΎΠ±ΡΠΊΠ° Π½Π° ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΡΠ΅ Π΄Π»Π°Π±ΠΎΠΊΠΈ Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠΈ ΠΌΡΠ΅ΠΆΠΈ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΊΠΎΠ»ΠΈΡΠΈΠ½ΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ Π½Π΅Π΄Π΅Π»ΠΈ Π½Π° ΡΠ°ΡΠΎΠ²ΠΈ ΠΈΠ»ΠΈ Π΄ΡΡΠΈ ΠΌΠΈΠ½ΡΡΠΈ, ΡΡΠΎ ΡΠ° ΠΏΡΠ°Π²ΠΈ ΠΎΠ²Π°Π° ΡΠ΅Ρ Π½ΠΈΠΊΠ° Π·Π° ΠΎΠ±ΡΠΊΠ° ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅ΡΠ° Π²ΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ½ΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈ Π½Π° Π΄Π»Π°Π±ΠΎΠΊΠΎΡΠΎ ΡΡΠ΅ΡΠ΅. ΠΠΎΡΠΈΡΠ½ΠΈΡΠΈΡΠ΅ ΠΌΠΎΡΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°Ρ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΡΠ²Π°Π°Ρ ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠ°Π°Ρ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½ΠΈΠ· ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈ, ΡΡΠΎ ΠΏΠ°ΠΊ ΠΈΠΌΠ° Π³ΠΎΠ»Π΅ΠΌΠΎ Π²Π»ΠΈΡΠ°Π½ΠΈΠ΅ Π²ΡΠ· Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎΡΡΠ° Π½Π° ΡΠΊΠ°Π»ΠΈΡΠ°ΡΠ΅. ΠΠΎΠΊΡΠ°Ρ ΡΠΎΠ°, ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈΡΠ΅ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΡΡΠ΅Π±Π° Π΄Π° Π·Π½Π°Π°Ρ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠ°ΡΠΏΠΎΡΠ΅Π΄Π°Ρ ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΎΠ±ΡΠΊΠ° ΡΡΠΎ ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π΅Π΄Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈ.
ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ Π·Π±ΠΎΡΡΠ²Π°ΠΌΠ΅ Π·Π° Π±ΡΠ· ΠΈ Π»Π΅ΡΠ΅Π½ Π½Π°ΡΠΈΠ½ Π·Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΡΡΠ΅ΡΠ΅ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΠΎΡΠ²ΠΎΡΠ΅Π½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° Π΄Π»Π°Π±ΠΎΠΊΠΎ ΡΡΠ΅ΡΠ΅ Apache MXNet ΠΈ ΡΠ°ΠΌΠΊΠ°ΡΠ° Π·Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½Π° ΡΡΠ΅ΡΠ΅ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄. ΠΠ°ΡΠ½ΠΎ ΡΠ΅ Π³ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΠΏΡΠΈΠ΄ΠΎΠ±ΠΈΠ²ΠΊΠΈΡΠ΅ ΠΎΠ΄ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅ Π½Π° ΡΠ°ΠΌΠΊΠ°ΡΠ° Π½Π° Π₯ΠΎΡΠΎΠ²ΠΎΠ΄ ΠΈ ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΎΠ±ΡΠΊΠ° Π½Π° MXNet Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ Π½Π°ΡΠΈΠ½ ΡΠΎ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄.
Π¨ΡΠΎ Π΅ Apache MXNet
Π΅ ΡΠ°ΠΌΠΊΠ° Π·Π° Π΄Π»Π°Π±ΠΎΠΊΠΎ ΡΡΠ΅ΡΠ΅ ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ ΡΡΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ Π·Π° ΡΠΎΠ·Π΄Π°Π²Π°ΡΠ΅, ΠΎΠ±ΡΠΊΠ° ΠΈ ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° Π΄Π»Π°Π±ΠΎΠΊΠΈ Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠΈ ΠΌΡΠ΅ΠΆΠΈ. MXNet ΡΠ° Π°ΠΏΡΡΡΠ°Ρ ΠΈΡΠ° ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½ΠΎΡΡΠ° ΠΏΠΎΠ²ΡΠ·Π°Π½Π° ΡΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠΈ ΠΌΡΠ΅ΠΆΠΈ, Π΅ Π²ΠΈΡΠΎΠΊΠΎ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠ½Π° ΠΈ ΡΠΊΠ°Π»Π°Π±ΠΈΠ»Π½Π° ΠΈ Π½ΡΠ΄ΠΈ API Π·Π° ΠΏΠΎΠΏΡΠ»Π°ΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΈ ΡΠ°Π·ΠΈΡΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ , , , , , , ΠΈ Π΄ΡΡΠ³ΠΈ.
ΠΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½Π° ΠΎΠ±ΡΠΊΠ° Π²ΠΎ MXNet ΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°ΡΡΠΊΠΈ ΡΠ΅ΡΠ²Π΅Ρ
ΠΊΠΎΡΠΈΡΡΠΈ ΠΏΡΠΈΡΡΠ°ΠΏ Π½Π° ΡΠ΅ΡΠ²Π΅Ρ ΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ. ΠΠΎΡΠΈΡΡΠΈ Π·Π±ΠΈΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΈ Π·Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° ΡΠΎΠ±ΠΈΡΠ°ΡΠ΅ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΈ ΠΎΠ΄ ΡΠ΅ΠΊΠΎΡ ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊ, Π·Π° Π°Π³ΡΠ΅Π³Π°ΡΠΈΡΠ° ΠΈ Π·Π° ΠΈΡΠΏΡΠ°ΡΠ°ΡΠ΅ Π°ΠΆΡΡΠΈΡΠ°Π½ΠΈ Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΈ Π½Π°Π·Π°Π΄ Π΄ΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈΡΠ΅ Π·Π° ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠ°. Π£ΡΠ²ΡΠ΄ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈΠΎΡ ΡΠΎΠΎΠ΄Π½ΠΎΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΈΡΠ΅ ΠΈ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈΡΠ΅ Π΅ ΠΊΠ»ΡΡΠΎΡ Π·Π° Π΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΠΊΠ°Π»ΠΈΡΠ°ΡΠ΅. ΠΠΊΠΎ ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ Π΅Π΄Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°ΡΡΠΊΠΈ ΡΠ΅ΡΠ²Π΅Ρ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΡΠΏΠ°Π΄Π½Π΅ Π΄Π΅ΠΊΠ° Π΅ ΡΠ΅ΡΠ½ΠΎ Π³ΡΠ»ΠΎ Π²ΠΎ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈΡΠ΅. Π‘ΠΏΡΠΎΡΠΈΠ²Π½ΠΎ Π½Π° ΡΠΎΠ°, Π°ΠΊΠΎ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ ΠΏΡΠ΅ΠΌΠ½ΠΎΠ³Ρ ΡΠ΅ΡΠ²Π΅ΡΠΈ, ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΠΎΠ΄ ΠΌΠ½ΠΎΠ³Ρ Π΄ΠΎ ΠΌΠ½ΠΎΠ³Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° Π³ΠΈ Π·Π°Π³Π»Π°Π²ΠΈ ΡΠΈΡΠ΅ ΠΌΡΠ΅ΠΆΠ½ΠΈ Π²ΡΡΠΊΠΈ.
Π¨ΡΠΎ Π΅ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄
Π΅ ΠΎΡΠ²ΠΎΡΠ΅Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½Π° ΡΠ°ΠΌΠΊΠ° Π·Π° Π΄Π»Π°Π±ΠΎΠΊΠΎ ΡΡΠ΅ΡΠ΅ ΡΠ°Π·Π²ΠΈΠ΅Π½Π° Π²ΠΎ Uber. ΠΡΠΊΠΎΡΠΈΡΡΡΠ²Π° Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΌΠ΅ΡΡ Π³ΡΠ°ΡΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ ΠΈ Π²ΠΊΡΡΡΠ΅Π½ΠΈ ΡΠ°Π·Π»ΠΈ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ ΠΊΠΎΠ»Π΅ΠΊΡΠΈΠ²Π½Π°ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΈ Π½Π° NVIDIA (NCCL) ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡΠΎΡ Π·Π° ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°ΡΠ΅ ΠΏΠΎΡΠ°ΠΊΠΈ (MPI) Π·Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΠ° ΠΈ ΡΠΎΠ±ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΎΡ Π½ΠΈΠ· Π²ΠΎΡΠ΅ΡΠΈΡΠ΅. ΠΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ° ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° ΠΏΡΠΎΠΏΡΡΠ½ΠΈΠΎΡ ΠΎΠΏΡΠ΅Π³ Π½Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° ΠΈ Π΄ΠΎΠ±ΡΠΎ ΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΡΠ²Π° ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° ΡΠΎ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π° Π΄Π»Π°Π±ΠΎΠΊΠΈ Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠΈ ΠΌΡΠ΅ΠΆΠΈ. ΠΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠΎΠ΄Π΄ΡΠΆΡΠ²Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΏΠΎΠΏΡΠ»Π°ΡΠ½ΠΈ ΡΠ°ΠΌΠΊΠΈ Π·Π° ΠΌΠ°ΡΠΈΠ½ΡΠΊΠΎ ΡΡΠ΅ΡΠ΅, ΠΈΠΌΠ΅Π½ΠΎ , Tensorflow, Keras ΠΈ PyTorch.
MXNet ΠΈ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΠ°
MXNet ΡΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ° ΡΠΎ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄ ΠΏΡΠ΅ΠΊΡ API-ΡΠΎ Π·Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ΠΎ ΡΡΠ΅ΡΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ΠΈ Π²ΠΎ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄. Π₯ΠΎΡΠΎΠ²ΠΎΠ΄ ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡΠΊΠΈ API horovod.broadcast(), horovod.allgather() ΠΈ horovod.allreduce() ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°Π½ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Π°ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈ ΠΏΠΎΠ²ΡΠ°ΡΠ½ΠΈ ΠΏΠΎΠ²ΠΈΡΠΈ Π½Π° ΠΌΠΎΡΠΎΡΠΎΡ MXNet, ΠΊΠ°ΠΊΠΎ Π΄Π΅Π» ΠΎΠ΄ Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ Π³ΡΠ°ΡΠΈΠΊΠΎΠ½ Π·Π° Π·Π°Π΄Π°ΡΠΈ. ΠΠ° ΠΎΠ²ΠΎΡ Π½Π°ΡΠΈΠ½, Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈΡΠ΅ ΠΎΠ΄ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΌΠ΅ΡΡ ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° ΠΈ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈΡΠ΅ Π»Π΅ΡΠ½ΠΎ ΡΠ΅ ΡΠΏΡΠ°Π²ΡΠ²Π°Π°Ρ ΡΠΎ ΠΌΠΎΡΠΎΡΠΎΡ MXNet Π·Π° Π΄Π° ΡΠ΅ ΠΈΠ·Π±Π΅Π³Π½Π°Ρ Π·Π°Π³ΡΠ±ΠΈΡΠ΅ Π½Π° ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅ ΠΏΠΎΡΠ°Π΄ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡΠ°ΡΠ°. ΠΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°Π½ Π²ΠΎ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄ horovod.DistributedOptimizer ΡΠ΅ ΠΏΡΠΎΡΠΈΡΡΠ²Π° ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡ Π²ΠΎ MXNet, ΡΠ°ΠΊΠ° ΡΡΠΎ Π³ΠΈ ΠΏΠΎΠ²ΠΈΠΊΡΠ²Π° ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΈΡΠ΅ Horovod API Π·Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ΠΈ Π°ΠΆΡΡΠΈΡΠ°ΡΠ° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ. Π‘ΠΈΡΠ΅ ΠΎΠ²ΠΈΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ Π·Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΡΡΠ°Π½ΡΠΏΠ°ΡΠ΅Π½ΡΠ½ΠΈ Π·Π° ΠΊΡΠ°ΡΠ½ΠΈΡΠ΅ ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΈ.
ΠΡΠ· ΠΏΠΎΡΠ΅ΡΠΎΠΊ
ΠΠΎΠΆΠ΅ΡΠ΅ Π±ΡΠ·ΠΎ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° ΡΡΠ΅Π½ΠΈΡΠ°ΡΠ΅ ΠΌΠ°Π»Π° ΠΊΠΎΠ½Π²ΠΎΠ»ΡΡΠΈΠ²Π½Π° Π½Π΅Π²ΡΠΎΠ½ΡΠΊΠ° ΠΌΡΠ΅ΠΆΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° MNIST ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ MXNet ΠΈ Horovod Π½Π° Π²Π°ΡΠΈΠΎΡ MacBook.
ΠΡΠ²ΠΎ, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΡΠ΅ mxnet ΠΈ horovod ΠΎΠ΄ PyPI:
pip install mxnet
pip install horovodΠΠ°Π±Π΅Π»Π΅ΡΠΊΠ°: ΠΠΎΠΊΠΎΠ»ΠΊΡ Π½Π°ΠΈΠ΄Π΅ΡΠ΅ Π½Π° Π³ΡΠ΅ΡΠΊΠ° Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° pip install horovodΠΌΠΎΠΆΠ΅Π±ΠΈ ΡΡΠ΅Π±Π° Π΄Π° Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° MACOSX_DEPLOYMENT_TARGET=10.vvΠΊΠ°Π΄Π΅ vv β ΠΎΠ²Π° Π΅ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° Π½Π° Π²Π°ΡΠ°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° MacOS, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° MacOSX Sierra ΡΠ΅ ΡΡΠ΅Π±Π° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ MACOSX_DEPLOYMENT_TARGET=10.12 ΠΏΠΈΠΏ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ° horovod
ΠΠΎΡΠΎΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΡΠ΅ OpenMPI .
ΠΠ° ΠΊΡΠ°ΡΠΎΡ, ΠΏΡΠ΅Π·Π΅ΠΌΠ΅ΡΠ΅ ΡΠ° ΡΠ΅ΡΡ ΡΠΊΡΠΈΠΏΡΠ°ΡΠ° mxnet_mnist.py ΠΈ ΠΈΠ·Π²ΡΡΠ΅ΡΠ΅ Π³ΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π²ΠΎ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»ΠΎΡ MacBook Π²ΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΈΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ:
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 Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ ΡΠΎ ΠΎΡΡΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈ ΡΡΡ3.16xΠ³ΠΎΠ»Π΅ΠΌ EC2, ΡΠ΅ΠΊΠΎΡ ΠΎΠ΄ Π½ΠΈΠ² ΡΠΎΠ΄ΡΠΆΠΈ 8 Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ NVIDIA Tesla V100 Π½Π° ΠΎΠ±Π»Π°ΠΊΠΎΡ AWS, ΠΏΠΎΡΡΠΈΠ³Π½Π°Π²ΠΌΠ΅ ΠΏΡΠΎΡΠΎΠΊ Π½Π° ΠΎΠ±ΡΠΊΠ° ΠΎΠ΄ 45000 ΡΠ»ΠΈΠΊΠΈ/ΡΠ΅ΠΊ (Ρ.Π΅. Π±ΡΠΎΡ Π½Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡΠΈ Π²ΠΎ ΡΠ΅ΠΊΡΠ½Π΄Π°). Π’ΡΠ΅Π½ΠΈΠ½Π³ΠΎΡ Π·Π°Π²ΡΡΠΈ Π·Π° 44 ΠΌΠΈΠ½ΡΡΠΈ ΠΏΠΎ 90 Π΅ΠΏΠΎΡ ΠΈ ΡΠΎ Π½Π°ΡΠ΄ΠΎΠ±ΡΠ° ΠΏΡΠ΅ΡΠΈΠ·Π½ΠΎΡΡ ΠΎΠ΄ 75.7%.
ΠΠΈΠ΅ Π³ΠΎ ΡΠΏΠΎΡΠ΅Π΄ΠΈΠ²ΠΌΠ΅ ΠΎΠ²Π° ΡΠΎ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ΠΈΠΎΡ ΠΏΡΠΈΡΡΠ°ΠΏ Π·Π° ΠΎΠ±ΡΠΊΠ° Π½Π° MXNet Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΈ ΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π½Π° 8, 16, 32 ΠΈ 64 Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ ΡΠΎ Π΅Π΄Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°ΡΡΠΊΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΠΈ ΠΎΠ΄Π½ΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΎ ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊ ΠΎΠ΄ 1 Π΄ΠΎ 1 ΠΈ 2 ΡΠΏΡΠ΅ΠΌΠ° 1, ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½ΠΎ. Π Π΅Π·ΡΠ»ΡΠ°ΡΠΎΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡΠ΅ Π½Π° Π‘Π»ΠΈΠΊΠ° 1 ΠΏΠΎΠ΄ΠΎΠ»Ρ. ΠΠ° y-ΠΎΡΠΊΠ°ΡΠ° Π»Π΅Π²ΠΎ, Π»Π΅Π½ΡΠΈΡΠ΅ Π³ΠΎ ΠΏΡΠ΅ΡΡΡΠ°Π²ΡΠ²Π°Π°Ρ Π±ΡΠΎΡΠΎΡ Π½Π° ΡΠ»ΠΈΠΊΠΈ ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΎΠ±ΡΡΡΠ²Π°Π°Ρ Π²ΠΎ ΡΠ΅ΠΊΡΠ½Π΄Π°, Π»ΠΈΠ½ΠΈΠΈΡΠ΅ ΡΠ° ΡΠ΅ΡΠ»Π΅ΠΊΡΠΈΡΠ°Π°Ρ Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎΡΡΠ° Π½Π° ΡΠΊΠ°Π»ΠΈΡΠ°ΡΠ΅ (Ρ.Π΅. ΠΎΠ΄Π½ΠΎΡΠΎΡ Π½Π° Π²ΠΈΡΡΠΈΠ½ΡΠΊΠ°ΡΠ° ΠΈ ΠΈΠ΄Π΅Π°Π»Π½Π°ΡΠ° ΠΏΡΠΎΠΏΡΡΠ½ΠΎΡΡ) Π½Π° y-ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π΄Π΅ΡΠ½Π°ΡΠ° ΡΡΡΠ°Π½Π°. ΠΠ°ΠΊΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, ΠΈΠ·Π±ΠΎΡΠΎΡ Π½Π° Π±ΡΠΎΡΠΎΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΈ Π²Π»ΠΈΡΠ°Π΅ Π½Π° Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎΡΡΠ° Π½Π° ΡΠΊΠ°Π»ΠΈΡΠ°ΡΠ΅. ΠΠΊΠΎ ΠΈΠΌΠ° ΡΠ°ΠΌΠΎ Π΅Π΄Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°ΡΡΠΊΠΈ ΡΠ΅ΡΠ²Π΅Ρ, Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎΡΡΠ° Π½Π° ΡΠΊΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΠ°ΡΠ° Π½Π° 38% Π½Π° 64 Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ. ΠΠ° Π΄Π° ΡΠ° ΠΏΠΎΡΡΠΈΠ³Π½Π΅ΡΠ΅ ΠΈΡΡΠ°ΡΠ° Π΅ΡΠΈΠΊΠ°ΡΠ½ΠΎΡΡ Π½Π° ΡΠΊΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΊΠ°ΠΊΠΎ ΠΊΠ°Ρ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄, ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΎ ΡΠ΄Π²ΠΎΠΈΡΠ΅ Π±ΡΠΎΡΠΎΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠΈ Π²ΠΎ ΠΎΠ΄Π½ΠΎΡ Π½Π° Π±ΡΠΎΡΠΎΡ Π½Π° ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈ.

Π‘Π»ΠΈΠΊΠ° 1. Π‘ΠΏΠΎΡΠ΅Π΄Π±Π° Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ΠΎΡΠΎ ΡΡΠ΅ΡΠ΅ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° MXNet ΡΠΎ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄ ΠΈ ΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΠ°ΡΡΠΊΠΈ ΡΠ΅ΡΠ²Π΅Ρ
ΠΠΎ Π’Π°Π±Π΅Π»Π° 1 ΠΏΠΎΠ΄ΠΎΠ»Ρ, ΡΠ° ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΠΌΠ΅ ΠΊΠΎΠ½Π΅ΡΠ½Π°ΡΠ° ΡΠ΅Π½Π° ΠΏΠΎ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈ ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ Π½Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈ Π½Π° 64 Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ. ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ΡΠΎ Π½Π° MXNet ΡΠΎ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° Π½Π°ΡΠ΄ΠΎΠ±ΡΠ° ΠΏΡΠΎΠΏΡΡΠ½ΠΎΡΡ ΠΏΠΎ Π½Π°ΡΠ½ΠΈΡΠΊΠ° ΡΠ΅Π½Π°.

Π’Π°Π±Π΅Π»Π° 1. Π‘ΠΏΠΎΡΠ΅Π΄Π±Π° Π½Π° ΡΡΠΎΡΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΌΠ΅ΡΡ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄ ΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΡΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΡΠΎ ΠΎΠ΄Π½ΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ/ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊ ΠΎΠ΄ 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, ΠΊΠΎΠΌΠΌΡΠ½ΠΈΠΊΠ°ΡΠΎΡ NCCL 2.2.13 ΠΈ OpenMPI 3.1.1. Π’Π°ΠΊΠΆΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ , ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΠΎΠ²ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΡΠ΅ Π²Π΅ΡΠ΅ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ.
Π§Π΅ΠΊΠΎΡ 2
ΠΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΡΠ° ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ Horovod API Π½Π° Π²Π°ΡΠ°ΡΠ° ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΎΠ±ΡΠΊΠ° MXNet. Π‘ΠΊΡΠΈΠΏΡΠ°ΡΠ° ΠΏΠΎΠ΄ΠΎΠ»Ρ Π·Π°ΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° MXNet Gluon API ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠΈ ΠΊΠ°ΠΊΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π΅Π½ ΠΎΠ±ΡΠ°Π·Π΅Ρ. ΠΠΈΠ½ΠΈΠΈΡΠ΅ ΡΠΎ Π·Π°Π΄Π΅Π±Π΅Π»Π΅Π½ΠΈ Π±ΡΠΊΠ²ΠΈ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π°ΠΊΠΎ Π²Π΅ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ ΡΠΎΠΎΠ΄Π²Π΅ΡΠ½Π° ΡΠΊΡΠΈΠΏΡΠ° Π·Π° ΠΎΠ±ΡΠΊΠ°. ΠΠ²Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΊΡΠΈΡΠΈΡΠ½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ ΡΡΠΎ ΡΡΠ΅Π±Π° Π΄Π° Π³ΠΈ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π·Π° Π΄Π° Π½Π°ΡΡΠΈΡΠ΅ ΡΠΎ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄:
- ΠΠΎΡΡΠ°Π²Π΅ΡΠ΅ Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠΎΡ ΡΠΏΠΎΡΠ΅Π΄ Π»ΠΎΠΊΠ°Π»Π½ΠΈΠΎΡ ΡΠ°Π½Π³ Π½Π° Π₯ΠΎΡΠΎΠ²ΠΎΠ΄ (Π»ΠΈΠ½ΠΈΡΠ° 8) Π·Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ Π΄Π΅ΠΊΠ° ΠΎΠ±ΡΠΊΠ°ΡΠ° ΡΠ΅ ΠΈΠ·Π²Π΅Π΄ΡΠ²Π° Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ Π³ΡΠ°ΡΠΈΡΠΊΠΎ ΡΠ°Π΄ΡΠΎ.
- ΠΡΠ΅Π½Π΅ΡΠ΅ΡΠ΅ Π³ΠΈ ΠΏΠΎΡΠ΅ΡΠ½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΎΠ΄ Π΅Π΄Π΅Π½ ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊ Π½Π° ΡΠΈΡΠ΅ (Π»ΠΈΠ½ΠΈΡΠ° 18) Π·Π° Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠ°ΡΠ΅ Π΄Π΅ΠΊΠ° ΡΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈ ΠΏΠΎΡΠ½ΡΠ²Π°Π°Ρ ΡΠΎ ΠΈΡΡΠΈΡΠ΅ ΠΏΠΎΡΠ΅ΡΠ½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ.
- ΠΠ°ΠΏΡΠ°Π²Π΅ΡΠ΅ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄ 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 Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π΄ΠΎ 16 Π·Π° 384 Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ). ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π·Π° ΡΠ°ΡΠΏΠ°ΡΠ°ΡΠ΅ Π½Π° ΡΠ΅ΠΆΠΈΠ½Π°ΡΠ° ΠΈ ΠΌΠΎΠΌΠ΅Π½ΡΡΠΌΠΎΡ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ° ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ Π·Π³ΠΎΠ»Π΅ΠΌΡΠ²Π°ΡΠ΅ Π±ΡΠΎΡΠΎΡ Π½Π° Π³ΡΠ°ΡΠΈΡΠΊΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ. ΠΠΎΡΠΈΡΡΠΈΠ²ΠΌΠ΅ ΠΌΠ΅ΡΠ°Π½Π° ΠΏΡΠ΅ΡΠΈΠ·Π½Π° ΠΎΠ±ΡΠΊΠ° ΡΠΎ ΡΠΈΠΏΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ float64 Π·Π° Π½Π°ΠΏΡΠ΅Π΄ ΠΏΡΠ΅ΠΌΠΈΠ½ ΠΈ float16 Π·Π° Π³ΡΠ°Π΄ΠΈΠ΅Π½ΡΠΈ Π·Π° Π΄Π° Π³ΠΈ Π·Π°Π±ΡΠ·Π°ΠΌΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠΊΠΈΡΠ΅ float32 ΠΏΠΎΠ΄Π΄ΡΠΆΠ°Π½ΠΈ ΠΎΠ΄ Π³ΡΠ°ΡΠΈΡΠΊΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ Π½Π° 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. ΠΠΊΠ»ΡΡΠΈΠ²ΠΌΠ΅ ΠΈ ΡΠ΅ΠΊΠΎΡΠΈ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π·Π° Π΄Π° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠ° ΡΠΊΡΠΈΠΏΡΠ° Π·Π° Π΄Π° ΠΈΠ·Π²ΡΡΠΈΡΠ΅ ΠΎΠ±ΡΠΊΠ° ΡΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΡΠ°Π½ΡΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄.
ΠΠΊΠΎ ΡΡΠΎΡΡΠΊΡ Π·Π°ΠΏΠΎΡΠ½ΡΠ²Π°ΡΠ΅ ΡΠΎ MXNet ΠΈ Π΄Π»Π°Π±ΠΎΠΊΠΎ ΡΡΠ΅ΡΠ΅, ΠΎΠ΄Π΅ΡΠ΅ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π·Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ° ΠΏΡΠ²ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·Π³ΡΠ°Π΄ΠΈ MXNet. ΠΡΡΠΎ ΡΠ°ΠΊΠ°, ΡΠΈΠ»Π½ΠΎ ΠΏΡΠ΅ΠΏΠΎΡΠ°ΡΡΠ²Π°ΠΌΠ΅ Π΄Π° ΡΠ° ΠΏΡΠΎΡΠΈΡΠ°ΡΠ΅ ΡΡΠ°ΡΠΈΡΠ°ΡΠ° Π·Π° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅.
ΠΠΊΠΎ Π²Π΅ΡΠ΅ ΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ΅Π»Π΅ ΡΠΎ MXNet ΠΈ ΡΠ°ΠΊΠ°ΡΠ΅ Π΄Π° ΠΏΡΠΎΠ±Π°ΡΠ΅ Π΄ΠΈΡΡΡΠΈΠ±ΡΠΈΡΠ°Π½ΠΎ ΡΡΠ΅ΡΠ΅ ΡΠΎ Π₯ΠΎΡΠΎΠ²ΠΎΠ΄, ΡΠΎΠ³Π°Ρ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ Π³ΠΎ , ΠΈΠ·Π³ΡΠ°Π΄Π΅ΡΠ΅ Π³ΠΎ ΠΎΠ΄ MXNet ΠΈ ΡΠ»Π΅Π΄Π΅ΡΠ΅ Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΎΡ ΠΈΠ»ΠΈ .
*ΡΡΠΎΡΠΎΠΊΠΎΡ ΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΡΠ²Π° Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° AWS Π·Π° EC2 ΠΏΡΠΈΠΌΠ΅ΡΠΈ
ΠΠΎΠ·Π½Π°ΡΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΠΊΡΡΡΠΎΡ
ΠΠ·Π²ΠΎΡ: www.habr.com
