ဆောင်းပါး၏ဘာသာပြန်ကို သင်တန်းစသည့်နေ့တွင် ပြင်ဆင်ခဲ့ပါသည်။
စွမ်းဆောင်ရည်မြင့် ကွန်ပြူတာ ဖြစ်ရပ်များစွာတွင် ဖြန့်ဝေထားသော လေ့ကျင့်ရေးသည် ဒေတာအမြောက်အများကို ရက်သတ္တပတ်မှ နာရီအထိ သို့မဟုတ် မိနစ်အထိ ခေတ်မီနက်ရှိုင်းသော အာရုံကြောကွန်ရက်များ၏ လေ့ကျင့်ချိန်ကို လျှော့ချနိုင်ပြီး၊ ဤလေ့ကျင့်ရေးနည်းစနစ်သည် နက်နဲသောသင်ယူမှုကို လက်တွေ့အသုံးချမှုတွင် ပျံ့နှံ့စေပါသည်။ အသုံးပြုသူများသည် များပြားလှသော သာဓကများတစ်လျှောက် ဒေတာများကို မျှဝေခြင်းနှင့် တစ်ပြိုင်တည်းလုပ်နည်းကို နားလည်ရမည်ဖြစ်ပြီး၊ ၎င်းသည် စကေးချဲ့ခြင်းထိရောက်မှုအပေါ် ကြီးမားသောအကျိုးသက်ရောက်မှုရှိသည်။ ထို့အပြင်၊ အသုံးပြုသူများသည် instance တစ်ခုတည်းတွင်အလုပ်လုပ်သောလေ့ကျင့်ရေး script ကိုမည်သို့အသုံးပြုရမည်ကိုသိသင့်သည်။
ဤဆောင်းပါးတွင် Apache MXNet နှင့် Horovod ဖြန့်ဝေသင်ကြားမှုဘောင်ကို အသုံးပြု၍ သင်ယူမှုဖြန့်ဝေရန် လွယ်ကူမြန်ဆန်သောနည်းလမ်းအကြောင်း ဆွေးနွေးပါမည်။ Horovod မူဘောင်၏ စွမ်းဆောင်ရည် အကျိုးကျေးဇူးများကို ရှင်းရှင်းလင်းလင်း သရုပ်ပြပြီး MXNet လေ့ကျင့်ရေး ဇာတ်ညွှန်းရေးသားနည်းကို Horovod နှင့် ဖြန့်ဝေသည့်ပုံစံဖြင့် လုပ်ဆောင်သွားမည်ဖြစ်သည်။
Apache MXNet ဆိုတာဘာလဲ
နက်ရှိုင်းသော အာရုံကြောကွန်ရက်များကို ဖန်တီးရန်၊ လေ့ကျင့်ရန်နှင့် အသုံးပြုရန် အသုံးပြုသည့် open-source နက်နဲသောသင်ယူမှုဘောင်တစ်ခုဖြစ်သည်။ MXNet သည် အာရုံကြောကွန်ရက်များကို အကောင်အထည်ဖော်ခြင်းနှင့် ဆက်စပ်နေသော ရှုပ်ထွေးမှုများကို ကောက်နုတ်ဖော်ပြသည်၊ အလွန်စွမ်းဆောင်ရည်ရှိပြီး အရွယ်အစားမှာ အသုံးပြုနိုင်သည့်အပြင် နာမည်ကြီး ပရိုဂရမ်းမင်းဘာသာစကားများကဲ့သို့သော APIs များကို ပံ့ပိုးပေးပါသည်။ , , , , , , နှင့်အခြားသူများ။
ကန့်သတ်ဆာဗာဖြင့် MXNet တွင် ဖြန့်ဝေထားသော သင်တန်း
ကန့်သတ်ဆာဗာချဉ်းကပ်မှုကိုအသုံးပြုသည်။ ၎င်းသည် အလုပ်သမားတစ်ဦးစီမှ gradients များကို စုဆောင်းရန်၊ စုစည်းမှုလုပ်ဆောင်ရန်နှင့် ပြုပြင်မွမ်းမံမှု ထပ်လုပ်ရန်အတွက် အလုပ်သမားများထံ ပြန်ပို့ပေးရန် ပါရာမီတာဆာဗာအစုံကို အသုံးပြုသည်။ လုပ်သားများနှင့် ဆာဗာများ၏ မှန်ကန်သောအချိုးအစားကို သတ်မှတ်ခြင်းသည် ထိရောက်သော အတိုင်းအတာအတွက် သော့ချက်ဖြစ်သည်။ ပါရာမီတာဆာဗာတစ်ခုသာရှိလျှင် တွက်ချက်မှုများတွင် ပိတ်ဆို့မှုတစ်ခုဖြစ်လာနိုင်သည်။ အပြန်အလှန်အားဖြင့် ဆာဗာများကို အလွန်အကျွံအသုံးပြုပါက၊ အများအပြားမှ ဆက်သွယ်မှုအများအပြားသည် ကွန်ရက်ချိတ်ဆက်မှုအားလုံးကို ပိတ်ဆို့သွားနိုင်သည်။
Horovod ဆိုတာဘာလဲ
Uber မှ ဖန်တီးထားသော ပွင့်လင်းသော ဖြန့်ဝေနက်နဲသော သင်ယူမှုမူဘောင်တစ်ခုဖြစ်သည်။ ၎င်းသည် NVIDIA Collective Communications Library (NCCL) နှင့် Message Passing Interface (MPI) ကဲ့သို့သော ထိရောက်သော cross-GPU နှင့် cross-node နည်းပညာများကို အသုံးချပြီး vorecs တစ်လျှောက် မော်ဒယ်ဘောင်များကို ဖြန့်ဝေပြီး စုစည်းထားသည်။ ၎င်းသည် နက်နဲသော အာရုံကြောကွန်ရက်မော်ဒယ်များနှင့် အလုပ်လုပ်သောအခါတွင် ကွန်ရက် bandwidth နှင့် စကေးများအသုံးပြုမှုကို ကောင်းမွန်အောင်ပြုလုပ်ပေးသည်။ လက်ရှိတွင် ၎င်းသည် လူကြိုက်များသော စက်သင်ယူမှုဘောင်များကို ပံ့ပိုးပေးသည်။ ၊ Tensorflow၊ Keras နှင့် PyTorch။
MXNet နှင့် Horovod ပေါင်းစပ်မှု
MXNet သည် Horovod တွင်သတ်မှတ်ထားသော Distributed Learning APIs မှတဆင့် Horovod နှင့် ပေါင်းစပ်ထားသည်။ Horovod ဆက်သွယ်ရေး API များ horovod.broadcast(), horovod.allgather() и horovod.allreduce() ၎င်း၏လုပ်ငန်းဆောင်တာဂရပ်၏တစ်စိတ်တစ်ပိုင်းအနေဖြင့် MXNet အင်ဂျင်၏ အဆက်မပြတ်ခေါ်ဆိုမှုများကို အသုံးပြု၍ လုပ်ဆောင်ခဲ့သည်။ ဤနည်းအားဖြင့်၊ ချိတ်ဆက်မှုနှင့် တွက်ချက်မှုကြားတွင် ဒေတာမှီခိုမှုကို MXNet အင်ဂျင်က အလွယ်တကူ ကိုင်တွယ်နိုင်သောကြောင့် စွမ်းဆောင်ရည်ဆုံးရှုံးမှုများကို ရှောင်ရှားနိုင်သည်။ Horovod တွင် သတ်မှတ်ထားသော ဖြန့်ဝေထားသော optimizer အရာဝတ္ထု horovod.DistributedOptimizer ချဲ့ထွင်သည်။ Optimizer MXNet တွင် ဖြန့်ဝေထားသော ကန့်သတ်ချက်မွမ်းမံမှုများအတွက် သက်ဆိုင်ရာ Horovod APIs များကို ခေါ်သည်။ ဤအကောင်အထည်ဖော်မှုအသေးစိတ်အချက်များအားလုံးသည် သုံးစွဲသူများအတွက် ပွင့်လင်းမြင်သာမှုရှိပါသည်။
အမြန်စတင်ပါ။
သင့် MacBook ပေါ်ရှိ MXNet နှင့် Horovod ကို အသုံးပြု၍ MNIST ဒေတာအတွဲတွင် သေးငယ်သော convolutional neural network ကို လျင်မြန်စွာ စတင်လေ့ကျင့်နိုင်ပါသည်။
ပထမဦးစွာ PyPI မှ mxnet နှင့် horovod ကို install လုပ်ပါ။
pip install mxnet
pip install horovodမှတ်ချက်- ကာလအတွင်း အမှားအယွင်းတစ်ခု ကြုံတွေ့ရပါက၊ pip horovod ကို install လုပ်ပါ။သင် variable တစ်ခုထည့်ရန် လိုအပ်ပါသည်။ MACOSX_DEPLOYMENT_TARGET=10.vvဘယ်မှာ vv - ဤသည်မှာ သင်၏ MacOS ဗားရှင်း၏ ဗားရှင်းဖြစ်သည်၊ ဥပမာ၊ MacOSX Sierra အတွက် သင်ရေးသားရန် လိုအပ်မည်ဖြစ်သည်။ MACOSX_DEPLOYMENT_TARGET=10.12 pip horovod ကို ထည့်သွင်းပါ။
ထို့နောက် OpenMPI ကို install လုပ်ပါ။ .
အဆုံးတွင်၊ စမ်းသပ်မှု script ကိုဒေါင်းလုဒ်လုပ်ပါ။ mxnet_mnist.py ပြီးလျှင် အလုပ်လမ်းညွှန်တွင် MacBook terminal တွင် အောက်ပါ command များကို run ပါ။
mpirun -np 2 -H localhost:2 -bind-to none -map-by slot python mxnet_mnist.py၎င်းသည် သင်၏ပရိုဆက်ဆာ၏ core နှစ်ခုပေါ်တွင် လေ့ကျင့်မှုကို လုပ်ဆောင်မည်ဖြစ်သည်။ output သည် အောက်ပါအတိုင်း ဖြစ်လိမ့်မည်။
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 ခုရှိ ImageNet dataset တစ်ခုတွင် ResNet1-v64 မော်ဒယ်ကို လေ့ကျင့်ပေးသောအခါ p3.16xlarge AWS cloud ရှိ NVIDIA Tesla V2 GPUs 8 ခု ပါဝင်သော EC100 တစ်ခုစီတွင် ကျွန်ုပ်တို့သည် 45000 ရုပ်ပုံ/sec ဖြင့် လေ့ကျင့်သင်ကြားမှုကို ရရှိခဲ့သည် (ဆိုလိုသည်မှာ တစ်စက္ကန့်လျှင် လေ့ကျင့်ထားသော နမူနာအရေအတွက်)။ အကောင်းဆုံးတိကျမှု 44% ဖြင့် အချိန် 90 ပြီးနောက် 75.7 မိနစ်တွင် လေ့ကျင့်ရေးပြီးဆုံးခဲ့သည်။
၎င်းကို ကန့်သတ်ဆာဗာတစ်ခုနှင့် 8၊ 16၊ 32၊ 64 နှင့် 1 GPU များတွင် အသုံးပြုသည့် MXNet ၏ဖြန့်ဝေလေ့ကျင့်ရေးချဉ်းကပ်ပုံနှင့် နှိုင်းယှဉ်ပါသည်။ ရလဒ်ကို အောက်ပါပုံ ၁ တွင် ကြည့်ရှုနိုင်ပါသည်။ ဘယ်ဘက်ရှိ y-ဝင်ရိုးတွင်၊ ဘားများသည် တစ်စက္ကန့်လျှင် လေ့ကျင့်ရန် ပုံအရေအတွက်ကို ကိုယ်စားပြုသည်၊ လိုင်းများသည် ညာဘက်ရှိ y-ဝင်ရိုးရှိ အတိုင်းအတာထိရောက်မှု (ဆိုလိုသည်မှာ၊ အမှန်တကယ် စံပြထုတ်လွှင့်မှုအချိုး) ကို ထင်ဟပ်စေသည်။ သင်တွေ့မြင်ရသည့်အတိုင်း၊ ဆာဗာအရေအတွက်၏ရွေးချယ်မှုသည် အတိုင်းအတာချဲ့ထွင်မှုအပေါ် သက်ရောက်မှုရှိသည်။ ပါရာမီတာဆာဗာတစ်ခုသာရှိပါက၊ အတိုင်းအတာစွမ်းဆောင်ရည်သည် 1% သို့ 2 GPUs သို့ကျဆင်းသွားသည်။ Horovod ကဲ့သို့ တူညီသော အတိုင်းအတာထိရောက်မှုရရှိရန်၊ အလုပ်သမားအရေအတွက်နှင့် ဆက်စပ်သော ဆာဗာအရေအတွက် နှစ်ဆလိုအပ်သည်။

