خانه > ابزارهای برنامه نویسی > کار با پایگاه داده ImageNet – قسمت دوم

کار با پایگاه داده ImageNet – قسمت دوم

این مطلب ترجمه ی مقاله ی Julien Simon و بر اساس استفاده از سرویس های aws برای کار با ImageNet و مطابق نرخ قیمت آن در ایالات متحده تنظیم شده است. با توجه به این که سرویس های aws برای برخی محققین ایرانی در دسترس و مورد استفاده می باشد، این مطلب بر همین اساس ترجمه و منتشر گردیده است.

در پست قبلی بررسی کردیم که برای دریافت و آماده سازی پایگاه داده ImageNet چه چیزی لازم است .حالا وقت آموزش است !

مطلب مرتبط :

پایگاه داده ی ImageNet چالش ILSVR

مخزن MXNet یک اسکریپت خیلی خوب دارد، بیایید از آن استفاده کنیم.

python train_imagenet.py --network resnet --num-layers 50 \
--gpus 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 \
--data-train /data/im2rec/imagenet_training.rec \
--data-val /data/im2rec/imagenet_validation.rec

راحت بود. چقدر سرعت دارد؟

سرعت پایگاه داده ی ImageNet

در هر ثانیه حدود ۴۰۰ تصویر، که به معنی حدود ۵۳ دقیقه در هر دوره ( Epoch ) است .بیش از سه و نیم روز برای ۱۰۰ دوره. اما ما نمی خواهیم این مدت طولانی را صبر کنیم .فکر کنید، فکر کنید…مگر ما جایی را نخوانده بودیم که سایز بزرگتر دسته ( Batch )، آموزش شبکه را سرعت می بخشد و به مدل کمک می کند تا بهتر تعمیم یابد ؟ بیایید این موضوع را بررسی کنیم.

انتخاب بزرگ ترین دسته ( Batch )

در مفهوم، بزرگترین اندازه دسته به معنی بزرگترین اندازه ای که در هر یک از GPU های ما می تواند قرار بگیرد : هر کدام از آن ها دارای ۱۱۴۳۹ مگابایت Ram هستند.

با استفاده از دستور nvidia-smi می توانیم ببینیم که آموزش فعلی فقط در حدود ۱۵۰۰ مگابایت استفاده می کند. از آنجا که ما یک پارامتر اندازه دسته به اسکریپت خود معرفی نکردیم، از مقدار پیش فرض ۱۲۸ استفاده می کند. این به هیچ وجه کار آمد نیست.

پایگاه داده ی ImageNet پایتون

با آزمایش و خطا، به سرعت می توان فهمید که بزرگترین اندازه دسته ی ممکن ۱۴۰۸ است. بیایید آن را امتحان کنیم.

python train_imagenet.py --network resnet --num-layers 50 \
--gpus 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 \
--data-train /data/im2rec/imagenet_training.rec \
--data-val /data/im2rec/imagenet_validation.rec \
--batch-size 1408
پایگاه داده ی ImageNet پایتون 2

اکنون بهتر شد : حداکثر رم GPU پر شده است . سرعت آموزش باید خیلی بالاتر شده باشد …. درست است؟

پایگاه داده ی ImageNet سرعت

خیر. قطعا جایی از کار ایراد دارد. بیایید جزئیات را بررسی کنیم.

تشخیص GPU های متوقف شده

رم GPU کاملا استفاده شده است. اما هسته های واقعی GPU چطور؟ همان طور که معلوم است ، راهی آسان برای پیدا کردن آن وجود دارد. بیایید به “volatile GPU information” که توسط nvidia-smi نشان داده شده نگاهی بیاندازیم که اطلاعاتی در مورد این که چقدر GPU ها در حال کار هستند، به ما می دهد.

پایگاه داده ی ImageNet Nvidia

این خوب نیست. یک ثانیه، GPU های ما ۱۰۰ % کار می کنند و ثانیه ی بعد بیکار هستند .

به نظر می رسد آن ها بارها و بارها متوقف شده اند، که احتمالا به این معنی است که ما نمی توانیم یک جریان سریع مناسب از داده ها را حفظ کنیم تا آن ها را دائم مشغول نگه داریم . بیاید نگاهی به پروسه ی پایتون بیندازیم…..

مقیاس کردن پروسه ی پایتون

