Apache MXNet āĻāĻŦāĻ‚ Horovod āĻāϰ āϏāĻžāĻĨ⧇ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻļāĻŋāĻ•ā§āώāĻž

āύāĻŋāĻŦāĻ¨ā§āϧāϟāĻŋāϰ āĻ…āύ⧁āĻŦāĻžāĻĻ āϕ⧋āĻ°ā§āϏ āĻļ⧁āϰ⧁āϰ āĻĒā§āϰāĻžāĻ•ā§āĻ•āĻžāϞ⧇ āĻĒā§āϰāĻ¸ā§āϤ⧁āϤ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āĻ›āĻŋāϞ "āĻŦāĻŋāĻ— āĻĄā§‡āϟāĻžāϤ⧇ āĻļāĻŋāĻ˛ā§āĻĒ āĻāĻŽāĻāϞ"

āĻāĻ•āĻžāϧāĻŋāĻ• āωāĻšā§āϚ-āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ āĻ•āĻŽā§āĻĒāĻŋāωāϟāĻŋāĻ‚ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ⧇ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āφāϧ⧁āύāĻŋāĻ• āĻ—āĻ­ā§€āϰ āύāĻŋāωāϰāĻžāϞ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇āϰ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāϪ⧇āϰ āϏāĻŽāϝāĻŧāϕ⧇ āϏāĻĒā§āϤāĻžāĻš āĻĨ⧇āϕ⧇ āϘāĻ¨ā§āϟāĻž āĻŦāĻž āĻāĻŽāύāĻ•āĻŋ āĻŽāĻŋāύāĻŋāĻŸā§‡ āĻĒā§āϰāϚ⧁āϰ āĻĒāϰāĻŋāĻŽāĻžāϪ⧇ āĻĄā§‡āϟāĻžāϰ āωāĻĒāϰ āĻ•āĻŽāĻŋāϝāĻŧ⧇ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇, āĻāχ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻ•ā§ŒāĻļāϞāϟāĻŋāϕ⧇ āĻ—āĻ­ā§€āϰ āĻļāĻŋāĻ•ā§āώāĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ• āĻĒā§āϰāϝāĻŧā§‹āϗ⧇ āĻĒā§āϰāϚāϞāĻŋāϤ āĻ•āϰ⧇ āϤ⧋āϞ⧇āĨ¤ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻ…āĻŦāĻļā§āϝāχ āĻŦ⧁āĻāϤ⧇ āĻšāĻŦ⧇ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ āϜ⧁āĻĄāĻŧ⧇ āĻĄā§‡āϟāĻž āĻ­āĻžāĻ— āĻāĻŦāĻ‚ āϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāχāϜ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ, āϝāĻžāϰ āĻĢāϞāĻ¸ā§āĻŦāϰ⧂āĻĒ āĻ¸ā§āϕ⧇āϞāĻŋāĻ‚ āĻĻāĻ•ā§āώāϤāĻžāϰ āωāĻĒāϰ āĻāĻ•āϟāĻŋ āĻŦāĻĄāĻŧ āĻĒā§āϰāĻ­āĻžāĻŦ āϰāϝāĻŧ⧇āϛ⧇āĨ¤ āωāĻĒāϰāĻ¨ā§āϤ⧁, āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āϜāĻžāύāĻž āωāϚāĻŋāϤ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻšāϝāĻŧ āϝāĻž āĻāĻ•āĻ• āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ āĻĨ⧇āϕ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ⧇ āϚāϞ⧇āĨ¤

āĻāχ āύāĻŋāĻŦāĻ¨ā§āϧ⧇ āφāĻŽāϰāĻž āĻ“āĻĒ⧇āύ āĻĄāĻŋāĻĒ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ Apache MXNet āĻāĻŦāĻ‚ Horovod āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻŸā§‡āĻĄ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻļ⧇āĻ–āĻžāϰ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻžāϰ āĻāĻ•āϟāĻŋ āĻĻā§āϰ⧁āϤ āĻāĻŦāĻ‚ āϏāĻšāϜ āωāĻĒāĻžāϝāĻŧ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āĻ•āĻĨāĻž āĻŦāϞāĻŦāĨ¤ āφāĻŽāϰāĻž āĻ¸ā§āĻĒāĻˇā§āϟāĻ­āĻžāĻŦ⧇ Horovod āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āϕ⧇āϰ āĻ•āĻžāĻ°ā§āϝāĻ•āĻžāϰāĻŋāϤāĻž āϏ⧁āĻŦāĻŋāϧāĻžāϗ⧁āϞāĻŋ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāĻŦ āĻāĻŦāĻ‚ āĻĒā§āϰāĻĻāĻ°ā§āĻļāύ āĻ•āϰāĻŦ āϕ⧀āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ MXNet āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻšāϝāĻŧ āϝāĻžāϤ⧇ āĻāϟāĻŋ Horovod-āĻāϰ āϏāĻžāĻĨ⧇ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻĒāĻĻā§āϧāϤāĻŋāϤ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤

