Apache MXNet සහ Horovod සමඟ බෙදා හරින ලද ඉගෙනීම

පාඨමාලා ආරම්භයට ආසන්න දිනක ලිපියේ පරිවර්තනය සකස් කරන ලදී "විශාල දත්ත මත කාර්මික ML"

බහුවිධ ඉහළ කාර්ය සාධනයක් සහිත පරිගණක අවස්ථා පිළිබඳ බෙදා හරින ලද පුහුණුව මගින් නවීන ගැඹුරු ස්නායුක ජාල වල විශාල දත්ත ප්‍රමාණයකින් සති සිට පැය හෝ මිනිත්තු දක්වා පුහුණු කිරීමේ කාලය අඩු කළ හැකි අතර, මෙම පුහුණු ක්‍රමය ගැඹුරු ඉගෙනීමේ ප්‍රායෝගික යෙදුම්වල ප්‍රචලිත කරයි. බහුවිධ අවස්ථා හරහා දත්ත හුවමාරු කර සමමුහුර්ත කරන්නේ කෙසේද යන්න පරිශීලකයින් තේරුම් ගත යුතු අතර, එය පරිමාණයේ කාර්යක්ෂමතාවයට විශාල බලපෑමක් ඇති කරයි. ඊට අමතරව, එක් අවස්ථාවකදී බහුවිධ අවස්ථා දක්වා ධාවනය වන පුහුණු ස්ක්‍රිප්ට් එකක් යෙදවීමටද පරිශීලකයන් දැන සිටිය යුතුය.

මෙම ලිපියෙන් අපි විවෘත ගැඹුරු ඉගෙනුම් පුස්තකාලය Apache MXNet සහ Horovod බෙදා හරින ලද ඉගෙනුම් රාමුව භාවිතයෙන් ඉගෙනීම බෙදා හැරීමට ඉක්මන් සහ පහසු ක්රමයක් ගැන කතා කරමු. අපි Horovod රාමුවේ කාර්ය සාධන ප්‍රතිලාභ පැහැදිලිව පෙන්නුම් කරන අතර එය Horovod සමඟ බෙදා හරින ලද ආකාරයෙන් ක්‍රියා කරන පරිදි MXNet පුහුණු පිටපතක් ලියන ආකාරය නිරූපණය කරන්නෙමු.

Apache MXNet යනු කුමක්ද?

Apache MX Net ගැඹුරු ස්නායුක ජාල නිර්මාණය කිරීමට, පුහුණු කිරීමට සහ යෙදවීමට භාවිතා කරන විවෘත මූලාශ්‍ර ගැඹුරු ඉගෙනුම් රාමුවකි. MXNet ස්නායුක ජාල ක්‍රියාත්මක කිරීම හා සම්බන්ධ සංකීර්ණතා සාරාංශ කරයි, ඉහළ කාර්ය සාධනයක් සහ පරිමාණය කළ හැකි අතර, වැනි ජනප්‍රිය ක්‍රමලේඛන භාෂා සඳහා API ලබා දෙයි Python මීට උදාහරණ, සී ++, Clojure, ජාවා, ජූලියා, R, පරිමාණය සහ වෙනත් අය.

පරාමිති සේවාදායකය සමඟ MXNet හි බෙදා හරින ලද පුහුණුව

MXNet හි සම්මත බෙදාහැරීමේ ඉගෙනුම් මොඩියුලය පරාමිති සේවාදායක ප්‍රවේශයක් භාවිතා කරයි. එය එක් එක් සේවකයාගෙන් අනුක්‍රමික එකතු කිරීමට, එකතු කිරීම සිදු කිරීමට, සහ ඊළඟ ප්‍රශස්තිකරණ පුනරාවර්තනය සඳහා කම්කරුවන් වෙත යාවත්කාලීන කළ අනුක්‍රමික ආපසු යැවීමට පරාමිති සේවාදායක කට්ටලයක් භාවිත කරයි. සේවකයින්ට සේවාදායකයන්ගේ නිවැරදි අනුපාතය තීරණය කිරීම ඵලදායී පරිමාණය සඳහා යතුරයි. එක් පරාමිති සේවාදායකයක් පමණක් තිබේ නම්, එය ගණනය කිරීම් වලදී බාධාවක් විය හැකිය. අනෙක් අතට, බොහෝ සේවාදායකයන් භාවිතා කරන්නේ නම්, බොහෝ සිට බොහෝ සන්නිවේදනයන් සියලු ජාල සම්බන්ධතා අවහිර කළ හැකිය.

