د مقالې ژباړه د کورس د پیل په ماښام چمتو شوې وه
د ډیری لوړ فعالیت کمپیوټري مثالونو کې توزیع شوي روزنه کولی شي د عصري ژورو عصبي شبکو د روزنې وخت په ډیرو ډیټاونو کې له اونیو څخه تر ساعتونو یا حتی دقیقو پورې راټیټ کړي، دا د روزنې تخنیک د ژورې زده کړې په عملي غوښتنلیکونو کې رامینځته کوي. کاروونکي باید پوه شي چې څنګه په ډیری مواردو کې ډاټا شریک او همغږي کړي، کوم چې په پایله کې د اندازه کولو موثریت باندې لوی اغیزه لري. سربیره پردې ، کارونکي باید پدې هم پوه شي چې څنګه د روزنې سکریپټ ځای په ځای کړي چې په یو واحد مثال کې ډیری مواردو ته ځي.
په دې مقاله کې به موږ د پرانیستې ژورې زده کړې کتابتون اپاچی MXNet او د هورووود ویشل شوي زده کړې چوکاټ په کارولو سره د زده کړې ویشلو لپاره د چټکې او اسانه لارې په اړه وغږیږو. موږ به په واضح ډول د هورووود چوکاټ د فعالیت ګټې وښیو او وښیو چې څنګه د MXNet روزنې سکریپټ لیکلو لپاره دا د هورووود سره په توزیع شوي ډول کار کوي.
Apache MXNet څه شی دی؟
د خلاصې سرچینې ژورې زده کړې چوکاټ دی چې د ژورو عصبي شبکو رامینځته کولو ، روزنې او پلي کولو لپاره کارول کیږي. MXNet د عصبي شبکو پلي کولو پورې اړوند پیچلتیاوې خلاصوي ، خورا فعال او د توزیع وړ دی ، او د مشهور پروګرامینګ ژبو لپاره APIs وړاندیز کوي لکه , , , , , , او نور.
د پیرامیټر سرور سره په MXNet کې توزیع شوي روزنه
د پیرامیټر سرور طریقه کاروي. دا د پیرامیټر سرورونو سیټ کاروي ترڅو د هر کارګر څخه تدریجي راټول کړي، ټولیز ترسره کړي، او تازه شوي درجې بیرته کارګرانو ته د راتلونکي اصلاح کولو تکرار لپاره واستوي. د کارګرانو لپاره د سرورونو سم تناسب ټاکل د مؤثره پیمانه کولو کلیدي ده. که چیرې یوازې یو پیرامیټر سرور شتون ولري ، نو دا ممکن په محاسبه کې خنډ وي. برعکس، که چیرې ډیری سرورونه وکارول شي، له ډیرو څخه تر ډیرو اړیکو کولی شي د شبکې ټولې اړیکې بندې کړي.
Horovod څه شی دی؟
یو خلاص توزیع شوی ژور زده کړې چوکاټ دی چې په اوبر کې رامینځته شوی. دا د موثره کراس-GPU او کراس نوډ ټیکنالوژیو څخه ګټه پورته کوي لکه د NVIDIA اجتماعي مخابراتو کتابتون (NCCL) او د پیغام لیږدونکي انٹرفیس (MPI) ترڅو د vorecs په اوږدو کې د ماډل پیرامیټرې توزیع او راټول کړي. دا د شبکې بینډ ویت کارول غوره کوي او ښه اندازه کوي کله چې د ژور عصبي شبکې ماډلونو سره کار کوي. دا اوس مهال د ماشین زده کړې ډیری مشهور چوکاټونو ملاتړ کوي، د بیلګې په توګه ، Tensorflow، Keras، او PyTorch.
MXNet او Horovod ادغام
MXNet د Horovod سره د توزیع شوي زده کړې APIs له لارې مدغم کیږي چې په هوروود کې تعریف شوي. Horovod مخابراتي APIs horovod.broadcast(), horovod.allgather() и horovod.allreduce() د دې د کاري ګراف د یوې برخې په توګه د MXNet انجن د غیر متناسب کال بیکونو په کارولو سره پلي شوی. په دې توګه، د اړیکو او محاسبې ترمنځ د معلوماتو انحصار په اسانۍ سره د MXNet انجن لخوا اداره کیږي ترڅو د همغږۍ له امله د فعالیت له لاسه ورکولو څخه مخنیوی وشي. ویشل شوی اصلاح کوونکی څیز په هوروود کې تعریف شوی horovod.DistributedOptimizer پراخوي اصلاح کوونکی په MXNet کې د دې لپاره چې دا د توزیع شوي پیرامیټرو تازه معلوماتو لپاره اړونده هوروود APIs ته زنګ ووهي. د دې پلي کولو ټول توضیحات د پای کاروونکو لپاره شفاف دي.
چټک پیل
تاسو کولی شئ په چټکۍ سره د MNIST ډیټاسیټ کې د MXNet او Horovod په کارولو سره په خپل MacBook کې د کوچني عصبي عصبي شبکې روزنه پیل کړئ.
لومړی، د PyPI څخه mxnet او horovod نصب کړئ:
pip install mxnet
pip install horovodیادونه: که تاسو په جریان کې د یوې تېروتنې سره مخ شئ pip نصب horovodشاید تاسو اړتیا لرئ یو متغیر اضافه کړئ MACOSX_DEPLOYMENT_TARGET=10.vvچیرته vv - دا ستاسو د MacOS نسخه نسخه ده، د مثال په توګه، د MacOSX سیرا لپاره تاسو به لیکلو ته اړتیا ولرئ MACOSX_DEPLOYMENT_TARGET=10.12 پایپ نصب 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 GPUs کې په ImageNet ډیټاسیټ کې د ResNet1-v64 ماډل روزنه p3.16x لوی EC2، هر یو په AWS کلاوډ کې د 8 NVIDIA Tesla V100 GPUs لري، موږ د 45000 انځورونو/سیکنډ (د مثال په توګه، په هره ثانیه کې د روزل شویو نمونو شمیر) د روزنې له لارې ترلاسه کړ. روزنه په 44 دقیقو کې د 90 دورې وروسته د 75.7٪ غوره دقت سره بشپړه شوه.
موږ دا په 8، 16، 32 او 64 GPUs کې د پیرامیټر سرورونو کارولو لپاره د MXNet توزیع شوي روزنې طریقې سره په ترتیب سره د واحد پیرامیټر سرور او سرور څخه د کارګر تناسب 1 څخه 1 او 2 څخه 1 سره پرتله کوو. تاسو کولی شئ پایله په لاندې شکل 1 کې وګورئ. په چپ اړخ کې د y-محور کې، بارونه په هر ثانیه کې د روزنې لپاره د انځورونو شمیر استازیتوب کوي، کرښې په ښي خوا کې د y-محور په برخه کې د پیمانه کولو موثریت (دا د حقیقي څخه د مثالي تولید تناسب) منعکس کوي. لکه څنګه چې تاسو لیدلی شئ، د سرورونو شمیره انتخاب د اندازه کولو موثریت اغیزه کوي. که چیرې یوازې یو پیرامیټر سرور شتون ولري ، د اندازه کولو موثریت په 38 GPUs کې 64٪ ته راټیټیږي. د هوروود سره ورته اندازه کولو موثریت ترلاسه کولو لپاره ، تاسو اړتیا لرئ د کارګرانو شمیر په پرتله د سرورونو شمیر دوه چنده کړئ.

شکل 1. د توزیع شوي زده کړې پرتله کول د MXNet په کارولو سره د هوروود او پیرامیټر سرور سره
په لاندې جدول 1 کې، موږ په هر مثال کې وروستی لګښت پرتله کوو کله چې په 64 GPUs کې تجربې پرمخ وړي. د Horovod سره د MXNet کارول په ټیټه بیه غوره ټرپټ چمتو کوي.

جدول 1. د هروود او پیرامیټر سرور تر مینځ د لګښت پرتله کول د سرور او کارګر تناسب د 2 څخه 1 پورې.
د بیا تولید لپاره ګامونه
په راتلونکو ګامونو کې، موږ به تاسو ته وښیو چې څنګه د MXNet او Horovod په کارولو سره د توزیع شوي روزنې پایلې بیا تولید کړئ. د MXNet سره د توزیع شوي زده کړې په اړه د نورو معلوماتو لپاره ولولئ .
1 ګام
د ویشل شوي روزنې کارولو لپاره د MXNet نسخه 1.4.0 یا لوړ او د Horovod نسخه 0.16.0 یا لوړ سره د همجنسي مثالونو کلستر جوړ کړئ. تاسو به د GPU روزنې لپاره کتابتونونه نصبولو ته هم اړتیا ولرئ. زموږ د مثالونو لپاره، موږ غوره کړه Ubuntu 16.04 Linux، د GPU ډرایور 396.44، CUDA 9.2، cuDNN کتابتون 7.2.1، NCCL مخابراتي 2.2.13 او OpenMPI 3.1.1 سره. تاسو هم کارولی شئ ، چیرې چې دا کتابتونونه دمخه نصب شوي دي.
2 ګام
ستاسو د MXNet روزنې سکریپټ ته د Horovod API سره د کار کولو وړتیا اضافه کړئ. لاندې سکریپټ د MXNet Gluon API پراساس د ساده ټیمپلیټ په توګه کارول کیدی شي. په بولډ کې لینونو ته اړتیا ده که تاسو دمخه د ورته روزنې سکریپټ لرئ. دلته یو څو مهم بدلونونه دي چې تاسو ورته اړتیا لرئ د هوروود سره زده کړه وکړئ:
- شرایط د محلي هورووډ رتبې (کرښه 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 لارښود په کارولو سره د توزیع شوي روزنې پیل کولو لپاره یو کارګر ته ننوتل. په دې مثال کې، ویشل شوي روزنه په څلورو مواردو کې د 4 GPUs سره هر یو، او په کلستر کې ټول 16 GPUs پرمخ ځي. د Stochastic Gradient Descent (SGD) اصلاح کوونکی به د لاندې هایپر پارامیټرونو سره وکارول شي:
- د مینی بیچ اندازه: 256
- د زده کړې کچه: 0.1
- سرعت: 0.9
- د وزن کمښت: 0.0001
لکه څنګه چې موږ له یو GPU څخه 64 GPUs ته اندازه کړل، موږ د روزنې کچه د GPUs شمیر سره سم په قطعي ډول اندازه کړه (له 0,1 څخه د 1 GPU لپاره 6,4 ته د 64 GPUs لپاره)، پداسې حال کې چې د هر GPU د عکسونو شمیر په 256 کې ساتل (د یوې بستې څخه) 256 انځورونه د 1 GPU لپاره 16 ته د 384 GPUs لپاره). د وزن کمیدل او د حرکت پیرامیټرونه د GPUs شمیر ډیریدو سره بدل شول. موږ د فارورډ پاس لپاره د float64 ډیټا ډول سره مخلوط دقیق روزنه کارولې او د ګریډینټ لپاره float16 د NVIDIA Tesla GPUs لخوا ملاتړ شوي د فلوټ32 محاسبې ګړندي کولو لپاره.
$ 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پایلې
پدې مقاله کې، موږ د اپاچي MXNet او Horovod په کارولو سره د توزیع شوي ماډل روزنې لپاره د توزیع وړ طریقې ته کتنه وکړه. موږ په ImageNet ډیټاسیټ کې د پیرامیټر سرور طریقې په پرتله د اندازه کولو موثریت او لګښت اغیزمنتوب وښوده چې په کې د ResNet50-v1 ماډل روزل شوی و. موږ هغه مرحلې هم شاملې کړې چې تاسو کولی شئ د هوروود په کارولو سره د څو مثالونو روزنې چلولو لپاره د موجوده سکریپټ بدلولو لپاره وکاروئ.
که تاسو یوازې د MXNet او ژورې زده کړې سره پیل کوئ، د نصب کولو پاڼې ته لاړ شئ لومړی د MXNet جوړولو لپاره. موږ هم په کلکه د مقالې لوستلو وړاندیز کوو د پیل کولو لپاره.
که تاسو دمخه د MXNet سره کار کړی او غواړئ چې د هورووود سره توزیع شوي زده کړې هڅه وکړئ ، نو بیا یو نظر وګورئ ، دا د MXNet څخه جوړ کړئ او مثال تعقیب کړئ او یا .
* لګښت په اساس محاسبه کیږي AWS د EC2 مثالونو لپاره
د کورس په اړه نور معلومات ترلاسه کړئ
سرچینه: www.habr.com
