مضمون کا ترجمہ کورس کے آغاز کے موقع پر تیار کیا گیا تھا۔
متعدد اعلی کارکردگی والے کمپیوٹنگ مثالوں پر تقسیم شدہ تربیت جدید ڈیپ نیورل نیٹ ورکس کے تربیتی وقت کو بڑی مقدار میں ڈیٹا پر ہفتوں سے گھنٹوں یا منٹوں تک کم کر سکتی ہے، جس سے یہ تربیتی تکنیک گہری سیکھنے کے عملی استعمال میں مروج ہو جاتی ہے۔ صارفین کو یہ سمجھنا چاہیے کہ ڈیٹا کو کس طرح بانٹنا اور مطابقت پذیر بنانا ہے، جس کے نتیجے میں اسکیلنگ کی کارکردگی پر بڑا اثر پڑتا ہے۔ اس کے علاوہ، صارفین کو یہ بھی معلوم ہونا چاہیے کہ ایک ٹریننگ اسکرپٹ کو کیسے تعینات کیا جائے جو ایک ہی مثال سے متعدد مثالوں پر چلتا ہے۔
اس مضمون میں ہم اوپن ڈیپ لرننگ لائبریری Apache MXNet اور Horovod تقسیم شدہ لرننگ فریم ورک کا استعمال کرتے ہوئے سیکھنے کو تقسیم کرنے کے ایک تیز اور آسان طریقہ کے بارے میں بات کریں گے۔ ہم Horovod فریم ورک کے کارکردگی کے فوائد کو واضح طور پر ظاہر کریں گے اور یہ ظاہر کریں گے کہ کس طرح ایک MXNet ٹریننگ اسکرپٹ لکھنا ہے تاکہ یہ Horovod کے ساتھ تقسیم شدہ طریقے سے کام کرے۔
Apache MXNet کیا ہے؟
پیرامیٹر سرور کے ساتھ MXNet میں تقسیم شدہ تربیت
Horovod کیا ہے؟
MXNet اور Horovod انضمام
MXNet Horovod میں تقسیم شدہ لرننگ APIs کے ذریعے Horovod کے ساتھ ضم ہوتا ہے۔ Horovod مواصلات APIs horovod.broadcast(), horovod.allgather() и horovod.allreduce() اس کے ٹاسک گراف کے حصے کے طور پر، MXNet انجن کے غیر مطابقت پذیر کال بیکس کا استعمال کرتے ہوئے لاگو کیا گیا ہے۔ اس طرح، کمیونیکیشن اور کمپیوٹیشن کے درمیان ڈیٹا انحصار آسانی سے MXNet انجن کے ذریعے سنبھالا جاتا ہے تاکہ ہم آہنگی کی وجہ سے کارکردگی کے نقصانات سے بچا جا سکے۔ تقسیم شدہ آپٹیمائزر آبجیکٹ کی وضاحت ہورووڈ میں کی گئی ہے۔ horovod.DistributedOptimizer پھیلتا ہے کی اصلاح کار MXNet میں تاکہ یہ تقسیم شدہ پیرامیٹر اپ ڈیٹس کے لیے متعلقہ Horovod APIs کو کال کرے۔ نفاذ کی یہ تمام تفصیلات آخری صارفین کے لیے شفاف ہیں۔
تیز شروعات
آپ اپنے MacBook پر MXNet اور Horovod کا استعمال کرتے ہوئے MNIST ڈیٹاسیٹ پر ایک چھوٹے سے convolutional neural نیٹ ورک کی تربیت تیزی سے شروع کر سکتے ہیں۔
پہلے PyPI سے mxnet اور horovod انسٹال کریں:
pip install mxnet
pip install horovod
نوٹ: اگر آپ کے دوران کسی غلطی کا سامنا کرنا پڑتا ہے۔ پائپ انسٹال horovodشاید آپ کو ایک متغیر شامل کرنے کی ضرورت ہے۔ MACOSX_DEPLOYMENT_TARGET=10.vvجہاں vv - یہ آپ کے MacOS ورژن کا ورژن ہے، مثال کے طور پر، MacOSX Sierra کے لیے آپ کو لکھنا ہوگا۔ MACOSX_DEPLOYMENT_TARGET=10.12 pip install horovod
پھر اوپن ایم پی آئی انسٹال کریں۔
آخر میں، ٹیسٹ اسکرپٹ ڈاؤن لوڈ کریں۔ 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 GPUs پر امیج نیٹ ڈیٹاسیٹ پر 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-axis پر، سلاخیں فی سیکنڈ ٹریننگ کے لیے امیجز کی تعداد کی نمائندگی کرتی ہیں، لکیریں دائیں جانب y-axis پر اسکیلنگ کی کارکردگی (یعنی مثالی تھرو پٹ کا اصل تناسب) کی عکاسی کرتی ہیں۔ جیسا کہ آپ دیکھ سکتے ہیں، سرورز کی تعداد کا انتخاب اسکیلنگ کی کارکردگی کو متاثر کرتا ہے۔ اگر صرف ایک پیرامیٹر سرور ہے، تو اسکیلنگ کی کارکردگی 38 GPUs پر 64% تک گر جاتی ہے۔ Horovod کی طرح اسکیلنگ کی کارکردگی کو حاصل کرنے کے لیے، آپ کو سرورز کی تعداد کو کارکنوں کی تعداد سے دوگنا کرنے کی ضرورت ہے۔
شکل 1. Horovod اور پیرامیٹر سرور کے ساتھ MXNet کا استعمال کرتے ہوئے تقسیم شدہ سیکھنے کا موازنہ
ذیل میں جدول 1 میں، ہم 64 GPUs پر تجربات کرتے وقت فی مثال حتمی قیمت کا موازنہ کرتے ہیں۔ Horovod کے ساتھ MXNet کا استعمال سب سے کم قیمت پر بہترین تھرو پٹ فراہم کرتا ہے۔
جدول 1۔ ہورووڈ اور پیرامیٹر سرور کے درمیان لاگت کا موازنہ جس میں سرور سے کارکن کا تناسب 2 سے 1 ہے۔
دوبارہ پیدا کرنے کے اقدامات
اگلے مراحل میں، ہم آپ کو دکھائیں گے کہ MXNet اور Horovod کا استعمال کرتے ہوئے تقسیم شدہ تربیت کے نتائج کو کیسے دوبارہ تیار کیا جائے۔ MXNet کے ساتھ تقسیم شدہ سیکھنے کے بارے میں مزید جاننے کے لیے پڑھیں
1 مرحلہ
تقسیم شدہ سیکھنے کو استعمال کرنے کے لیے MXNet ورژن 1.4.0 یا اس سے زیادہ اور Horovod ورژن 0.16.0 یا اس سے زیادہ کے ساتھ یکساں مثالوں کا ایک کلسٹر بنائیں۔ آپ کو GPU ٹریننگ کے لیے لائبریریاں بھی انسٹال کرنے کی ضرورت ہوگی۔ اپنی مثالوں کے لیے، ہم نے GPU ڈرائیور 16.04، CUDA 396.44، cuDNN 9.2 لائبریری، NCCL 7.2.1 کمیونیکیٹر اور OpenMPI 2.2.13 کے ساتھ Ubuntu 3.1.1 Linux کا انتخاب کیا۔ آپ بھی استعمال کر سکتے ہیں۔
2 مرحلہ
Horovod API کے ساتھ کام کرنے کی صلاحیت کو اپنے MXNet ٹریننگ اسکرپٹ میں شامل کریں۔ 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 GPU کے لیے 1 سے 6,4 GPUs کے لیے 64 تک)، جبکہ فی GPU تصاویر کی تعداد 256 پر رکھتے ہوئے 256 GPU کے لیے 1 تصاویر 16 GPUs کے لیے 384 تک)۔ GPUs کی تعداد میں اضافے کے ساتھ وزن میں کمی اور رفتار کے پیرامیٹرز بدل گئے۔ ہم نے 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 اور گہری سیکھنے کے ساتھ شروعات کر رہے ہیں، تو تنصیب کے صفحہ پر جائیں۔
اگر آپ پہلے ہی MXNet کے ساتھ کام کر چکے ہیں اور Horovod کے ساتھ تقسیم شدہ سیکھنے کی کوشش کرنا چاہتے ہیں، تو اس پر ایک نظر ڈالیں۔
* لاگت کی بنیاد پر شمار کیا جاتا ہے
کورس کے بارے میں مزید معلومات حاصل کریں۔
ماخذ: www.habr.com