Horovod යනු කුමක්ද?

හොරොවොඩ් Uber හි සංවර්ධනය කරන ලද විවෘත බෙදා හරින ලද ගැඹුරු ඉගෙනුම් රාමුවකි. එය vorecs හරහා ආකෘති පරාමිතීන් බෙදා හැරීමට සහ එකතු කිරීමට NVIDIA Collective Communications Library (NCCL) සහ Message Passing Interface (MPI) වැනි කාර්යක්ෂම හරස් GPU සහ හරස්-නෝඩ් තාක්ෂණයන් භාවිතා කරයි. ගැඹුරු ස්නායුක ජාල ආකෘති සමඟ වැඩ කිරීමේදී එය ජාල කලාප පළල සහ පරිමාණයන් භාවිතා කිරීම ප්‍රශස්ත කරයි. එය දැනට ජනප්‍රිය යන්ත්‍ර ඉගෙනුම් රාමු කිහිපයකට සහය දක්වයි, එනම් MX Net, Tensorflow, Keras, සහ PyTorch.

MXNet සහ Horovod ඒකාබද්ධ කිරීම

MXNet Horovod හි අර්ථ දක්වා ඇති Distributed Learning API හරහා Horovod සමඟ ඒකාබද්ධ වේ. Horovod සන්නිවේදන API horovod.broadcast(), horovod.allgather() и horovod.allreduce() එහි කාර්ය ප්‍රස්ථාරයේ කොටසක් ලෙස MXNet එන්ජිමේ අසමමුහුර්ත ඇමතුම් භාවිතයෙන් ක්‍රියාත්මක කරන ලදී. මේ ආකාරයෙන්, සමමුහුර්තකරණය හේතුවෙන් කාර්ය සාධන පාඩු වළක්වා ගැනීම සඳහා MXNet එන්ජිම මගින් සන්නිවේදනය සහ ගණනය කිරීම් අතර දත්ත පරායත්තතා පහසුවෙන් හසුරුවනු ලැබේ. Horovod හි අර්ථ දක්වා ඇති Distributed optimizer වස්තුව horovod.Distributed Optimizer පුළුල් කරයි ප්‍රශස්තකරණය MXNet හි එය බෙදා හරින ලද පරාමිති යාවත්කාලීන කිරීම් සඳහා අනුරූප Horovod APIs කැඳවයි. මෙම සියලුම ක්‍රියාත්මක කිරීමේ විස්තර අවසාන පරිශීලකයින් සඳහා විනිවිද පෙනෙන වේ.

වේගවත් ආරම්භය

ඔබට ඔබේ 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 ස්ථාපනය 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

කාර්ය සාධන නිරූපණය

අවස්ථා අටක් සමඟ 50 GPU වල ImageNet දත්ත කට්ටලයක් මත ResNet1-v64 ආකෘතියක් පුහුණු කරන විට p3.16x විශාලයි EC2, AWS ක්ලවුඩ් මත NVIDIA Tesla V8 GPUs 100ක් අඩංගු වන අතර, අපි තත්පරයට රූප 45000ක (එනම්, තත්පරයකට පුහුණු කළ සාම්පල ගණන) පුහුණු ප්‍රතිදානයක් ලබා ගත්තෙමු. 44%ක හොඳම නිරවද්‍යතාවයකින් යුග 90කට පසු විනාඩි 75.7කින් පුහුණුව අවසන් කරන ලදී.

