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

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

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

وقتی صحبت از ساخت کلاسه بند ( طبقه بندی کننده ) تصویر می شود، ImageNet احتمالا شناخته شده ترین مجموعه داده است. که از آن همچنین برای رقابت سالانه ILSVRC استفاده می شود، جایی که محققان ازسرتاسر جهان برای ساختن کارآمدترین مدل ها رقابت می کنند.

مدل ها قبل ازاینکه روی سایر مجموعه های تصویر تنظیم دقیق ( Fine-Tune ) شوند، روی تصاویر ImageNet آموزش داده می شوند. تنظیم دقیق، یک فرآیند بسیار عالی سریع تر و یک روش عالی برای به دست آوردن دقت بسیار خوب، تنها در چند دوره ( Epoche ) است.

با این وجود، چگونه می توانیم ImageNet بدست آورده و آن را برای آموزش آماده کنید ؟ خب با Apache MXNet شروع می کنیم اما چه کسی می داند به کجا خواهیم رسید؟

مطلب مرتبط :

چالش ilsvrc Imagenet

موارد عددی  ImageNet

با وجود حجم ۱۵۰ گیگابایت ImageNet یک هیولا است. این مجموعه دارای ۱،۲۸۱،۱۶۷ تصویر برای آموزش و ۵۰۰۰۰ تصویر برای اعتبار سنجی است که در ۱هزار دسته سازماندهی شده اند؛ که با مجموعه های MNIST و CIFAR-10 بسیار فاصله دارد.

این امر باعث ایجاد انواع مسائل زیادی می شود که باید قبل از شروع آموزش برطرف شوند، یعنی :

  • بارگیری مجموعه داده ها
  • سازماندهی مجموعه داده ها برای آموزش
  • ایجاد فایل های RecordIO برای بهینه سازی ورودی و خروجی ( I/O )
  • پشتیبان گیری از مجموعه داده ها، زیرا چه کسی می خواهد۱۵۰گیگابایت را دوباره بارگیری کند
  • استفاده از داده ها به صورت کار آمد برای پردازنده ی GPU جهت آموزش

قرار است همه این مراحل را ببیند. مانند همیشه، قسمت سخت کار در جزئیات آن است.

شروع بارگیری یک نمونه

ما باید۱۵۰گیگابایت را بارگیری کنیم، این کار فقط مدتی طول می کشد ( احتمالا چند روز ) و تقریبا حدود ۱۵۰ گیگابایت فضای دیسک پرمی شود بنابراین بهتراست از قبل برای آن برنامه ریزی کنید.

من به این صورت انجام دادم: یک پردازنده ی large.t2 (سیستم مجازی) را اجرا کردم ( اما  t2.microهم باید جوابگو باشد ) که بیش از اندازه برای انجام بارگیری قدرتمند است. من همچنین یک حافظه ی EBS ۱۰۰۰ گیگابایتی را به آن اضافه کردم ( زیرا بعدا به فضای اضافی نیاز خواهیم داشت ) از آنجا که عملکرد ورودی خروجی ( I/O ) در اینجا مهم نیست، من ارزان ترین نوع حافظه  ( sc1  ) را انتخاب کردم.

سپس به سیستم وارد شدم، حافظه را فرمت کردم و آن روی /data تنظیم کردم و به صورت بازگشتی روی حالت ec2-user:ec2-user قرار دادم. امیدوارم که شما نیازی نداشته باشید که این مراحل را به شما نشان دهم، اما درصورت نیاز اینجا آموزش آن موجود است.

بارگیری مجموعه داده ها

شروع کار آسان است. به وبسایت ImageNet  بروید، ثبت نام کنید، شرایط را بپذیرید و تمام. یک نام کاربری و یک کلید دسترسی به شما داده خواهد شد که به شما امکان می دهد مجموعه داده ها که از چندین فایل بسیار بزرگ تشکیل شده است را بارگیری کنید. به هیچ وجه نمی توانیم کلیک راست کرده و (( Save ))  را انجام دهیم.

خوشبختانه یکی از منابع Tensorflow شامل یک اسکریپت بارگیری خوب به نام download_ImageNet.sh است. کاملا سر راس است ، اینگونه از آن استفاده می شود .

و بعد باید کمی صبر کنید : بارگیری من حدود ۵ روز طول کشید…

وقتی کار اسکریپت تمام شد، فهرست شما باید به این شکل باشد.

سازماندهی مجموعه داده ها برای آموزش

بیایید نگاهی به مجموعه داده ها بیندازیم .اگر فایل های آدرس ImageNet/train را فهرست کنید، ۱۰۰۰ آدرس را مشاهده خواهید کرد که هرکدام از آن ها برای دسته بندی های معین ImageNet ، عکس دارند. بله، آن ها نام های عجیب وغریب دارند، به همین دلیل شما باید این پرونده را بگیرید تا بدانید هر کدام چه چیزی است ، به عنوان مثال no2510455 دسته ای برای پانداهای غول پیکر است.

اگر آدرس ImageNet/validation را فهرست کنید ۵۰۰۰۰ تصویر را دریک آدرس خواهید دید. این واقعا در عمل مناسب نیست. بهتر است آن ها را در ۱۰۰۰ آدرس تقسیم کنیم. برای این کار نیز این اسکریپت به شما کمک خواهد کرد: تنها باید آن را در آدرس validation اجرا کنید.

ایجاد پرونده های RecordIO برای بهینه سازی IO

درحین آموزش، قطعا می توانیم تصاویررا از روی دیسک بارگذاری کنیم. با این حال، این به ورودی و خروجی (I/O) زیادی احتیاج دارد، به خصوص هنگام استفاده از چندین GPU ؛ این هیولا ها بسیار گرسنه هستند و شما باید درتمام طول پروسه، آن ها را با داده های مناسب تغذیه کنید. درصورت عدم انجام این کار GPU متوقف می شود و سرعت آموزش شما کاهش می یابد ( توضیحات بیشتر دراین مورد در پست بعدی )

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

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

 این روند بسیار ساده است؛ می خواهیم مجموعه آموزش و اعتبار سنجی موجود را در فایل RecordIO خود بسته بندی کنیم. همچنین باید تصاویر را کمی تغییر اندازه و فشرده سازی کنیم تا مقداری در فضای مصرفی صرفه جویی شود؛ این هیچ تاثیری در کیفیت آموزش نخواهد داشت زیرا بیشتر مدل های ImageNet به تصاویر ۲۲۴× ۲۲۴ احتیاج دارند. برای داشتن حداکثر ورودی ، رشته ( Thread ) های زیادی ایجاد کنید.

بیایید با مجموعه اعتبار سنجی شروع کنیم. این تنها چند دقیقه زمان می برد.

حال همین کار را برای مجموعه آموزش ها نیز انجام دهید .این کار مدتی زمان می برد ( حدود یک ساعت ونیم بر روی t2.xlarge من )

پشتیبان گیری

اکنون که به اینجا رسیدیم، از دست دادن همه ی کار هایی که انجام داده ایم بیش از حد اعصاب خورد کن است. بیایید از همه موارد بر روی s3 پشتیبان گیری کنیم. تنها یک باکت ( Bucket ) ایجاد کنید و داده های خود را با دستور /data همگام سازی کنید. این کار نیز زمان بر خواهد بود.

پس از اتمام پشتیبان گیری باید :

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

بااستفاده از مجموعه داده ها

استفاده از مجموعه ی داده ها در یک پردازنده ی GPU جدید اکنون به آسانی این انجام می شود :

  • ایجاد یک حافظه ی EBS جدید از اسنپ شات گرفته شده ( مطمئن شوید که اسنپ شات را در همان فضای قابل دسترسی ایجاد کنید که پردازشگر وجود دارد )
  • اتصال مجموعه داده به پردازشگر
  • نصب فایل سیستم ( filesystem )

این کار تنها چند ثانیه زمان می برد و می توانید آن را تبدیل به اسکریپت کنید و بر روی هر تعداد پردازشگر که نیاز دارید استفاده کنید ( با دستور aws ec2 create volume و  aws ec2 attach-volume ). برای اتوماسیون کامل می توانید این عملیات را به عنوان دستورات داده کاربر (User Data) در هنگام  راه اندازی استفاده کنید.

نتیجه :

مطمئنا بارگیری ImageNet مدتی طول می کشد اما به لطف انعطاف پذیری  EBS ما اکنون می توانیم آن را در چند ثانیه به تعداد دلخواه مورد نیاز خود تکثیر کنیم. البته شما می توانید از این روش سریع و مقرون به صرفه برای مجموعه داده های دیگر نیز استفاده کنید.

در پست بعد، ما مدل را از صفر آموزش می دهیم و بر روی این که بتوانیم بیشترین مقدار ممکن کارایی را از پردازشگر های GPU دریافت کنیم، تمرکز می کنیم.

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

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

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

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

با برنامه نویسی پولدار شویم

چگونه با برنامه نویسی پولدار شویم؟

فرصت های زیادی برای افزایش درآمد از طریق کار روزانه وجود دارد. برنامه نویسی یک …

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

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