ပုံ 1. Horovod နှင့် ပါရာမီတာဆာဗာဖြင့် MXNet ကို အသုံးပြု၍ ဖြန့်ဝေသင်ကြားမှုကို နှိုင်းယှဉ်ခြင်း။
အောက်ဖော်ပြပါဇယား 1 တွင်၊ ကျွန်ုပ်တို့သည် GPU 64 ခုပေါ်တွင် စမ်းသပ်မှုများ လုပ်ဆောင်သည့်အခါ နောက်ဆုံးကုန်ကျစရိတ်ကို နှိုင်းယှဉ်ပါသည်။ Horovod ဖြင့် MXNet ကိုအသုံးပြုခြင်းသည် ကုန်ကျစရိတ်အနည်းဆုံးဖြင့် အကောင်းဆုံးဖြတ်သန်းမှုကို ထောက်ပံ့ပေးသည်။

ဇယား 1. ဆာဗာနှင့် အလုပ်သမားအချိုး 2 မှ 1 ရှိသော Horovod နှင့် Parameter ဆာဗာအကြား ကုန်ကျစရိတ် နှိုင်းယှဉ်ခြင်း။
မျိုးပွားရန် အဆင့်များ
နောက်အဆင့်များတွင်၊ MXNet နှင့် Horovod ကိုအသုံးပြု၍ ဖြန့်ဝေလေ့ကျင့်မှု၏ရလဒ်ကို မည်သို့ပြန်ထုတ်ပေးရမည်ကို ကျွန်ုပ်တို့ပြသပါမည်။ MXNet ဖြင့် ဖြန့်ဝေသင်ကြားမှုအကြောင်း ပိုမိုလေ့လာရန် ဖတ်ရှုပါ။ .
ခြေလှမ်း 1
distributed training ကိုအသုံးပြုရန် MXNet ဗားရှင်း 1.4.0 သို့မဟုတ် ထို့ထက်မြင့်သော ဗားရှင်းနှင့် Horovod ဗားရှင်း 0.16.0 သို့မဟုတ် ထို့ထက်မြင့်သော ဗားရှင်းများဖြင့် homogeneous instances များ၏ cluster တစ်ခု ဖန်တီးပါ။ GPU training အတွက် libraries များကိုလည်း install လုပ်ရန် လိုအပ်ပါသည်။ ကျွန်ုပ်တို့၏ instance များအတွက်၊ ကျွန်ုပ်တို့သည် ရွေးချယ်ခဲ့သည် Ubuntu 16.04 LinuxGPU Driver 396.44၊ CUDA 9.2၊ cuDNN library 7.2.1၊ NCCL communicator 2.2.13 နှင့် OpenMPI 3.1.1 တို့ဖြင့်လည်း အသုံးပြုနိုင်ပါသည်။ ဤစာကြည့်တိုက်များကို ကြိုတင်ထည့်သွင်းပြီးသောနေရာတွင်၊
ခြေလှမ်း 2
သင်၏ MXNet လေ့ကျင့်ရေး script တွင် Horovod API နှင့် အလုပ်လုပ်နိုင်စွမ်းကို ထည့်ပါ။ MXNet Gluon API ကိုအခြေခံထားသောအောက်ပါ script ကိုရိုးရှင်းသောပုံစံပလိတ်အဖြစ်အသုံးပြုနိုင်ပါသည်။ သက်ဆိုင်ရာ လေ့ကျင့်ရေး ဇာတ်ညွှန်းတစ်ခု ရှိနေပြီဆိုလျှင် ရဲရင့်သော လိုင်းများ လိုအပ်ပါသည်။ Horovod နှင့် လေ့လာရန် သင်လုပ်ဆောင်ရန် လိုအပ်သော အရေးကြီးသော ပြောင်းလဲမှုအချို့မှာ အောက်ပါအတိုင်းဖြစ်သည်။
- လေ့ကျင့်မှုကို မှန်ကန်သောဂရပ်ဖစ် core တွင်လုပ်ဆောင်ကြောင်း နားလည်ရန် ဒေသတွင်း Horovod အဆင့် (လိုင်း 8) အရ ဆက်စပ်အကြောင်းအရာကို သတ်မှတ်ပါ။
- အလုပ်သမားအားလုံးသည် တူညီသောကနဦးကန့်သတ်ချက်များဖြင့် စတင်ကြောင်း သေချာစေရန် အလုပ်သမားတစ်ဦးမှ (လိုင်း 18) သို့ ကနဦး ကန့်သတ်ချက်များကို ပေးပို့ပါ။
- Horovod ကိုဖန်တီးပါ။ 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 ညွှန်ကြားချက်ကို အသုံးပြု၍ ဖြန့်ဝေလေ့ကျင့်မှုစတင်ရန် အလုပ်သမားတစ်ဦးထံ ဝင်ရောက်ပါ။ ဤဥပမာတွင်၊ ဖြန့်ဝေလေ့ကျင့်မှုတစ်ခုစီတွင် GPU 4 ခုစီပါရှိသော ဖြစ်ရပ်လေးခုနှင့် စုစုပေါင်း 16 GPUs အစုအဝေးတွင် လုပ်ဆောင်သည်။ Stochastic Gradient Descent (SGD) optimizer ကို အောက်ပါ hyperparameter များဖြင့် အသုံးပြုပါမည်-
- မီနီအသုတ် အရွယ်အစား- ၂၅၆
- သင်ယူမှုနှုန်း- 0.1
- အရှိန်အဟုန်- 0.9
- အလေးချိန် 0.0001
ကျွန်ုပ်တို့သည် GPU တစ်ခုမှ 64 GPU သို့ စကေးချခြင်းဖြင့် GPU အရေအတွက် (0,1 GPU အတွက် 1 မှ 6,4 GPUs အတွက် 64) သို့ လေ့ကျင့်မှုနှုန်းကို မျဉ်းစီအတိုင်း ချိန်ညှိပြီး GPU တစ်ခုလျှင် ရုပ်ပုံအရေအတွက် 256 (တစ်သုတ်မှ 256 အထိ)၊ GPU 1 ခုအတွက် 16 ပုံ 384 ပုံ)။ GPU အရေအတွက် တိုးလာသည်နှင့်အမျှ အလေးချိန် ယိုယွင်းမှုနှင့် အရှိန်အဟုန် ကန့်သတ်ချက်များ ပြောင်းလဲသွားသည်။ NVIDIA Tesla GPUs မှပံ့ပိုးပေးသော float64 တွက်ချက်မှုများကို အရှိန်မြှင့်ရန်အတွက် gradients များအတွက် 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 dataset ရှိ အတိုင်းအတာဆာဗာချဉ်းကပ်မှုထက် အတိုင်းအတာထိရောက်မှုနှင့် ကုန်ကျစရိတ်ထိရောက်မှုကို ကျွန်ုပ်တို့ သရုပ်ပြခဲ့သည်။ Horovod ကို အသုံးပြု၍ multi-instance လေ့ကျင့်မှုကို လုပ်ဆောင်ရန် ရှိပြီးသား script တစ်ခုကို ပြုပြင်ရန် သင်အသုံးပြုနိုင်သည့် အဆင့်များပါ၀င်ပါသည်။
အကယ်၍ သင်သည် MXNet နှင့် နက်ရှိုင်းစွာ သင်ယူခြင်းတို့ကို စတင်လုပ်ဆောင်နေပါက၊ ထည့်သွင်းခြင်းစာမျက်နှာသို့ သွားပါ။ ပထမဆုံး MXNet ကိုတည်ဆောက်ရန်။ ဆောင်းပါးကို ဖတ်ရန်လည်း ကျွန်ုပ်တို့ ပြင်းပြင်းထန်ထန် အကြံပြုပါသည်။ စတင်ရန်။
အကယ်၍ သင်သည် MXNet နှင့်အလုပ်လုပ်ပြီး Horovod ဖြင့်ဖြန့်ဝေသင်ကြားမှုကိုကြိုးစားလိုပါက၊ ကြည့်ရှုပါ။ MXNet မှ တည်ဆောက်ပြီး နမူနာကို လိုက်နာပါ။ သို့မဟုတ် .
*ကုန်ကျစရိတ်ပေါ်မူတည်၍ တွက်ချက်ပါသည်။ EC2 Instances အတွက် AWS
သင်တန်းအကြောင်းပိုမိုလေ့လာပါ။
source: www.habr.com