අපි මෙය MXNet හි බෙදා හරින ලද පුහුණු ප්‍රවේශය සමඟ සංසන්දනය කළෙමු, 8, 16, 32 සහ 64 GPUs මත තනි පරාමිති සේවාදායකයක් සහ සේවාදායකයට සේවක අනුපාතය 1 සිට 1 සහ 2 සිට 1 දක්වා වන පරාමිති සේවාදායක භාවිතා කිරීමේ පුහුණු ප්‍රවේශය. ඔබට පහත රූප සටහන 1 හි ප්රතිඵලය දැක ගත හැකිය. වම් පස ඇති y-අක්ෂයේ, තීරු මඟින් තත්පරයකට පුහුණු කළ යුතු රූප සංඛ්‍යාව නිරූපණය කරයි, රේඛා දකුණේ y-අක්ෂයේ පරිමාණ කිරීමේ කාර්යක්ෂමතාව (එනම්, සත්‍ය සහ පරමාදර්ශී ප්‍රතිදානයේ අනුපාතය) පිළිබිඹු කරයි. ඔබට පෙනෙන පරිදි, සේවාදායක සංඛ්යාව තෝරාගැනීම පරිමාණයේ කාර්යක්ෂමතාවයට බලපායි. ඇත්තේ එක් පරාමිති සේවාදායකයක් නම්, GPU 38 මත පරිමාණ කිරීමේ කාර්යක්ෂමතාව 64% දක්වා පහත වැටේ. Horovod සමඟ සමාන පරිමාණ කිරීමේ කාර්යක්ෂමතාවයක් ලබා ගැනීම සඳහා, ඔබ සේවකයින් සංඛ්යාවට සාපේක්ෂව සේවාදායක සංඛ්යාව දෙගුණ කළ යුතුය.

Apache MXNet සහ Horovod සමඟ බෙදා හරින ලද ඉගෙනීම
රූපය 1. MXNet භාවිතා කරමින් බෙදා හරින ලද ඉගෙනීම Horovod සහ පරාමිති සේවාදායකය සමඟ සංසන්දනය කිරීම

පහත වගුවේ 1, අපි 64 GPU මත අත්හදා බැලීම් ධාවනය කරන විට එක් අවස්ථාවක අවසාන පිරිවැය සංසන්දනය කරමු. Horovod සමඟ MXNet භාවිතා කිරීම අඩුම මිලට හොඳම ප්‍රතිදානය සපයයි.

Apache MXNet සහ Horovod සමඟ බෙදා හරින ලද ඉගෙනීම
වගුව 1. Horovod සහ Parameter Server අතර පිරිවැය සංසන්දනය කිරීම සේවාදායකයට සේවක අනුපාතය 2 සිට 1 දක්වා.

ප්රතිනිෂ්පාදනය සඳහා පියවර

මීළඟ පියවරේදී, MXNet සහ Horovod භාවිතයෙන් බෙදා හරින ලද පුහුණුවේ ප්රතිඵලය ප්රතිනිෂ්පාදනය කරන්නේ කෙසේදැයි අපි ඔබට පෙන්වන්නෙමු. MXNet කියවීම සමඟ බෙදා හරින ලද ඉගෙනීම පිළිබඳ වැඩිදුර දැන ගැනීමට මෙම තනතුර.

පියවරක් 1

බෙදා හරින ලද ඉගෙනීම භාවිතා කිරීමට MXNet අනුවාදය 1.4.0 හෝ ඊට වැඩි සහ Horovod අනුවාදය 0.16.0 හෝ ඊට වැඩි සමග සමජාතීය අවස්ථා සමූහයක් සාදන්න. ඔබට GPU පුහුණුව සඳහා පුස්තකාල ස්ථාපනය කිරීමටද අවශ්‍ය වනු ඇත. අපගේ උදාහරණ සඳහා, අපි GPU Driver 16.04, CUDA 396.44, cuDNN 9.2 පුස්තකාලය, NCCL 7.2.1 සන්නිවේදකය සහ OpenMPI 2.2.13 සමඟ Ubuntu 3.1.1 Linux තෝරා ගත්තෙමු. එසේම ඔබට භාවිතා කළ හැකිය Amazon Deep Learning AMI, මෙම පුස්තකාල දැනටමත් පූර්ව ස්ථාපනය කර ඇත.

පියවරක් 2

ඔබේ MXNet පුහුණු පිටපතට Horovod API සමඟ වැඩ කිරීමේ හැකියාව එක් කරන්න. MXNet Gluon API මත පදනම් වූ පහත ස්ක්‍රිප්ටය සරල අච්චුවක් ලෙස භාවිතා කළ හැක. ඔබට දැනටමත් අනුරූප පුහුණු පිටපතක් තිබේ නම් තද අකුරින් රේඛා අවශ්ය වේ. Horovod සමඟ ඉගෙන ගැනීමට ඔබ කළ යුතු තීරණාත්මක වෙනස්කම් කිහිපයක් මෙන්න:

  • නිවැරදි ග්‍රැෆික් හරය මත පුහුණුව සිදු කරන බව තේරුම් ගැනීමට දේශීය Horovod ශ්‍රේණිය (8 පේළිය) අනුව සන්දර්භය සකසන්න.
  • සියලුම සේවකයින් එකම ආරම්භක පරාමිතීන් සමඟ ආරම්භ වන බව සහතික කිරීම සඳහා එක් සේවකයෙකුගෙන් සියලු දෙනාටම මූලික පරාමිතීන් ලබා දෙන්න (පේළිය 18).
  • Horovod එකක් සාදන්න Distributed Optimizer (පේළිය 25) බෙදා හරින ලද ආකාරයෙන් පරාමිති යාවත්කාලීන කිරීමට.

සම්පූර්ණ පිටපත ලබා ගැනීමට, කරුණාකර Horovod-MXNet උදාහරණ වෙත යොමු වන්න MNIST и 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

MPI විධානය භාවිතයෙන් බෙදා හරින ලද පුහුණුව ආරම්භ කිරීමට එක් සේවකයෙකු වෙත ලොග් වන්න. මෙම උදාහරණයේ දී, බෙදා හරින ලද පුහුණුව එක් එක් GPU 4 බැගින් සහ පොකුරේ මුළු GPU 16 ක් සමඟ අවස්ථා හතරක් මත ධාවනය වේ. Stochastic Gradient Descent (SGD) ප්‍රශස්තකාරකය පහත අධිපරාමිතීන් සමඟ භාවිතා කරනු ඇත:

  • කුඩා කණ්ඩායම් ප්‍රමාණය: 256
  • ඉගෙනීමේ අනුපාතය: 0.1
  • ගම්යතාව: 0.9
  • බර ක්ෂය වීම: 0.0001

අපි GPU එකක සිට GPU 64 දක්වා පරිමාණය කරන විට, අපි GPU සංඛ්‍යාව අනුව පුහුණු අනුපාතය රේඛීයව පරිමාණය කළෙමු (0,1 GPU සඳහා 1 සිට 6,4 GPU සඳහා 64 දක්වා), GPU එකකට රූප ගණන 256 ලෙස තබා ගනිමින් (කණ්ඩායමකින් 256 GPU සඳහා රූප 1 සිට GPU 16 සඳහා 384 දක්වා). GPU සංඛ්‍යාව වැඩි වන විට බර ක්ෂය වීම සහ ගම්‍යතා පරාමිතීන් වෙනස් විය. NVIDIA Tesla GPUs මගින් සහය දක්වන float64 ගණනය කිරීම් වේගවත් කිරීම සඳහා අපි Forward pass සඳහා 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 සහ ගැඹුරු ඉගෙනීම සමඟ ආරම්භ කරන්නේ නම්, ස්ථාපන පිටුවට යන්න MXNeමුලින්ම MXNet හදන්න. ලිපිය කියවීම ද අපි තරයේ නිර්දේශ කරමු MXNet මිනිත්තු 60 කින්ආරම්භ කිරීමට.

ඔබ දැනටමත් MXNet සමඟ වැඩ කර ඇත්නම් සහ Horovod සමඟ බෙදා හැරීමට උත්සාහ කිරීමට අවශ්‍ය නම්, පසුව බලන්න Horovod ස්ථාපන පිටුව, එය MXNet වෙතින් ගොඩනඟා ආදර්ශය අනුගමනය කරන්න MNIST හෝ ImageNet.

* පිරිවැය ගණනය කරනු ලබන්නේ මත පදනම්වය පැයක ගාස්තු EC2 අවස්ථා සඳහා AWS

පාඨමාලාව ගැන තව දැනගන්න "විශාල දත්ත මත කාර්මික ML"

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න