Apache MXNet āĻ•āĻŋ

āĻ…ā§āϝāĻžāĻĒāĻžāϚāĻŋ āĻāĻŽāĻāĻ•ā§āϏāύ⧇āϟ āĻāĻ•āϟāĻŋ āĻ“āĻĒ⧇āύ āϏ⧋āĻ°ā§āϏ āĻĄāĻŋāĻĒ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āϝāĻž āĻ—āĻ­ā§€āϰ āύāĻŋāωāϰāĻžāϞ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āϤ⧈āϰāĻŋ, āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšā§ƒāϤ āĻšāϝāĻŧāĨ¤ MXNet āύāĻŋāωāϰāĻžāϞ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāϤ āϜāϟāĻŋāϞāϤāĻžāϗ⧁āϞāĻŋāϕ⧇ āĻŦāĻŋāĻŽā§‚āĻ°ā§āϤ āĻ•āϰ⧇, āĻāϟāĻŋ āĻ…āĻ¤ā§āϝāĻ¨ā§āϤ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāĻ¨ā§āϏ āĻāĻŦāĻ‚ āĻ¸ā§āϕ⧇āϞāϝ⧋āĻ—ā§āϝ āĻāĻŦāĻ‚ āϜāύāĻĒā§āϰāĻŋāϝāĻŧ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāĻŋāĻ‚ āĻ­āĻžāώāĻžāϰ āϜāĻ¨ā§āϝ API āĻ…āĻĢāĻžāϰ āĻ•āϰ⧇ āϝ⧇āĻŽāύ āĻĒāĻžāχāĻĨāύ, āϏāĻŋ ++, Clojure, āϜāĻžāĻ­āĻž, āϜ⧁āϞāĻŋāϝāĻŧāĻž, R, scala āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āϝāĻĻ⧇āϰ

āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš MXNet-āĻ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻšāϝāĻŧ⧇āϛ⧇

MXNet-āĻ āĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻŸā§‡āĻĄ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻŽāĻĄāĻŋāωāϞ āĻāĻ•āϟāĻŋ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ āĻĒā§āϰāϤāĻŋāϟāĻŋ āĻ•āĻ°ā§āĻŽā§€āϰ āĻ•āĻžāĻ› āĻĨ⧇āϕ⧇ āĻ—ā§āϰ⧇āĻĄāĻŋāϝāĻŧ⧇āĻ¨ā§āϟ āϏāĻ‚āĻ—ā§āϰāĻš āĻ•āϰāϤ⧇, āĻāĻ•āĻ¤ā§āϰ⧀āĻ•āϰāĻŖ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰāϤ⧇ āĻāĻŦāĻ‚ āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāĻœā§‡āĻļāύ āĻĒ⧁āύāϰāĻžāĻŦ⧃āĻ¤ā§āϤāĻŋāϰ āϜāĻ¨ā§āϝ āĻ•āĻ°ā§āĻŽā§€āĻĻ⧇āϰ āĻ•āĻžāϛ⧇ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāĻž āĻ—ā§āϰ⧇āĻĄāĻŋāϝāĻŧ⧇āĻ¨ā§āϟ āĻĒāĻžāĻ āĻžāϤ⧇ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻāĻ•āϟāĻŋ āϏ⧇āϟ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āĻ•āĻ°ā§āĻŽā§€āĻĻ⧇āϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āϏāĻ āĻŋāĻ• āĻ…āύ⧁āĻĒāĻžāϤ āύāĻŋāĻ°ā§āϧāĻžāϰāĻŖ āĻ•āĻžāĻ°ā§āϝāĻ•āϰ āĻ¸ā§āϕ⧇āϞāĻŋāĻ‚ āĻāϰ āĻŽā§‚āϞ āϚāĻžāĻŦāĻŋāĻ•āĻžāĻ āĻŋāĨ¤ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĨāĻžāĻ•āϞ⧇, āĻāϟāĻŋ āĻ—āĻŖāύāĻžāϰ āĻ•ā§āώ⧇āĻ¤ā§āϰ⧇ āĻāĻ•āϟāĻŋ āĻŦāĻžāϧāĻž āĻšāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻŦāĻŋāĻĒāϰ⧀āϤāĻ­āĻžāĻŦ⧇, āϝāĻĻāĻŋ āĻ…āύ⧇āĻ•āϗ⧁āϞāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāϝāĻŧ, āĻ…āύ⧇āĻ•-āĻĨ⧇āϕ⧇-āĻ…āύ⧇āĻ• āϝ⧋āĻ—āĻžāϝ⧋āĻ— āϏāĻŽāĻ¸ā§āϤ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āϏāĻ‚āϝ⧋āĻ—āϗ⧁āϞāĻŋāϕ⧇ āφāϟāϕ⧇ āĻĻāĻŋāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