فایل های RecordIO که مجموعه آموزش را در بر دارند، بر روی فضای EBS ذخیره شده اند (ساخته شده توسط اسنپ شات (Snapshot)، همان طور که پیش از این توضیح داده شده بود).اسکریپت پایتون ما تصاویر را با استفاده از مقدار پیش فرض ۴ رشته ( thread ) می خواند. سپس، قبل از تغذیه آن ها به GPU ، تقویت داده را روی آن ها انجام می دهد ( تغییر اندازه ، تغییر نسبت ابعاد وغیره). مشکل کار احتمالا همینجاست.

پایگاه داده ی ImageNet پایتون

زمان بیکار بودن GPU ها بسیار زیاد است ( id = 80.5% ) . اما هیچ وقفه ای در ورودی و خروجی (I/O) وجود ندارد (wa = 0%).  به نظر می رسد سیستم به اندازه کافی کار نمی کند. سیستم p2.16xlarge دارای ۶۴ پردازنده ی CPU مجازی است. پس بیایید رشته های رمزگشایی ( Decoding Threads ) بیشتری اضافه کنیم .

python train_imagenet.py --network resnet --num-layers 50 \
--gpus 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 \
--data-train /data/im2rec/imagenet_training.rec \
--data-val /data/im2rec/imagenet_validation.rec \
--batch-size 1408 --data-nthreads=32

رمز گشایی موضوعات

اکنون GPU های ما بسیار مشغول به نظر می رسد.

پایگاه داده ی ImageNet Nvidia 2

درمورد پروسه ی پایتون ما چطور؟

پایگاه داده ی ImageNet پایتون 3

همچنین سخت تر نیز کار می کند، همه ۳۲ رشته به صورت موازی در حال اجرا هستند. بدون هیچ وقفه ای در ورودی و خروجی ( به لطف استفاده از EBS ) درحقیقت به نظر می رسد در مورد ورودی و خروجی حاشیه امنیتی خوبی داشته باشیم : مطمئنا می توانیم رشته های بیشتری را برای پشتیبانی از یک دسته بزرگتر یا GPU سریع تر اضافه کنیم.

در مورد سرعت آموزش چطور؟ به خوبی درحال پردازش پایدار بیش از ۷۰۰ تصویر در ثانیه است. که افزایش ۷۵ درصدی از زمانی که شروع کردیم مشاهده می شود، پس تلاش های ما ارزش داشت.

یک دوره در ۳۰ دقیقه به پایان می رسد، که فقط کمی بیش از ۲ روز برای ۱۰۰ دوره طول می کشد. زیاد بد نیست.

پایگاه داده ی ImageNet دوره ها

بهینه سازی اقتصادی

۵۰ ساعت آموزش برای ما به صورت درحال تقاضا ( on-demand )  در شرق آمریکا۷۲۰ دلار هزینه خواهد داشت. مطمئنا این را هم می توانیم بهینه کنیم ؟

بیایید به قیمت های منطقه ای p2.16xlarge نگاهی بیندازیم. قیمت آن ها از یک منطقه به منطقه دیگر بسیار متفاوت هستند اما این چیزی است که من در منطقه ی غرب آمریکا یافتم. ( نکته: با استفاده از API توضیح قیمت منطقه ای می توانید قیمت های بسیار خوبی را سریعا پیدا کنید )

پایگاه داده ی ImageNet نمودار قیمت

 بله . حدود ۸۹% تخفیف گرفته شد. اکنون آموزش چیزی حدود ۸۰ دلار هزینه خواهد داشت.

نتیجه گیری

همانطور که می بینید ، یادگیری عمیق  چیزهای بسیار بیشتری نسبت به پایگاه داده ها و مدل ها دارد. اطمینان از اینکه زیر ساخت های شما با ظرفیت کامل و بهترین قیمت ممکن اجرا می شود نیز نیاز به توجه دارد. امیدوارم این پست به انجام هردو کمک کند.

بیشتر بخوانید :

منبع Medium
0/5 ( 0 نظر )

درباره‌ی احمدرضا جعفری

همچنین ببینید

دوره یادگیری ماشین اندرو انگ دانشگاه استنفورد

دوره ی رایگان یادگیری ماشین استنفورد

این دوره که توسط بنیانگذار Coursera ، اندرو انگ ( Andrew Ng ) ایجاد شده …

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *