පාඨමාලා ආරම්භයට ආසන්න දිනක ලිපියේ පරිවර්තනය සකස් කරන ලදී
බහුවිධ ඉහළ කාර්ය සාධනයක් සහිත පරිගණක අවස්ථා පිළිබඳ බෙදා හරින ලද පුහුණුව මගින් නවීන ගැඹුරු ස්නායුක ජාල වල විශාල දත්ත ප්රමාණයකින් සති සිට පැය හෝ මිනිත්තු දක්වා පුහුණු කිරීමේ කාලය අඩු කළ හැකි අතර, මෙම පුහුණු ක්රමය ගැඹුරු ඉගෙනීමේ ප්රායෝගික යෙදුම්වල ප්රචලිත කරයි. බහුවිධ අවස්ථා හරහා දත්ත හුවමාරු කර සමමුහුර්ත කරන්නේ කෙසේද යන්න පරිශීලකයින් තේරුම් ගත යුතු අතර, එය පරිමාණයේ කාර්යක්ෂමතාවයට විශාල බලපෑමක් ඇති කරයි. ඊට අමතරව, එක් අවස්ථාවකදී බහුවිධ අවස්ථා දක්වා ධාවනය වන පුහුණු ස්ක්රිප්ට් එකක් යෙදවීමටද පරිශීලකයන් දැන සිටිය යුතුය.
මෙම ලිපියෙන් අපි විවෘත ගැඹුරු ඉගෙනුම් පුස්තකාලය Apache MXNet සහ Horovod බෙදා හරින ලද ඉගෙනුම් රාමුව භාවිතයෙන් ඉගෙනීම බෙදා හැරීමට ඉක්මන් සහ පහසු ක්රමයක් ගැන කතා කරමු. අපි Horovod රාමුවේ කාර්ය සාධන ප්රතිලාභ පැහැදිලිව පෙන්නුම් කරන අතර එය Horovod සමඟ බෙදා හරින ලද ආකාරයෙන් ක්රියා කරන පරිදි MXNet පුහුණු පිටපතක් ලියන ආකාරය නිරූපණය කරන්නෙමු.
Apache MXNet යනු කුමක්ද?
පරාමිති සේවාදායකය සමඟ MXNet හි බෙදා හරින ලද පුහුණුව
Horovod යනු කුමක්ද?
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
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 සමඟ සමාන පරිමාණ කිරීමේ කාර්යක්ෂමතාවයක් ලබා ගැනීම සඳහා, ඔබ සේවකයින් සංඛ්යාවට සාපේක්ෂව සේවාදායක සංඛ්යාව දෙගුණ කළ යුතුය.
රූපය 1. MXNet භාවිතා කරමින් බෙදා හරින ලද ඉගෙනීම Horovod සහ පරාමිති සේවාදායකය සමඟ සංසන්දනය කිරීම
පහත වගුවේ 1, අපි 64 GPU මත අත්හදා බැලීම් ධාවනය කරන විට එක් අවස්ථාවක අවසාන පිරිවැය සංසන්දනය කරමු. Horovod සමඟ MXNet භාවිතා කිරීම අඩුම මිලට හොඳම ප්රතිදානය සපයයි.
වගුව 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 තෝරා ගත්තෙමු. එසේම ඔබට භාවිතා කළ හැකිය
පියවරක් 2
ඔබේ MXNet පුහුණු පිටපතට Horovod API සමඟ වැඩ කිරීමේ හැකියාව එක් කරන්න. MXNet Gluon API මත පදනම් වූ පහත ස්ක්රිප්ටය සරල අච්චුවක් ලෙස භාවිතා කළ හැක. ඔබට දැනටමත් අනුරූප පුහුණු පිටපතක් තිබේ නම් තද අකුරින් රේඛා අවශ්ය වේ. Horovod සමඟ ඉගෙන ගැනීමට ඔබ කළ යුතු තීරණාත්මක වෙනස්කම් කිහිපයක් මෙන්න:
- නිවැරදි ග්රැෆික් හරය මත පුහුණුව සිදු කරන බව තේරුම් ගැනීමට දේශීය Horovod ශ්රේණිය (8 පේළිය) අනුව සන්දර්භය සකසන්න.
- සියලුම සේවකයින් එකම ආරම්භක පරාමිතීන් සමඟ ආරම්භ වන බව සහතික කිරීම සඳහා එක් සේවකයෙකුගෙන් සියලු දෙනාටම මූලික පරාමිතීන් ලබා දෙන්න (පේළිය 18).
- Horovod එකක් සාදන්න Distributed Optimizer (පේළිය 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 විධානය භාවිතයෙන් බෙදා හරින ලද පුහුණුව ආරම්භ කිරීමට එක් සේවකයෙකු වෙත ලොග් වන්න. මෙම උදාහරණයේ දී, බෙදා හරින ලද පුහුණුව එක් එක් 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 සහ ගැඹුරු ඉගෙනීම සමඟ ආරම්භ කරන්නේ නම්, ස්ථාපන පිටුවට යන්න
ඔබ දැනටමත් MXNet සමඟ වැඩ කර ඇත්නම් සහ Horovod සමඟ බෙදා හැරීමට උත්සාහ කිරීමට අවශ්ය නම්, පසුව බලන්න
* පිරිවැය ගණනය කරනු ලබන්නේ මත පදනම්වය
පාඨමාලාව ගැන තව දැනගන්න
මූලාශ්රය: www.habr.com