Horovod āĻ•āĻŋ

āĻšā§‹āϰ⧋āĻ­āĻĄ āωāĻŦāĻžāϰ⧇ āĻŦāĻŋāĻ•āĻļāĻŋāϤ āĻāĻ•āϟāĻŋ āĻ“āĻĒ⧇āύ āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻŸā§‡āĻĄ āĻĄāĻŋāĻĒ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ•āĨ¤ āĻāϟāĻŋ āĻĻāĻ•ā§āώ āĻ•ā§āϰāϏ-āϜāĻŋāĻĒāĻŋāχāω āĻāĻŦāĻ‚ āĻ•ā§āϰāϏ-āύ⧋āĻĄ āĻĒā§āϰāϝ⧁āĻ•ā§āϤāĻŋ āϝ⧇āĻŽāύ NVIDIA āĻ•āĻžāϞ⧇āĻ•ā§āϟāĻŋāĻ­ āĻ•āĻŽāĻŋāωāύāĻŋāϕ⧇āĻļāύāϏ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ (NCCL) āĻāĻŦāĻ‚ āĻŽā§‡āϏ⧇āϜ āĻĒāĻžāϏāĻŋāĻ‚ āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ (MPI) āĻ­ā§‹āϰ⧇āĻ•ā§āϏ āϜ⧁āĻĄāĻŧ⧇ āĻŽāĻĄā§‡āϞ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰāϗ⧁āϞāĻŋ āĻŦāĻŋāϤāϰāĻŖ āĻāĻŦāĻ‚ āĻāĻ•āĻ¤ā§āϰāĻŋāϤ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻŦā§āϝāĻžāĻ¨ā§āĻĄāωāχāĻĨ⧇āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāϕ⧇ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜ āĻ•āϰ⧇ āĻāĻŦāĻ‚ āĻ—āĻ­ā§€āϰ āύāĻŋāωāϰāĻžāϞ āύ⧇āϟāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āĻŽāĻĄā§‡āϞāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻ­āĻžāϞāĻ­āĻžāĻŦ⧇ āĻ¸ā§āϕ⧇āϞ āĻ•āϰ⧇āĨ¤ āĻāϟāĻŋ āĻŦāĻ°ā§āϤāĻŽāĻžāύ⧇ āĻŦ⧇āĻļ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϜāύāĻĒā§āϰāĻŋāϝāĻŧ āĻŽā§‡āĻļāĻŋāύ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻĢā§āϰ⧇āĻŽāĻ“āϝāĻŧāĻžāĻ°ā§āĻ• āϏāĻŽāĻ°ā§āĻĨāύ āĻ•āϰ⧇, āϝāĻĨāĻž āĻāĻŽāĻāĻ•ā§āϏ āύ⧇āϟ, Tensorflow, Keras, āĻāĻŦāĻ‚ PyTorch.

MXNet āĻāĻŦāĻ‚ Horovod āχāĻ¨ā§āϟāĻŋāĻ—ā§āϰ⧇āĻļāύ

MXNet Horovod-āĻ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻŸā§‡āĻĄ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ API-āĻāϰ āĻŽāĻžāĻ§ā§āϝāĻŽā§‡ Horovod-āĻāϰ āϏāĻžāĻĨ⧇ āĻāϕ⧀āĻ­ā§‚āϤ āĻšāϝāĻŧāĨ¤ Horovod āϝ⧋āĻ—āĻžāϝ⧋āĻ— APIs horovod.broadcast(), horovod.allgather() и horovod.allreduce() MXNet āχāĻžā§āϜāĻŋāύ⧇āϰ āĻ…ā§āϝāĻžāϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāϏ āĻ•āϞāĻŦā§āϝāĻžāĻ• āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāĻŋāϤ āĻšāϝāĻŧ⧇āϛ⧇, āĻāϰ āϟāĻžāĻ¸ā§āĻ• āĻ—ā§āϰāĻžāĻĢ⧇āϰ āĻ…āĻ‚āĻļ āĻšāĻŋāϏ⧇āĻŦ⧇āĨ¤ āĻāχāĻ­āĻžāĻŦ⧇, āϏāĻŋāĻ™ā§āĻ•ā§āϰ⧋āύāĻžāχāĻœā§‡āĻļāύ⧇āϰ āĻ•āĻžāϰāϪ⧇ āĻ•āĻ°ā§āĻŽāĻ•ā§āώāĻŽāϤāĻž āĻ•ā§āώāϤāĻŋ āĻāĻĄāĻŧāĻžāϤ⧇ MXNet āχāĻžā§āϜāĻŋāύ āĻĻā§āĻŦāĻžāϰāĻž āϝ⧋āĻ—āĻžāϝ⧋āĻ— āĻāĻŦāĻ‚ āĻ—āĻŖāύāĻžāϰ āĻŽāĻ§ā§āϝ⧇ āĻĄā§‡āϟāĻž āύāĻŋāĻ°ā§āĻ­āϰāϤāĻž āϏāĻšāĻœā§‡āχ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧāĨ¤ Horovod-āĻ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧāĻŋāϤ āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻŸā§‡āĻĄ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜāĻžāϰ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ horovod.DistributedOptimizer āĻĒā§āϰāϏāĻžāϰāĻŋāϤ āĻšāϝāĻŧ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜāĻžāϰ MXNet-āĻ āϝāĻžāϤ⧇ āĻāϟāĻŋ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āφāĻĒāĻĄā§‡āĻŸā§‡āϰ āϜāĻ¨ā§āϝ āϏāĻ‚āĻļā§āϞāĻŋāĻˇā§āϟ Horovod API-āϕ⧇ āĻ•āϞ āĻ•āϰ⧇āĨ¤ āĻāχ āϏāĻŽāĻ¸ā§āϤ āĻŦāĻžāĻ¸ā§āϤāĻŦāĻžāϝāĻŧāύ⧇āϰ āĻŦāĻŋāĻŦāϰāĻŖ āĻļ⧇āώ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻ•āĻžāϰ⧀āĻĻ⧇āϰ āĻ•āĻžāϛ⧇ āĻ¸ā§āĻŦāĻšā§āĻ›āĨ¤

