αž€αžΆαžšαžšαŸ€αž“αž…αŸ‚αž€αž…αžΆαž™αž‡αžΆαž˜αž½αž™ Apache MXNet αž“αž·αž„ Horovod

αž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αž’αžαŸ’αžαž”αž‘αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž“αŸ…αž˜αž»αž“αžαŸ’αž„αŸƒαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸƒαžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆ "ML αž§αžŸαŸ’αžŸαžΆαž αž€αž˜αŸ’αž˜αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αŸ†"

αž€αžΆαžšαž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž›αžŠαŸ‚αž›αž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™αž›αžΎαž€αžšαžŽαžΈαž€αž»αŸ†αž–αŸ’αž™αžΌαž‘αŸαžšαžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžαŸ’αž–αžŸαŸ‹αž‡αžΆαž…αŸ’αžšαžΎαž“αž’αžΆαž…αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž–αŸαž›αžœαŸαž›αžΆαž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž›αž“αŸƒαž”αžŽαŸ’αžαžΆαž‰αžŸαžšαžŸαŸƒαž”αŸ’αžšαžŸαžΆαž‘αž‡αŸ’αžšαŸ…αž‘αŸ†αž“αžΎαž”αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸαž…αŸ’αžšαžΎαž“αž–αžΈαžŸαž”αŸ’αžαžΆαž αŸαž‘αŸ…αž…αŸ’αžšαžΎαž“αž˜αŸ‰αŸ„αž„ αž¬αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž“αžΆαž‘αžΈ αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž±αŸ’αž™αž”αž…αŸ’αž…αŸαž€αž‘αŸαžŸαž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž›αž“αŸαŸ‡αžšαžΈαž€αžšαžΆαž›αžŠαžΆαž›αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž“αŸƒαž€αžΆαžšαžšαŸ€αž“αžŸαžΌαžαŸ’αžšαž‡αŸ’αžšαŸ…αŸ” αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαžαŸ‚αž™αž›αŸ‹αž–αžΈαžšαž”αŸ€αž”αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€ αž“αž·αž„αž’αŸ’αžœαžΎαžŸαž˜αž€αžΆαž›αž€αž˜αŸ’αž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž›αžΎαž€αžšαžŽαžΈαž‡αžΆαž…αŸ’αžšαžΎαž“ αžŠαŸ‚αž›αžœαžΆαž‡αŸ‡αž₯αž‘αŸ’αž’αž·αž–αž›αž™αŸ‰αžΆαž„αžŸαŸ†αžαžΆαž“αŸ‹αž‘αŸ…αž›αžΎαž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αŸ” αž›αžΎαžŸαž–αžΈαž“αŸαŸ‡ αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αŸαž‚αž½αžšαžŠαžΉαž„αž–αžΈαžšαž”αŸ€αž”αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž›αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎ instance αžαŸ‚αž˜αž½αž™αž‘αŸ…αž€αžΆαž“αŸ‹ instances αž…αŸ’αžšαžΎαž“αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαžœαž·αž’αžΈαž„αžΆαž™αžŸαŸ’αžšαž½αž› αž“αž·αž„αžšαž αŸαžŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™αž€αžΆαžšαžšαŸ€αž“αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž”αžΎαž€αž‘αžΌαž›αžΆαž™αž€αžΆαžšαžšαŸ€αž“αž‡αŸ’αžšαŸ…αž‡αŸ’αžšαŸ‡ Apache MXNet αž“αž·αž„αž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒαžŸαž·αž€αŸ’αžŸαžΆαžŠαŸ‚αž›αž”αžΆαž“αž…αŸ‚αž€αž…αžΆαž™ Horovod αŸ” αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž αžΆαž‰αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž’αŸ†αž–αžΈαž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž“αŸƒαž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž“αŸƒαž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒ Horovod αž“αž·αž„αž”αž„αŸ’αž αžΆαž‰αž–αžΈαžšαž”αŸ€αž”αžŸαžšαžŸαŸαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž› MXNet αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžŽαŸˆαž…αŸ‚αž€αž…αžΆαž™αž‡αžΆαž˜αž½αž™ Horovod αŸ”

តើ Apache MXNet αž‡αžΆαž’αŸ’αžœαžΈ?

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Apache MXNet αž‚αžΊβ€‹αž‡αžΆβ€‹αž€αŸ’αžšαž”αžαžŽαŸ’αžŒβ€‹αž€αžΆαžšβ€‹αžŸαž·αž€αŸ’αžŸαžΆβ€‹αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ…β€‹αž”αŸ’αžšαž—αž–β€‹αž”αžΎαž€αž…αŸ†αž β€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžΎβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž”αž„αŸ’αž€αžΎαž αž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž› αž“αž·αž„β€‹αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹β€‹αž”αžŽαŸ’αžαžΆαž‰β€‹αžŸαžšαžŸαŸƒαž”αŸ’αžšαžŸαžΆαž‘β€‹αž‡αŸ’αžšαŸ…αŸ” MXNet αžŸαž„αŸ’αžαŸαž”αž–αžΈαž—αžΆαž–αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αžŠαŸ‚αž›αž‘αžΆαž€αŸ‹αž‘αž„αž“αžΉαž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž”αžŽαŸ’αžαžΆαž‰αžŸαžšαžŸαŸƒαž”αŸ’αžšαžŸαžΆαž‘ αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αžαŸ’αž–αžŸαŸ‹ αž“αž·αž„αž’αžΆαž…αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž”αžΆαž“ αž“αž·αž„αž•αŸ’αžαž›αŸ‹ APIs αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž—αžΆαžŸαžΆαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αŸαž‰αž“αž·αž™αž˜αžŠαžΌαž…αž‡αžΆ αž–αžŸαŸ‹αžαŸ’αž›αžΆαž“αŸ‹, C ++, Clojure, αž€αŸ„αŸ‡αž‡αŸ’αžœαžΆ, αž›αŸ„αž€αžŸαŸ’αžšαžΈ Julia, R, Scala αž“αž·αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

αž€αžΆαžšαž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž›αž…αŸ‚αž€αž…αžΆαž™αž€αŸ’αž“αž»αž„ MXNet αž‡αžΆαž˜αž½αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš

αž˜αŸ‰αžΌαžŒαž»αž›αžŸαž·αž€αŸ’αžŸαžΆαž…αŸ‚αž€αž…αžΆαž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„ MXNet αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαŸ” αžœαžΆαž”αŸ’αžšαžΎαžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αŸ’αžšαž˜αžΌαž›αž‡αž˜αŸ’αžšαžΆαž›αž–αžΈαž€αž˜αŸ’αž˜αž€αžšαž“αž·αž˜αž½αž™αŸ— αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ† αž“αž·αž„αž”αž‰αŸ’αž‡αžΌαž“αž‡αž˜αŸ’αžšαžΆαž›αžŠαŸ‚αž›αž”αžΆαž“αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αžαŸ’αžšαž‘αž”αŸ‹αž‘αŸ…αž€αž˜αŸ’αž˜αž€αžšαžœαž·αž‰αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαž±αŸ’αž™αž”αŸ’αžšαžŸαžΎαžšαž‘αžΎαž„αžœαž·αž‰αž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ” αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŸαž˜αžΆαž˜αžΆαžαŸ’αžšαžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž…αŸ†αž–αŸ„αŸ‡αž€αž˜αŸ’αž˜αž€αžšαž‚αžΊαž‡αžΆαž‚αž“αŸ’αž›αžΉαŸ‡αž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž”αŸ’αžšαž€αž”αžŠαŸ„αž™αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎβ€‹αž˜αžΆαž“β€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸβ€‹αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšβ€‹αžαŸ‚αž˜αž½αž™ αžœαžΆβ€‹αž’αžΆαž…β€‹αž“αžΉαž„β€‹αž€αŸ’αž›αžΆαž™β€‹αž‡αžΆβ€‹αž§αž”αžŸαž‚αŸ’αž‚β€‹αž€αŸ’αž“αž»αž„β€‹αž€αžΆαžšβ€‹αž‚αžŽαž“αžΆαŸ” αž•αŸ’αž‘αž»αž™αž‘αŸ…αžœαž·αž‰ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž…αŸ’αžšαžΎαž“αž–αŸαž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž€αžΆαžšαž‘αŸ†αž“αžΆαž€αŸ‹αž‘αŸ†αž“αž„αž…αŸ’αžšαžΎαž“αž‘αŸ…αž…αŸ’αžšαžΎαž“αž’αžΆαž…αž”αž·αž‘αž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž”αžŽαŸ’αžαžΆαž‰αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

តើ Horovod αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈ

ហូវូដ αž‚αžΊβ€‹αž‡αžΆβ€‹αž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒβ€‹αžŸαž·αž€αŸ’αžŸαžΆβ€‹αž‡αŸ’αžšαŸ…αž‡αŸ’αžšαŸ‡β€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž…αŸ‚αž€αž…αžΆαž™β€‹αžŠαŸ„αž™β€‹αž”αžΎαž€αž…αŸ†αž αžšβ€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž‘αžΎαž„β€‹αž“αŸ… UberαŸ” αžœαžΆαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαž†αŸ’αž›αž„αž€αžΆαžαŸ‹ GPU αž“αž·αž„αžαŸ’αž“αžΆαŸ†αž„αž”αŸ’αžšαž€αž”αžŠαŸ„αž™αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αžŠαžΌαž…αž‡αžΆ NVIDIA Collective Communications Library (NCCL) αž“αž·αž„ Message Passing Interface (MPI) αžŠαžΎαž˜αŸ’αž”αžΈαž…αŸ‚αž€αž…αžΆαž™ αž“αž·αž„αž”αŸ’αžšαž˜αžΌαž›αž•αŸ’αžαž»αŸ†αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž‚αŸ†αžšαžΌαž“αŸ…αž‘αžΌαž‘αžΆαŸ†αž„ vorecs αŸ” αžœαžΆαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αžšαž·αžαž”αž‰αŸ’αž‡αžΌαž“αž”αžŽαŸ’αžαžΆαž‰ αž“αž·αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž”αžΆαž“αž™αŸ‰αžΆαž„αž›αŸ’αž’αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž‚αŸ†αžšαžΌαž”αžŽαŸ’αžαžΆαž‰αžŸαžšαžŸαŸƒαž”αŸ’αžšαžŸαžΆαž‘αž‡αŸ’αžšαŸ…αŸ” αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“β€‹αž“αŸαŸ‡β€‹αžœαžΆβ€‹αž‚αžΆαŸ†αž‘αŸ’αžšβ€‹αž€αŸ’αžšαž”αžαŸαžŽαŸ’αžŒβ€‹αž€αžΆαžšβ€‹αžšαŸ€αž“β€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“β€‹αžŠαŸβ€‹αž–αŸαž‰β€‹αž“αž·αž™αž˜β€‹αž˜αž½αž™β€‹αž…αŸ†αž“αž½αž“β€‹αž‚αžΊβ€‹ MX αžŸαž»αž‘αŸ’αž’, 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 αžŠαŸ‚αžš αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαž“αž…αŸ†αž“αž½αž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž–αžΈαžšαžŠαž„αž’αŸ€αž”αž“αžΉαž„αž…αŸ†αž“αž½αž“αž€αž˜αŸ’αž˜αž€αžšαŸ”

αž€αžΆαžšαžšαŸ€αž“αž…αŸ‚αž€αž…αžΆαž™αž‡αžΆαž˜αž½αž™ Apache MXNet αž“αž·αž„ Horovod
αžšαžΌαž”αž—αžΆαž–αž‘αžΈ 1. αž€αžΆαžšαž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž€αžΆαžšαžšαŸ€αž“αž…αŸ‚αž€αž…αžΆαž™αžŠαŸ„αž™αž”αŸ’αžšαžΎ MXNet αž‡αžΆαž˜αž½αž™ Horovod αž“αž·αž„αž‡αžΆαž˜αž½αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš

αž“αŸ…αž€αŸ’αž“αž»αž„αžαžΆαžšαžΆαž„αž‘αžΈ 1 αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αž™αžΎαž„αž”αŸ’αžšαŸ€αž”αž’αŸ€αž”αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž€αŸ’αž“αž»αž„αž˜αž½αž™αž€αžšαžŽαžΈ αž“αŸ…αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž€αžΆαžšαž–αž·αžŸαŸ„αž’αž“αŸαž›αžΎ 64 GPUs αŸ” αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ MXNet αž‡αžΆαž˜αž½αž™ Horovod αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž›αŸ†αž αžΌαžšαžŠαŸαž›αŸ’αž’αž”αŸ†αž•αž»αžαž€αŸ’αž“αž»αž„αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αž‘αžΆαž”αž”αŸ†αž•αž»αžαŸ”

αž€αžΆαžšαžšαŸ€αž“αž…αŸ‚αž€αž…αžΆαž™αž‡αžΆαž˜αž½αž™ Apache 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αŸ” αž’αŸ’αž“αž€αž€αŸαž’αžΆαž…αž”αŸ’αžšαžΎαž•αž„αžŠαŸ‚αžšαŸ” Amazon Deep Learning AMIαžŠαŸ‚αž›αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αž‘αžΆαŸ†αž„αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αž‡αžΆαž˜αž»αž“αžšαž½αž…αž αžΎαž™αŸ”

αž”αŸ„αŸ‡αž‡αŸ†αž αžΆαž“ 2

αž”αž“αŸ’αžαŸ‚αž˜αžŸαž˜αžαŸ’αžαž—αžΆαž–αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ Horovod API αž‘αŸ…αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž› MXNet αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž•αŸ’αž’αŸ‚αž€αž›αžΎ MXNet Gluon API αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž‡αžΆαž‚αŸ†αžšαžΌαžŸαžΆαž˜αž‰αŸ’αž‰αŸ” αž”αž“αŸ’αž‘αžΆαžαŸ‹αž‡αžΆαž’αž€αŸ’αžŸαžšαžŠαž·αžαž‚αžΊαž…αžΆαŸ†αž”αžΆαž…αŸ‹αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž˜αžΆαž“αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž›αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαžšαž½αž…αž αžΎαž™αŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαžŠαžΎαž˜αŸ’αž”αžΈαžšαŸ€αž“αž‡αžΆαž˜αž½αž™ HorovodαŸ–

  • αž€αŸ†αžŽαžαŸ‹αž”αžšαž·αž”αž‘αžŠαŸ„αž™αž™αŸ„αž„αž‘αŸ…αžαžΆαž˜αž…αŸ†αžŽαžΆαžαŸ‹αžαŸ’αž“αžΆαž€αŸ‹ Horovod αž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹ (αž”αž“αŸ’αž‘αžΆαžαŸ‹αž‘αžΈ 8) αžŠαžΎαž˜αŸ’αž”αžΈαž™αž›αŸ‹αžαžΆαž€αžΆαžšαž”αžŽαŸ’αžαž»αŸ‡αž”αžŽαŸ’αžαžΆαž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž›αžΎαžŸαŸ’αž“αžΌαž›αž€αŸ’αžšαžΆαž αŸ’αžœαž·αž€αžαŸ’αžšαžΉαž˜αžαŸ’αžšαžΌαžœαŸ”
  • αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŠαŸ†αž”αžΌαž„αž–αžΈαž€αž˜αŸ’αž˜αž€αžšαž˜αŸ’αž“αžΆαž€αŸ‹αž‘αŸ…αž‘αžΆαŸ†αž„αž’αžŸαŸ‹ (αž”αž“αŸ’αž‘αžΆαžαŸ‹ 18) αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαžαžΆαž€αž˜αŸ’αž˜αž€αžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŠαŸ†αž”αžΌαž„αžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ”
  • αž”αž„αŸ’αž€αžΎαž Horovod αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αŸ‚αž€αž…αžΆαž™αž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž– (αž”αž“αŸ’αž‘αžΆαžαŸ‹ 25) αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžŽαŸˆαž…αŸ‚αž€αž…αžΆαž™αŸ”

αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž–αŸαž‰αž›αŸαž‰ αžŸαžΌαž˜αž™αŸ„αž„αž‘αŸ…αž›αžΎαž§αž‘αžΆαž αžšαžŽαŸ Horovod-MXNet MNIST ΠΈ αž’αŸŠαžΈαž“αž’αžΊαžŽαŸαž.

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 αž“αž·αž„αž€αžΆαžšαžšαŸ€αž“αžŸαŸŠαžΈαž‡αž˜αŸ’αžšαŸ… αžŸαžΌαž˜αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž‘αŸ†αž–αŸαžšαžŠαŸ†αž‘αžΎαž„ MXNeαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαž MXNet αžŠαŸ†αž”αžΌαž„αŸ” αž™αžΎαž„αž€αŸαžŸαžΌαž˜αž•αŸ’αžαž›αŸ‹αž’αž“αž»αžŸαžΆαžŸαž“αŸαž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αž±αŸ’αž™αž’αžΆαž“αž’αžαŸ’αžαž”αž‘ MXNet αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž› 60 αž“αžΆαž‘αžΈαŸ”αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž”αžΆαž“αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ MXNet αžšαž½αž…αž αžΎαž™ αž αžΎαž™αž…αž„αŸ‹αžŸαžΆαž€αž›αŸ’αž”αž„αž€αžΆαžšαžšαŸ€αž“αž…αŸ‚αž€αž…αžΆαž™αž‡αžΆαž˜αž½αž™ Horovod αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž˜αžΎαž› αž‘αŸ†αž–αŸαžšαžŠαŸ†αž‘αžΎαž„ Horovodαž”αž„αŸ’αž€αžΎαžαžœαžΆαž–αžΈ MXNet αž αžΎαž™αž’αŸ’αžœαžΎαžαžΆαž˜αž§αž‘αžΆαž αžšαžŽαŸ MNIST ឬ αž’αŸŠαžΈαž“αž’αžΊαžŽαŸαž.

* αž€αžΆαžšαž…αŸ†αžŽαžΆαž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αžŽαž“αžΆαžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎ αž’αžαŸ’αžšαžΆαž˜αŸ‰αŸ„αž„ AWS αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ EC2 Instances

αžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆ "ML αž§αžŸαŸ’αžŸαžΆαž αž€αž˜αŸ’αž˜αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αž’αŸ†"

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