Keras PlatoBlockchain Data Intelligence کے ساتھ ملٹی GPU ٹریننگ کے لیے 5 ٹپس۔ عمودی تلاش۔ عی

کیراس کے ساتھ ملٹی جی پی یو ٹریننگ کے لیے 5 نکات

ڈیپ لرننگ (بلاکچین/بِٹ کوائن اور ڈیٹا سائنس/مشین لرننگ کے ساتھ 2010 کی دہائی کے اواخر کا پسندیدہ بز ورڈ) نے ہمیں پچھلے چند سالوں میں کچھ واقعی زبردست چیزیں کرنے کے قابل بنایا ہے۔ الگورتھم میں ہونے والی پیشرفت کے علاوہ (جو کہ 1990 کی دہائی سے پہلے سے معلوم خیالات پر مبنی ہیں عرف "ڈیٹا مائننگ دور")، اس کی کامیابی کی بنیادی وجوہات بڑے مفت ڈیٹا سیٹس کی دستیابی، اوپن سورس لائبریریوں کا تعارف اور GPUs کا استعمال۔ اس بلاگ پوسٹ میں میں آخری دو پر توجہ مرکوز کروں گا اور میں آپ کے ساتھ کچھ نکات کا اشتراک کروں گا جو میں نے مشکل طریقے سے سیکھے۔

TensorFlow اور Keras کیوں؟

TensorFlow گوگل کے ذریعہ تیار کردہ ایک بہت مشہور ڈیپ لرننگ لائبریری ہے جو آپ کو پیچیدہ نیٹ ورکس کو تیزی سے پروٹو ٹائپ کرنے کی اجازت دیتی ہے۔ یہ بہت ساری دلچسپ خصوصیات کے ساتھ آتا ہے جیسے خودکار تفریق (جو آپ کو لاگت کے افعال کے گریڈینٹ کا تخمینہ لگانے/کوڈنگ کرنے سے بچاتا ہے) اور GPU سپورٹ (جو آپ کو مہذب ہارڈ ویئر کا استعمال کرتے ہوئے آسانی سے 200x رفتار میں بہتری لانے کی اجازت دیتا ہے)۔ مزید یہ کہ یہ ایک Python انٹرفیس پیش کرتا ہے جس کا مطلب ہے کہ آپ C یا CUDA کوڈ لکھنے کی ضرورت کے بغیر تیزی سے پروٹو ٹائپ کر سکتے ہیں۔ بلاشبہ TensorFlow کے بجائے بہت سے دوسرے فریم ورکس استعمال کیے جا سکتے ہیں، جیسے Torch، MXNet، Theano، Caffe، Deeplearning4j، CNTK، وغیرہ لیکن یہ سب آپ کے استعمال کے معاملے اور آپ کی ذاتی ترجیح کے مطابق ہوتے ہیں۔

لیکن کیوں کیراس? میرے لیے براہ راست TF استعمال کرنا Numpy کے ساتھ مشین لرننگ کرنے جیسا ہے۔ ہاں یہ ممکن ہے اور وقتاً فوقتاً آپ کو یہ کرنا پڑتا ہے (خاص طور پر اگر آپ کسٹم لیئرز/لوس فنکشن لکھتے ہیں) لیکن کیا آپ واقعی ایسا کوڈ لکھنا چاہتے ہیں جو پیچیدہ نیٹ ورکس کو ویکٹر آپریشنز کی ایک سیریز کے طور پر بیان کرتا ہو (ہاں، میں جانتا ہوں TF میں اعلیٰ سطح کے طریقے موجود ہیں لیکن وہ Keras کی طرح ٹھنڈے نہیں ہیں)؟ اس کے علاوہ اگر آپ کسی دوسری لائبریری میں جانا چاہتے ہیں تو کیا ہوگا؟ ٹھیک ہے تو آپ کو شاید کوڈ کو دوبارہ لکھنے کی ضرورت ہوگی، جو بیکار ہے۔ تا تا تا، کیراس بچاؤ! Keras آپ کو اعلیٰ سطح کے تصورات کا استعمال کرتے ہوئے اپنے نیٹ ورکس کی وضاحت کرنے اور کوڈ لکھنے کی اجازت دیتا ہے جو بیک اینڈ ایگنوسٹک ہے، یعنی آپ مختلف گہری سیکھنے والی لائبریریوں میں نیٹ ورک چلا سکتے ہیں۔ کیراس کے بارے میں کچھ چیزیں جو مجھے پسند ہیں وہ یہ ہیں کہ یہ اچھی طرح سے لکھا گیا ہے، اس میں آبجیکٹ پر مبنی فن تعمیر ہے، اس میں تعاون کرنا آسان ہے اور اس میں ایک دوستانہ کمیونٹی ہے۔ اگر آپ کو یہ پسند ہے تو شکریہ کہیں۔ فرانسوا چولیٹ اسے تیار کرنے اور اسے اوپن سورس کرنے کے لیے۔

ملٹی جی پی یو ٹریننگ کے لیے ٹپس اور گوٹا

مزید اڈو کے بغیر، آئیے کیراس پر GPU ٹریننگ سے زیادہ سے زیادہ فائدہ اٹھانے کے بارے میں چند نکات پر جائیں اور کچھ گٹچز جو آپ کو ذہن میں رکھنے چاہئیں:

1. ملٹی جی پی یو ٹریننگ خودکار نہیں ہے۔

Keras اور Tensorflow کا استعمال کرتے ہوئے GPU پر ٹریننگ ماڈلز ہموار ہیں۔ اگر آپ کے پاس NVIDIA کارڈ ہے اور آپ نے CUDA انسٹال کیا ہے، تو لائبریریاں خود بخود اس کا پتہ لگائیں گی اور اسے تربیت کے لیے استعمال کریں گی۔ بہت بڑھیا! لیکن کیا ہوگا اگر آپ ایک بگڑے ہوئے چھوکرے ہیں اور آپ کے پاس متعدد GPUs ہیں؟ بدقسمتی سے آپ کو ملٹی جی پی یو ٹریننگ حاصل کرنے کے لیے تھوڑا سا کام کرنا پڑے گا۔
Keras PlatoBlockchain Data Intelligence کے ساتھ ملٹی GPU ٹریننگ کے لیے 5 ٹپس۔ عمودی تلاش۔ عی
نیٹ ورک کو متوازی کرنے کے متعدد طریقے ہیں اس پر منحصر ہے کہ آپ کیا حاصل کرنا چاہتے ہیں لیکن بنیادی دو نقطہ نظر ماڈل اور ڈیٹا کو متوازی کرنا ہے۔ پہلا آپ کی مدد کر سکتا ہے اگر آپ کا ماڈل ایک ہی GPU میں فٹ ہونے کے لیے بہت پیچیدہ ہے جبکہ بعد والا اس وقت مدد کرتا ہے جب آپ عملدرآمد کو تیز کرنا چاہتے ہیں۔ عام طور پر جب لوگ ملٹی GPU ٹریننگ کے بارے میں بات کرتے ہیں تو ان کا مطلب بعد میں ہوتا ہے۔ اسے حاصل کرنا مشکل ہوتا تھا لیکن شکر ہے کہ کیراس نے حال ہی میں ایک افادیت کا طریقہ شامل کیا ہے جسے کہا جاتا ہے۔ mutli_gpu_model جو متوازی تربیت/پیش گوئیوں کو آسان بناتا ہے (فی الحال صرف TF بیک اینڈ کے ساتھ دستیاب ہے)۔ بنیادی خیال یہ ہے کہ آپ اپنے ماڈل کو طریقہ سے پاس کرتے ہیں اور اسے مختلف GPUs میں کاپی کیا جاتا ہے۔ اصل ان پٹ کو ٹکڑوں میں تقسیم کیا جاتا ہے جو مختلف GPUs کو کھلایا جاتا ہے اور پھر انہیں ایک ہی آؤٹ پٹ کے طور پر جمع کیا جاتا ہے۔ یہ طریقہ متوازی تربیت اور پیشین گوئیاں حاصل کرنے کے لیے استعمال کیا جا سکتا ہے، تاہم اس بات کو ذہن میں رکھیں کہ تربیت کے لیے یہ مطلوبہ مطابقت پذیری کی وجہ سے GPUs کی مقدار کے ساتھ لکیری پیمانے پر نہیں ہوتا ہے۔

2. بیچ کے سائز پر توجہ دیں۔

جب آپ ملٹی جی پی یو ٹریننگ کرتے ہیں تو بیچ کے سائز پر توجہ دیں کیونکہ اس کے رفتار/میموری، آپ کے ماڈل کے کنورجنس پر متعدد اثرات ہوتے ہیں اور اگر آپ محتاط نہیں ہیں تو آپ اپنے ماڈل کے وزن کو خراب کر سکتے ہیں!

رفتار/میموری: ظاہر ہے کہ جتنا بڑا بیچ ہوگا تربیت/پیش گوئی اتنی ہی تیز ہوگی۔ اس کی وجہ یہ ہے کہ GPUs سے ڈیٹا ڈالنے اور نکالنے پر اوور ہیڈ ہوتا ہے، اس لیے چھوٹے بیچوں میں زیادہ اوور ہیڈ ہوتا ہے۔ فلپ سائیڈ پر، بیچ جتنا بڑا ہوگا آپ کو GPU میں اتنی ہی زیادہ میموری کی ضرورت ہوگی۔ خاص طور پر تربیت کے دوران، ہر پرت کے ان پٹس کو میموری میں رکھا جاتا ہے کیونکہ بیک پروپیگیشن سٹیپ پر ان کی ضرورت ہوتی ہے، اس لیے آپ کے بیچ کا سائز بہت زیادہ بڑھانا میموری سے باہر ہونے والی خرابیوں کا باعث بن سکتا ہے۔

ہم آہنگی: اگر آپ اپنے ماڈل کو تربیت دینے کے لیے Stochastic Gradient Decent (SGD) یا اس کی کچھ قسمیں استعمال کرتے ہیں، تو آپ کو یہ بات ذہن میں رکھنی چاہیے کہ بیچ کا سائز آپ کے نیٹ ورک کی کنورج اور عام ہونے کی صلاحیت کو متاثر کر سکتا ہے۔ کمپیوٹر وژن کے بہت سے مسائل میں عام بیچ کے سائز 32-512 کے درمیان ہوتے ہیں۔ جیسا کہ کیسکر وغیرہ اسے ڈالیں، "عملی طور پر یہ دیکھا گیا ہے کہ بڑے بیچ (512 سے زیادہ) استعمال کرتے وقت ماڈل کے معیار میں گراوٹ ہوتی ہے، جیسا کہ اسے عام کرنے کی صلاحیت سے ماپا جاتا ہے۔" نوٹ کریں کہ دیگر مختلف اصلاح کنندگان میں مختلف خصوصیات ہیں اور خصوصی تقسیم شدہ اصلاح کی تکنیک اس مسئلے میں مدد کر سکتی ہے۔ اگر آپ ریاضی کی تفصیلات میں دلچسپی رکھتے ہیں، تو میں Joeri Hermans کا مقالہ پڑھنے کی تجویز کرتا ہوں۔اسکیل ایبل ڈیپ لرننگ اور متوازی گراڈینٹ ڈیسنٹ پر".
Keras PlatoBlockchain Data Intelligence کے ساتھ ملٹی GPU ٹریننگ کے لیے 5 ٹپس۔ عمودی تلاش۔ عی
وزن کو خراب کرنا: یہ ایک گندی تکنیکی تفصیل ہے جس کے تباہ کن نتائج ہو سکتے ہیں۔ جب آپ ملٹی-GPU ٹریننگ کرتے ہیں، تو یہ ضروری ہے کہ تمام GPUs کو ڈیٹا کے ساتھ فیڈ کیا جائے۔ ایسا ہو سکتا ہے کہ آپ کے عہد کے آخری بیچ میں وضاحت سے کم ڈیٹا ہو (کیونکہ آپ کے ڈیٹاسیٹ کے سائز کو آپ کے بیچ کے سائز سے قطعی طور پر تقسیم نہیں کیا جا سکتا ہے)۔ اس کی وجہ سے کچھ GPUs کو آخری مرحلے کے دوران کوئی ڈیٹا موصول نہیں ہو سکتا۔ بدقسمتی سے کچھ کیرا پرتیں، خاص طور پر بیچ نارملائزیشن لیئر، اس کا مقابلہ نہیں کر سکتیں جس کی وجہ سے نان کی قدریں وزن میں نمودار ہوتی ہیں (BN پرت میں چلنے کا مطلب اور تغیر)۔ چیزوں کو مزید گندا بنانے کے لیے، کوئی بھی تربیت کے دوران مسئلہ کا مشاہدہ نہیں کرے گا (جب کہ سیکھنے کا مرحلہ 1 ہے) کیونکہ مخصوص پرت تخمینوں میں بیچ کے وسط/تغیر کو استعمال کرتی ہے۔ اس کے باوجود پیشین گوئیوں کے دوران (سیکھنے کا مرحلہ 0 پر سیٹ کیا گیا ہے)، چلنے والے وسط/تغیر کا استعمال کیا جاتا ہے جو ہمارے معاملے میں نان بن سکتا ہے جس کے نتیجے میں خراب نتائج برآمد ہوتے ہیں۔ اس لیے اپنے آپ پر احسان کریں اور ہمیشہ اس بات کو یقینی بنائیں کہ جب آپ ملٹی-جی پی یو ٹریننگ کرتے ہیں تو آپ کے بیچ کا سائز درست ہے۔ اسے حاصل کرنے کے دو آسان طریقے یہ ہیں کہ یا تو ایسے بیچوں کو مسترد کر دیں جو پہلے سے طے شدہ سائز سے مماثل نہیں ہیں یا بیچ کے اندر موجود ریکارڈ کو اس وقت تک دہرائیں جب تک کہ آپ پہلے سے طے شدہ سائز تک نہ پہنچ جائیں۔ آخری لیکن کم از کم اس بات کو ذہن میں رکھیں کہ ملٹی جی پی یو سیٹ اپ میں، بیچ کا سائز آپ کے سسٹم پر دستیاب GPUs کی تعداد سے زیادہ ہونا چاہیے۔

3. GPU ڈیٹا فاقہ کشی عرف CPUs GPUs کو برقرار نہیں رکھ سکتے ہیں۔

ڈیپ نیٹ ورکس کی تربیت/پیش گوئی کرتے وقت عام طور پر سب سے مہنگا حصہ وہ تخمینہ ہوتا ہے جو GPUs پر ہوتا ہے۔ ڈیٹا کو پس منظر میں CPUs میں پہلے سے پروسیس کیا جاتا ہے اور انہیں وقتاً فوقتاً GPUs کو فیڈ کیا جاتا ہے۔ اس کے باوجود کسی کو یہ اندازہ نہیں لگانا چاہیے کہ GPUs کتنی تیز ہیں۔ ایسا ہو سکتا ہے کہ اگر آپ کا نیٹ ورک بہت کم ہے یا پری پروسیسنگ مرحلہ اتنا پیچیدہ ہے کہ آپ کے CPUs آپ کے GPUs کے ساتھ نہیں رہ سکتے ہیں یا دوسرے لفظوں میں وہ انہیں اتنی جلدی ڈیٹا فراہم نہیں کرتے ہیں۔ یہ کم GPU استعمال کا باعث بن سکتا ہے جس کا ترجمہ رقم/وسائل ضائع ہوتا ہے۔
Keras PlatoBlockchain Data Intelligence کے ساتھ ملٹی GPU ٹریننگ کے لیے 5 ٹپس۔ عمودی تلاش۔ عی
کیراس عام طور پر بیچوں کا تخمینہ متوازی طور پر انجام دیتا ہے اس کے باوجود Python کے GIL (گلوبل انٹرپریٹر لاک) کی وجہ سے آپ واقعی Python میں حقیقی ملٹی تھریڈنگ حاصل نہیں کر سکتے۔ اس کے لیے دو حل ہیں: یا تو ایک سے زیادہ پراسیس استعمال کریں (نوٹ کریں کہ اس میں بہت سارے گٹچے ہیں جن کا میں یہاں احاطہ نہیں کرنے جا رہا ہوں) یا اپنے پری پروسیسنگ قدم کو آسان رکھیں۔ ماضی میں میں نے کیراس پر ایک پل کی درخواست بھیجی تھی تاکہ ہم امیج پری پروسیسنگ کے دوران سی پی یوز پر ڈالے گئے کچھ غیر ضروری تناؤ کو دور کر سکیں، اس لیے زیادہ تر صارفین کو متاثر نہیں ہونا چاہیے اگر وہ معیاری جنریٹرز استعمال کرتے ہیں۔ اگر آپ کے پاس حسب ضرورت جنریٹر ہیں تو کوشش کریں کہ زیادہ سے زیادہ منطق کو C لائبریریوں جیسے Numpy کی طرف دھکیلیں کیونکہ ان میں سے کچھ طریقے دراصل جی آئی ایل کو رہا کریں۔ جس کا مطلب ہے کہ آپ متوازی کی ڈگری کو بڑھا سکتے ہیں۔ اس بات کا پتہ لگانے کا ایک اچھا طریقہ کہ آیا آپ کو GPU ڈیٹا کی بھوک کا سامنا ہے GPU کے استعمال کی نگرانی کرنا، اس کے باوجود خبردار کیا جائے کہ یہ مشاہدہ کرنے کی واحد وجہ نہیں ہے (متعدد GPUs میں تربیت کے دوران ہونے والی مطابقت پذیری بھی کم استعمال کا ذمہ دار ہے۔ )۔ عام طور پر GPU ڈیٹا کی بھوک کا پتہ GPU برسٹ کو دیکھ کر لگایا جا سکتا ہے جس کے بعد بغیر کسی استعمال کے طویل وقفے ہوتے ہیں۔ ماضی میں میں نے Dstat کے لیے ایک ایکسٹینشن اوپن سورس کیا ہے جو آپ کے GPU کے استعمال کی پیمائش کرنے میں آپ کی مدد کر سکتا ہے، لہذا اس پر ایک نظر ڈالیں۔ اصل بلاگ پوسٹ.

4. اپنے متوازی ماڈلز کو محفوظ کرنا

کہتے ہیں کہ آپ نے اپنے ماڈل کو متوازی بنانے کے لیے mutli_gpu_model طریقہ استعمال کیا، تربیت ختم ہو گئی اور اب آپ اس کے وزن کو برقرار رکھنا چاہتے ہیں۔ بری خبر یہ ہے کہ آپ صرف اس پر save() کو کال نہیں کرسکتے ہیں۔ فی الحال کیراس کی ایک حد ہے جو آپ کو اجازت نہیں دیتی ہے۔ ایک متوازی ماڈل کو محفوظ کریں. اس کے ارد گرد 2 طریقے ہیں: یا تو اصل ماڈل کے حوالے سے save() کو کال کریں (وزن خود بخود اپ ڈیٹ ہوجائے گا) یا آپ کو متوازی ورژن کو کاٹ کر اور تمام غیر ضروری کنکشنز کو صاف کرکے ماڈل کو سیریلائز کرنے کی ضرورت ہے۔ پہلا آپشن بہت آسان ہے لیکن مستقبل میں میں ایک سیریلائز () طریقہ کو اوپن سورس کرنے کا ارادہ رکھتا ہوں جو بعد میں انجام دیتا ہے۔

5. دستیاب GPUs کو گننے کا برا اثر پڑتا ہے۔

بدقسمتی سے اس وقت، tensorflow.python.client.device_lib.list_local_devices() طریقہ پر ایک گندا ضمنی اثر ہے جس کی وجہ سے ایک نیا TensorFlow سیشن بنتا ہے اور سسٹم پر موجود تمام GPUs کی شروعات ہوتی ہے۔ یہ غیر متوقع نتائج کا باعث بن سکتا ہے جیسے کہ متعین سے زیادہ GPUs دیکھنا یا نئے سیشنز کو وقت سے پہلے شروع کرنا (آپ اس پر تمام تفصیلات پڑھ سکتے ہیں۔ کھینچنے کی درخواست)۔ اسی طرح کی حیرت سے بچنے کے لیے آپ کو مشورہ دیا جاتا ہے کہ آپ Keras کا K.get_session().list_devices() طریقہ استعمال کریں، جو آپ کو سیشن میں موجود تمام رجسٹرڈ GPU واپس کر دے گا۔ آخری لیکن کم از کم، ذہن میں رکھیں کہ list_devices() طریقہ کو کال کرنا کسی نہ کسی طرح مہنگا ہے، لہذا اگر آپ صرف دستیاب GPUs کی تعداد میں دلچسپی رکھتے ہیں تو ایک بار طریقہ کو کال کریں اور ان کا نمبر مقامی متغیر پر اسٹور کریں۔

یہی ہے! امید ہے کہ آپ کو یہ فہرست مفید لگی۔ اگر آپ کو کیراس پر GPU ٹریننگ کے لیے دیگر گٹچز/ ٹپس ملے ہیں، تو انہیں نیچے تبصروں میں شیئر کریں۔ 🙂

ٹائم اسٹیمپ:

سے زیادہ ڈیٹا باکس