āĻĻā§āϰ⧁āϤ āĻļ⧁āϰ⧁

āφāĻĒāύāĻŋ āĻĻā§āϰ⧁āϤ āφāĻĒāύāĻžāϰ āĻŽā§āϝāĻžāĻ•āĻŦ⧁āϕ⧇ 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 āĻĒāĻŋāĻĒ āχāύāĻ¸ā§āϟāϞ 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āϟāĻŋ āϜāĻŋāĻĒāĻŋāχāωāϤ⧇ āĻāĻ•āϟāĻŋ āχāĻŽā§‡āϜāύ⧇āϟ āĻĄā§‡āϟāĻžāϏ⧇āĻŸā§‡ ResNet1-v64 āĻŽāĻĄā§‡āϞāϕ⧇ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ p3.16 āĻŦāĻĄāĻŧ EC2, āĻĒā§āϰāϤāĻŋāϟāĻŋāϤ⧇ AWS āĻ•ā§āϞāĻžāωāĻĄā§‡ 8āϟāĻŋ NVIDIA Tesla V100 GPU āϰāϝāĻŧ⧇āϛ⧇, āφāĻŽāϰāĻž 45000 āĻ›āĻŦāĻŋ/āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡āϰ āĻāĻ•āϟāĻŋ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻĨā§āϰ⧁āĻĒ⧁āϟ āĻ…āĻ°ā§āϜāύ āĻ•āϰ⧇āĻ›āĻŋ (āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻĒā§āϰāϤāĻŋ āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŋāϤ āύāĻŽā§āύāĻžāϰ āϏāĻ‚āĻ–ā§āϝāĻž)āĨ¤ 44% āĻāϰ āϏāĻ°ā§āĻŦā§‹āĻ¤ā§āϤāĻŽ āύāĻŋāĻ°ā§āϭ⧁āϞāϤāĻžāϰ āϏāĻžāĻĨ⧇ 90āϟāĻŋ āϝ⧁āϗ⧇āϰ āĻĒāϰ⧇ 75.7 āĻŽāĻŋāύāĻŋāĻŸā§‡ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻšāϝāĻŧāĨ¤

āφāĻŽāϰāĻž āĻāϟāĻŋāϕ⧇ MXNet-āĻāϰ āĻŦāĻŋāϤāϰāĻŖāĻ•ā§ƒāϤ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻĒāĻĻā§āϧāϤāĻŋāϰ āϏāĻžāĻĨ⧇ 8, 16, 32 āĻāĻŦāĻ‚ 64 GPU-āϤ⧇ āĻāĻ•āϟāĻŋ āĻāĻ•āĻ• āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻāĻŦāĻ‚ āĻāĻ•āϟāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĨ⧇āϕ⧇ āĻ•āĻ°ā§āĻŽā§€āϰ āĻ…āύ⧁āĻĒāĻžāϤ āϝāĻĨāĻžāĻ•ā§āϰāĻŽā§‡ 1 āĻĨ⧇āϕ⧇ 1 āĻāĻŦāĻ‚ 2 āĻĨ⧇āϕ⧇ 1-āĻāϰ āϏāĻžāĻĨ⧇ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋāϰ āϏāĻžāĻĨ⧇ āϤ⧁āϞāύāĻž āĻ•āϰ⧇āĻ›āĻŋāĨ¤ āφāĻĒāύāĻŋ āύ⧀āĻšā§‡āϰ āϚāĻŋāĻ¤ā§āϰ 1 āĻ āĻĢāϞāĻžāĻĢāϞ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤ āĻŦāĻžāĻŽ āĻĻāĻŋāϕ⧇ y-āĻ…āĻ•ā§āώ⧇, āĻŦāĻžāϰāϗ⧁āϞāĻŋ āĻĒā§āϰāϤāĻŋ āϏ⧇āϕ⧇āĻ¨ā§āĻĄā§‡ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāϪ⧇āϰ āϜāĻ¨ā§āϝ āϚāĻŋāĻ¤ā§āϰ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž āωāĻĒāĻ¸ā§āĻĨāĻžāĻĒāύ āĻ•āϰ⧇, āϞāĻžāχāύāϗ⧁āϞāĻŋ āĻĄāĻžāύāĻĻāĻŋāϕ⧇ y-āĻ…āĻ•ā§āώ⧇ āĻ¸ā§āϕ⧇āϞāĻŋāĻ‚ āĻĻāĻ•ā§āώāϤāĻž (āĻ…āĻ°ā§āĻĨāĻžā§Ž āφāĻĻāĻ°ā§āĻļ āĻĨā§āϰ⧁āĻĒ⧁āϟ āĻĨ⧇āϕ⧇ āĻĒā§āϰāĻ•ā§ƒāϤ āĻ…āύ⧁āĻĒāĻžāϤ) āĻĒā§āϰāϤāĻŋāĻĢāϞāĻŋāϤ āĻ•āϰ⧇āĨ¤ āφāĻĒāύāĻŋ āĻĻ⧇āĻ–āϤ⧇ āĻĒāĻžāĻšā§āϛ⧇āύ, āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻžāϰ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ¸ā§āϕ⧇āϞāĻŋāĻ‚ āĻĻāĻ•ā§āώāϤāĻžāϕ⧇ āĻĒā§āϰāĻ­āĻžāĻŦāĻŋāϤ āĻ•āϰ⧇āĨ¤ āĻļ⧁āϧ⧁āĻŽāĻžāĻ¤ā§āϰ āĻāĻ•āϟāĻŋ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĨāĻžāĻ•āϞ⧇, āĻ¸ā§āϕ⧇āϞāĻŋāĻ‚ āĻĻāĻ•ā§āώāϤāĻž 38āϟāĻŋ GPU-āϤ⧇ 64% āĻ āύ⧇āĻŽā§‡ āϝāĻžāϝāĻŧāĨ¤ Horovod āĻāϰ āĻŽāϤ⧋ āĻāĻ•āχ āĻ¸ā§āϕ⧇āϞāĻŋāĻ‚ āĻĻāĻ•ā§āώāϤāĻž āĻ…āĻ°ā§āϜāύ āĻ•āϰāϤ⧇, āφāĻĒāύāĻžāϕ⧇ āĻ•āĻ°ā§āĻŽā§€āĻĻ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻžāϰ āϤ⧁āϞāύāĻžāϝāĻŧ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āϏāĻ‚āĻ–ā§āϝāĻž āĻĻā§āĻŦāĻŋāϗ⧁āĻŖ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

Apache MXNet āĻāĻŦāĻ‚ Horovod āĻāϰ āϏāĻžāĻĨ⧇ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻļāĻŋāĻ•ā§āώāĻž
āϚāĻŋāĻ¤ā§āϰ 1. Horovod āĻāĻŦāĻ‚ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ MXNet āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻļāĻŋāĻ•ā§āώāĻžāϰ āϤ⧁āϞāύāĻž

āύ⧀āĻšā§‡āϰ āϏāĻžāϰāĻŖā§€ 1-āĻ, 64āϟāĻŋ GPU-āϤ⧇ āĻĒāϰ⧀āĻ•ā§āώāĻž āϚāĻžāϞāĻžāύ⧋āϰ āϏāĻŽāϝāĻŧ āφāĻŽāϰāĻž āωāĻĻāĻžāĻšāϰāĻŖ āĻĒā§āϰāϤāĻŋ āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āϤ āĻ–āϰāĻšā§‡āϰ āϤ⧁āϞāύāĻž āĻ•āϰāĻŋāĨ¤ Horovod-āĻāϰ āϏāĻžāĻĨ⧇ MXNet āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϞ⧇ āϏāĻ°ā§āĻŦāύāĻŋāĻŽā§āύ āĻ–āϰāĻšā§‡ āϏ⧇āϰāĻž āĻĨā§āϰ⧁āĻĒ⧁āϟ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāĨ¤

Apache MXNet āĻāĻŦāĻ‚ Horovod āĻāϰ āϏāĻžāĻĨ⧇ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻļāĻŋāĻ•ā§āώāĻž
āϏāĻžāϰāĻŖāĻŋ 1. Horovod āĻāĻŦāĻ‚ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āϏāĻžāĻ°ā§āĻ­āĻžāϰ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āĻāĻ•āϟāĻŋ āϏāĻžāĻ°ā§āĻ­āĻžāϰ āĻĨ⧇āϕ⧇ āĻ•āĻ°ā§āĻŽā§€ āĻ…āύ⧁āĻĒāĻžāϤ 2 āĻĨ⧇āϕ⧇ 1 āĻāϰ āĻŽāĻ§ā§āϝ⧇ āĻ–āϰāĻšā§‡āϰ āϤ⧁āϞāύāĻžā§ˇ

āϧāĻžāĻĒ āĻĒ⧁āύāĻ°ā§āĻ—āĻ āύ āĻ•āϰ

āĻĒāϰāĻŦāĻ°ā§āϤ⧀ āϧāĻžāĻĒ⧇, āφāĻŽāϰāĻž āφāĻĒāύāĻžāϕ⧇ āĻĻ⧇āĻ–āĻžāĻŦ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ MXNet āĻāĻŦāĻ‚ Horovod āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦāĻŋāϤāϰāĻŖāĻ•ā§ƒāϤ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāϪ⧇āϰ āĻĢāϞāĻžāĻĢāϞ āĻĒ⧁āύāϰ⧁āĻ¤ā§āĻĒāĻžāĻĻāύ āĻ•āϰāĻž āϝāĻžāϝāĻŧāĨ¤ MXNet āĻāϰ āϏāĻžāĻĨ⧇ āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻŸā§‡āĻĄ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“ āϜāĻžāύāϤ⧇ āĻĒāĻĄāĻŧ⧁āύ āĻāχ āĻĒā§‹āĻ¸ā§āϟ.

āĻĒāχāĻ āĻž 1

āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻŸā§‡āĻĄ āĻŸā§āϰ⧇āύāĻŋāĻ‚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ MXNet āĻ­āĻžāĻ°ā§āϏāύ 1.4.0 āĻŦāĻž āϤāĻžāϰ āĻŦ⧇āĻļāĻŋ āĻāĻŦāĻ‚ Horovod āĻ­āĻžāĻ°ā§āϏāύ 0.16.0 āĻŦāĻž āϤāĻžāϰ āĻŦ⧇āĻļāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āϏāĻŽāϜāĻžāϤ⧀āϝāĻŧ āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ⧇āϰ āĻāĻ•āϟāĻŋ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύāĨ¤ GPU āĻŸā§āϰ⧇āύāĻŋāĻ‚āϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāϗ⧁āϞ⧋āĻ“ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤ āφāĻŽāĻžāĻĻ⧇āϰ āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏāϗ⧁āϞ⧋āϰ āϜāĻ¨ā§āϝ, āφāĻŽāϰāĻž āĻŦ⧇āϛ⧇ āύāĻŋāϝāĻŧ⧇āĻ›āĻŋ Ubuntu 16.04 LinuxGPU āĻĄā§āϰāĻžāχāĻ­āĻžāϰ 396.44, CUDA 9.2, cuDNN āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋ 7.2.1, NCCL āĻ•āĻŽāĻŋāωāύāĻŋāϕ⧇āϟāϰ 2.2.13 āĻāĻŦāĻ‚ OpenMPI 3.1.1 āϏāĻšāĨ¤ āφāĻĒāύāĻŋ āφāϰāĻ“ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύ āĻ…ā§āϝāĻžāĻŽāĻžāϜāύ āĻĄāĻŋāĻĒ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻāĻāĻŽāφāχ, āϝ⧇āĻ–āĻžāύ⧇ āĻāχ āϞāĻžāχāĻŦā§āϰ⧇āϰāĻŋāϗ⧁āϞāĻŋ āφāϗ⧇ āĻĨ⧇āϕ⧇āχ āχāύāĻ¸ā§āϟāϞ āĻ•āϰāĻž āφāϛ⧇⧎

āĻĒāχāĻ āĻž 2

āφāĻĒāύāĻžāϰ MXNet āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āĻŸā§‡ Horovod API-āĻāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰāĻžāϰ āĻ•ā§āώāĻŽāϤāĻž āϝ⧋āĻ— āĻ•āϰ⧁āύāĨ¤ MXNet Gluon API-āĻāϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āύ⧀āĻšā§‡āϰ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟāϟāĻŋ āĻāĻ•āϟāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻŸā§‡āĻŽāĻĒā§āϞ⧇āϟ āĻšāĻŋāϏāĻžāĻŦ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝ⧇āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āφāĻĒāύāĻžāϰ āϝāĻĻāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ āĻāĻ•āϟāĻŋ āϏāĻ‚āĻļā§āϞāĻŋāĻˇā§āϟ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻĨāĻžāϕ⧇ āϤāĻŦ⧇ āĻŦā§‹āĻ˛ā§āĻĄ āϞāĻžāχāύāϗ⧁āϞāĻŋ āĻĒā§āϰāϝāĻŧā§‹āϜāύ⧎ Horovod-āĻāϰ āϏāĻžāĻĨ⧇ āĻļ⧇āĻ–āĻžāϰ āϜāĻ¨ā§āϝ āφāĻĒāύāĻžāϕ⧇ āĻāĻ–āĻžāύ⧇ āĻ•āϝāĻŧ⧇āĻ•āϟāĻŋ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇:

  • āϏāĻ āĻŋāĻ• āĻ—ā§āϰāĻžāĻĢāĻŋāĻ•ā§āϏ āϕ⧋āϰ⧇ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āϏāĻžā§āϚāĻžāϞāĻŋāϤ āĻšāϝāĻŧ āϤāĻž āĻŦā§‹āĻāĻžāϰ āϜāĻ¨ā§āϝ āĻ¸ā§āĻĨāĻžāύ⧀āϝāĻŧ Horovod āĻ°â€Œā§āϝāĻžāĻ™ā§āĻ• (āϞāĻžāχāύ 8) āĻ…āύ⧁āϝāĻžāϝāĻŧā§€ āĻĒā§āϰāϏāĻ™ā§āĻ— āϏ⧇āϟ āĻ•āϰ⧁āύāĨ¤
  • āĻāĻ•āϜāύ āĻ•āĻ°ā§āĻŽā§€ āĻĨ⧇āϕ⧇ āϏāĻ•āϞ⧇āϰ āĻ•āĻžāϛ⧇ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋāϗ⧁āϞāĻŋ āĻĒāĻžāϏ āĻ•āϰ⧁āύ (āϞāĻžāχāύ 18) āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰāϤ⧇ āϝ⧇ āϏāĻŽāĻ¸ā§āϤ āĻ•āĻ°ā§āĻŽā§€ āĻāĻ•āχ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ• āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧇āĨ¤
  • āĻāĻ•āϟāĻŋ Horovod āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻŸā§‡āĻĄ āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜāĻžāϰ (āϞāĻžāχāύ 25) āĻāĻ•āϟāĻŋ āĻŦāĻŋāϤāϰāĻŖ āĻĒāĻĻā§āϧāϤāĻŋāϤ⧇ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āφāĻĒāĻĄā§‡āϟ āĻ•āϰāϤ⧇āĨ¤

āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻĒ⧇āϤ⧇, āĻ…āύ⧁āĻ—ā§āϰāĻš āĻ•āϰ⧇ Horovod-MXNet āωāĻĻāĻžāĻšāϰāĻŖāϗ⧁āϞāĻŋ āĻĒāĻĄāĻŧ⧁āύ āĻāĻŽāĻāύāφāχāĻāϏāϟāĻŋ и IMAGEnet.

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

āĻāĻŽāĻĒāĻŋāφāχ āύāĻŋāĻ°ā§āĻĻ⧇āĻļāĻŋāĻ•āĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇ āĻ•āĻ°ā§āĻŽā§€āĻĻ⧇āϰ āĻāĻ•āϜāύ⧇āϰ āϏāĻžāĻĨ⧇ āϞāĻ— āχāύ āĻ•āϰ⧁āύāĨ¤ āĻāχ āωāĻĻāĻžāĻšāϰāϪ⧇, āĻŦāĻŋāϤāϰāĻŖ āĻ•āϰāĻž āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āϚāĻžāϰāϟāĻŋ āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ⧇ āϚāϞ⧇ āĻĒā§āϰāϤāĻŋāϟāĻŋ 4āϟāĻŋ āϜāĻŋāĻĒāĻŋāχāω āϏāĻš, āĻāĻŦāĻ‚ āĻ•ā§āϞāĻžāĻ¸ā§āϟāĻžāϰ⧇ āĻŽā§‹āϟ 16āϟāĻŋ āϜāĻŋāĻĒāĻŋāχāωāĨ¤ āĻ¸ā§āϟāĻ•āĻžāĻ¸ā§āϟāĻŋāĻ• āĻ—ā§āϰ⧇āĻĄāĻŋāϝāĻŧ⧇āĻ¨ā§āϟ āĻĄāĻŋāϏ⧇āĻ¨ā§āϟ (SGD) āĻ…āĻĒā§āϟāĻŋāĻŽāĻžāχāϜāĻžāϰ āύāĻŋāĻŽā§āύāϞāĻŋāĻ–āĻŋāϤ āĻšāĻžāχāĻĒāĻžāϰāĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰāϗ⧁āϞāĻŋāϰ āϏāĻžāĻĨ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāĻŦ⧇:

  • āĻŽāĻŋāύāĻŋ-āĻŦā§āϝāĻžāĻšā§‡āϰ āφāĻ•āĻžāϰ: 256
  • āĻļ⧇āĻ–āĻžāϰ āĻšāĻžāϰ: 0.1
  • āĻ­āϰāĻŦ⧇āĻ—: 0.9
  • āĻ“āϜāύ āĻ•ā§āώāϝāĻŧ: 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 GPUs āĻĻā§āĻŦāĻžāϰāĻž āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ float64 āĻ—āĻŖāύāĻžāϰ āĻ—āϤāĻŋ āĻŦāĻžāĻĄāĻŧāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻĢāϰ⧋āϝāĻŧāĻžāĻ°ā§āĻĄ āĻĒāĻžāϏ⧇āϰ āϜāĻ¨ā§āϝ 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 āĻŽāĻĄā§‡āϞ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŋāϤ āĻšāϝāĻŧ⧇āĻ›āĻŋāϞāĨ¤ āφāĻŽāϰāĻž āĻāĻŽāύ āĻĒāĻĻāĻ•ā§āώ⧇āĻĒāϗ⧁āϞāĻŋāĻ“ āĻ…āĻ¨ā§āϤāĻ°ā§āϭ⧁āĻ•ā§āϤ āĻ•āϰ⧇āĻ›āĻŋ āϝāĻž āφāĻĒāύāĻŋ Horovod āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŽāĻžāĻ˛ā§āϟāĻŋ-āχāύāĻ¸ā§āĻŸā§āϝāĻžāĻ¨ā§āϏ āĻĒā§āϰāĻļāĻŋāĻ•ā§āώāĻŖ āϚāĻžāϞāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻŦāĻŋāĻĻā§āϝāĻŽāĻžāύ āĻ¸ā§āĻ•ā§āϰāĻŋāĻĒā§āϟ āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻ•āϰāϤ⧇ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āύāĨ¤

āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āϏāĻŦ⧇āĻŽāĻžāĻ¤ā§āϰ MXNet āĻāĻŦāĻ‚ āĻ—āĻ­ā§€āϰ āĻļāĻŋāĻ•ā§āώāĻž āύāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻ•āϰ⧇āύ, āϤāĻžāĻšāϞ⧇ āχāύāĻ¸ā§āϟāϞ⧇āĻļāύ āĻĒ⧃āĻˇā§āĻ āĻžāϝāĻŧ āϝāĻžāύ MXNeāĻĒā§āϰāĻĨāĻŽā§‡ MXNet āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇āĨ¤ āφāĻŽāϰāĻž āĻĻ⧃āĻĸāĻŧāĻ­āĻžāĻŦ⧇ āύāĻŋāĻŦāĻ¨ā§āϧ āĻĒāĻĄāĻŧāĻžāϰ āϏ⧁āĻĒāĻžāϰāĻŋāĻļ 60 āĻŽāĻŋāύāĻŋāĻŸā§‡āϰ āĻŽāĻ§ā§āϝ⧇ MXNetāĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇.

āφāĻĒāύāĻŋ āϝāĻĻāĻŋ āχāϤāĻŋāĻŽāĻ§ā§āϝ⧇āχ MXNet āĻāϰ āϏāĻžāĻĨ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇ āĻĨāĻžāϕ⧇āύ āĻāĻŦāĻ‚ Horovod-āĻāϰ āϏāĻžāĻĨ⧇ āĻĄāĻŋāĻ¸ā§āĻŸā§āϰāĻŋāĻŦāĻŋāωāĻŸā§‡āĻĄ āϞāĻžāĻ°ā§āύāĻŋāĻ‚ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰāϤ⧇ āϚāĻžāύ, āϤāĻžāĻšāϞ⧇ āĻĻ⧇āϖ⧁āύ Horovod āχāύāĻ¸ā§āϟāϞ⧇āĻļāύ āĻĒ⧃āĻˇā§āĻ āĻž, MXNet āĻĨ⧇āϕ⧇ āĻāϟāĻŋ āϤ⧈āϰāĻŋ āĻ•āϰ⧁āύ āĻāĻŦāĻ‚ āωāĻĻāĻžāĻšāϰāĻŖāϟāĻŋ āĻ…āύ⧁āϏāϰāĻŖ āĻ•āϰ⧁āύ āĻāĻŽāĻāύāφāχāĻāϏāϟāĻŋ āĻŦāĻž IMAGEnet.

* āĻ–āϰāĻšā§‡āϰ āωāĻĒāϰ āĻ­āĻŋāĻ¤ā§āϤāĻŋ āĻ•āϰ⧇ āĻ—āĻŖāύāĻž āĻ•āϰāĻž āĻšāϝāĻŧ āϘāĻ¨ā§āϟāĻž āĻšāĻžāϰ EC2 āĻĻ⧃āĻˇā§āϟāĻžāĻ¨ā§āϤ⧇āϰ āϜāĻ¨ā§āϝ AWS

āϕ⧋āĻ°ā§āϏ āϏāĻŽā§āĻĒāĻ°ā§āϕ⧇ āφāϰāĻ“ āϜāĻžāύ⧁āύ "āĻŦāĻŋāĻ— āĻĄā§‡āϟāĻžāϤ⧇ āĻļāĻŋāĻ˛ā§āĻĒ āĻāĻŽāĻāϞ"

āωāĻ¤ā§āϏ: www.habr.com

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster