5 نکته برای آموزش چند GPU با Keras PlatoBlockchain Data Intelligence. جستجوی عمودی Ai.

5 نکته برای آموزش چند GPU با Keras

یادگیری عمیق (کلمه مورد علاقه اواخر دهه 2010 همراه با بلاک چین/بیت کوین و علم داده/یادگیری ماشین) به ما این امکان را داده است که در چند سال گذشته کارهای بسیار جالبی انجام دهیم. به غیر از پیشرفت‌های الگوریتم‌ها (که مسلماً مبتنی بر ایده‌هایی هستند که از دهه 1990 با نام «عصر داده‌کاوی» شناخته شده‌اند)، دلایل اصلی موفقیت آن را می‌توان به در دسترس بودن مجموعه داده‌های رایگان بزرگ، معرفی کتابخانه‌های منبع باز و استفاده از پردازنده های گرافیکی در این پست وبلاگ من روی دو مورد آخر تمرکز خواهم کرد و نکاتی را که به سختی یاد گرفتم با شما به اشتراک خواهم گذاشت.

چرا TensorFlow و Keras؟

TensorFlow یک کتابخانه یادگیری عمیق بسیار محبوب است که توسط Google توسعه یافته است که به شما امکان می دهد شبکه های پیچیده را به سرعت نمونه سازی کنید. دارای بسیاری از ویژگی های جالب مانند تمایز خودکار (که شما را از تخمین/کدگذاری گرادیان توابع هزینه صرفه جویی می کند) و پشتیبانی از GPU (که به شما امکان می دهد به راحتی با استفاده از سخت افزار مناسب سرعت 200 برابری را افزایش دهید). علاوه بر این، یک رابط پایتون ارائه می دهد که به این معنی است که شما می توانید به سرعت بدون نیاز به نوشتن کد C یا CUDA نمونه سازی کنید. مسلماً فریمورک‌های زیادی وجود دارد که می‌توان به جای TensorFlow از آن‌ها استفاده کرد، مانند Torch، MXNet، Theano، Caffe، Deeplearning4j، CNTK، و غیره، اما همه اینها به موارد استفاده و ترجیحات شخصی شما خلاصه می‌شود.

اما چرا کراس? برای من استفاده مستقیم از TF مانند انجام یادگیری ماشینی با Numpy است. بله امکان پذیر است و هر از چند گاهی باید این کار را انجام دهید (مخصوصاً اگر لایه های سفارشی/ توابع از دست دادن بنویسید) اما آیا واقعاً می خواهید کدی بنویسید که شبکه های پیچیده را به عنوان یک سری عملیات برداری توصیف کند (بله، می دانم روش های سطح بالاتری در TF وجود دارد اما به خوبی Keras نیستند؟ همچنین اگر بخواهید به کتابخانه دیگری نقل مکان کنید چه؟ خوب پس احتمالاً باید کد را بازنویسی کنید، که بد است. تا تا تاآ، کراس به نجات! Keras به شما این امکان را می‌دهد تا شبکه‌های خود را با استفاده از مفاهیم سطح بالا توصیف کنید و کدی بنویسید که باطنی آگنوستیک است، به این معنی که می‌توانید شبکه‌ها را در کتابخانه‌های یادگیری عمیق مختلف اجرا کنید. چند چیز در مورد Keras دوست دارم این است که به خوبی نوشته شده است، معماری شی گرا دارد، مشارکت آسان است و جامعه دوستانه ای دارد. اگر دوست داشتید، تشکر کنید فرانسوا شوله برای توسعه آن و منبع باز آن.

نکات و نکاتی برای آموزش Multi-GPU

بدون مقدمه، اجازه دهید به چند نکته در مورد نحوه استفاده حداکثری از آموزش GPU در Keras و چند نکته که باید در ذهن داشته باشید بپردازیم:

1. آموزش چند GPU خودکار نیست

آموزش مدل‌های GPU با استفاده از Keras & Tensorflow یکپارچه است. اگر کارت NVIDIA دارید و CUDA را نصب کرده اید، کتابخانه ها به طور خودکار آن را شناسایی کرده و از آن برای آموزش استفاده می کنند. خیلی باحال! اما اگر شما یک دلقک خراب باشید و چندین پردازنده گرافیکی داشته باشید چه؟ خوب متأسفانه برای رسیدن به آموزش چند GPU باید کمی کار کنید.
5 نکته برای آموزش چند GPU با Keras PlatoBlockchain Data Intelligence. جستجوی عمودی Ai.
روش های مختلفی برای موازی سازی یک شبکه بسته به آنچه می خواهید به دست آورید وجود دارد، اما دو رویکرد اصلی موازی سازی مدل و داده است. اگر مدل شما خیلی پیچیده است که در یک واحد پردازش گرافیکی قرار نمی‌گیرد، اولین مورد می‌تواند به شما کمک کند، در حالی که دومی وقتی می‌خواهید سرعت اجرا را افزایش دهید کمک می‌کند. به طور معمول وقتی مردم در مورد آموزش چند GPU صحبت می کنند، منظورشان دومی است. قبلاً دستیابی به آن سخت تر بود، اما خوشبختانه Keras اخیراً یک روش کاربردی به نام استفاده کرده است mutli_gpu_model که آموزش/پیش‌بینی‌های موازی را آسان‌تر می‌کند (در حال حاضر فقط با باطن TF در دسترس است). ایده اصلی این است که شما مدل خود را از طریق روش عبور می دهید و در GPU های مختلف کپی می شود. ورودی اصلی به تکه هایی تقسیم می شود که به GPU های مختلف تغذیه می شود و سپس آنها به عنوان یک خروجی واحد جمع می شوند. این روش می تواند برای دستیابی به آموزش های موازی و پیش بینی ها مورد استفاده قرار گیرد، با این حال به خاطر داشته باشید که برای آموزش به دلیل همگام سازی مورد نیاز، مقیاس خطی با مقدار GPU ها انجام نمی شود.

2. به Batch Size توجه کنید

هنگامی که آموزش چند GPU انجام می دهید به اندازه دسته ای توجه کنید زیرا تأثیرات متعددی بر سرعت / حافظه، همگرایی مدل شما دارد و اگر مراقب نباشید ممکن است وزن مدل خود را خراب کنید!

سرعت/حافظه: بدیهی است که هر چه دسته بزرگتر باشد، آموزش/پیش‌بینی سریع‌تر است. این به این دلیل است که برای وارد کردن و خارج کردن داده ها از GPU ها هزینه زیادی وجود دارد، بنابراین دسته های کوچک سربار بیشتری دارند. از طرف دیگر، هر چه دسته بزرگتر باشد، به حافظه بیشتری در GPU نیاز دارید. به خصوص در طول آموزش، ورودی‌های هر لایه در حافظه نگهداری می‌شوند، زیرا در مرحله انتشار مجدد مورد نیاز است، بنابراین افزایش بیش از حد اندازه دسته شما می‌تواند منجر به خطاهای خارج از حافظه شود.

همگرایی: اگر از Stochastic Gradient Decent (SGD) یا برخی از انواع آن برای آموزش مدل خود استفاده می کنید، باید در نظر داشته باشید که اندازه دسته می تواند بر توانایی شبکه شما برای همگرایی و تعمیم تأثیر بگذارد. اندازه های دسته معمولی در بسیاری از مشکلات بینایی کامپیوتری بین 32-512 نمونه است. مانند کسکار و همکاران در عمل مشاهده شده است که هنگام استفاده از یک دسته بزرگتر (از 512) کیفیت مدل کاهش می یابد که با توانایی آن در تعمیم اندازه گیری می شود. توجه داشته باشید که سایر بهینه‌سازهای مختلف ویژگی‌های متفاوتی دارند و تکنیک‌های بهینه‌سازی توزیع‌شده تخصصی می‌توانند به حل مشکل کمک کنند. اگر به جزئیات ریاضی علاقه مند هستید، توصیه می کنم پایان نامه Joeri Hermans را بخوانید.در مورد یادگیری عمیق مقیاس پذیر و نزول گرادیان موازی".
5 نکته برای آموزش چند GPU با Keras PlatoBlockchain Data Intelligence. جستجوی عمودی Ai.
خراب کردن وزنه ها: این یک جزئیات فنی ناخوشایند است که می تواند نتایج ویرانگری داشته باشد. هنگامی که آموزش چند GPU را انجام می دهید، مهم است که همه GPU ها را با داده تغذیه کنید. ممکن است اتفاق بیفتد که آخرین دسته از دوره شما داده های کمتری نسبت به تعریف شده داشته باشد (زیرا اندازه مجموعه داده شما نمی تواند دقیقاً بر اندازه دسته شما تقسیم شود). این ممکن است باعث شود برخی از GPU ها در مرحله آخر هیچ داده ای دریافت نکنند. متأسفانه برخی از لایه‌های Keras، به ویژه لایه نرمال‌سازی دسته‌ای، نمی‌توانند با آنچه که منجر به نمایش مقادیر nan در وزن‌ها می‌شود (میانگین در حال اجرا و واریانس در لایه BN) کنار بیایند. برای بدتر کردن چیزها، شخص مشکل را در طول آموزش مشاهده نخواهد کرد (در حالی که مرحله یادگیری 1 است) زیرا لایه خاص از میانگین / واریانس دسته در برآوردها استفاده می کند. با این وجود در طول پیش‌بینی‌ها (فاز یادگیری روی 0 تنظیم شده است)، از میانگین/واریانس در حال اجرا استفاده می‌شود که در مورد ما می‌تواند به nan تبدیل شود که منجر به نتایج ضعیف شود. بنابراین به خودتان لطف کنید و همیشه هنگام انجام آموزش چند GPU مطمئن شوید که اندازه دسته شما ثابت است. دو راه ساده برای دستیابی به این هدف این است که دسته هایی را که با اندازه از پیش تعریف شده مطابقت ندارند را رد کنید یا رکوردهای درون دسته را تا رسیدن به اندازه از پیش تعریف شده تکرار کنید. آخرین اما نه کم اهمیت به خاطر داشته باشید که در یک راه اندازی چند GPU، اندازه دسته ای باید چند برابر تعداد GPU های موجود در سیستم شما باشد.

3. داده های GPU Starvation که CPU ها نمی توانند با GPU ها هماهنگی داشته باشند

معمولاً گران‌ترین بخش در هنگام آموزش/پیش‌بینی شبکه‌های عمیق، تخمینی است که روی GPUها اتفاق می‌افتد. داده ها در CPU ها در پس زمینه پیش پردازش شده و به صورت دوره ای به GPU ها داده می شوند. با این وجود نباید سرعت GPU ها را دست کم گرفت. ممکن است اتفاق بیفتد که اگر شبکه شما خیلی کم عمق باشد یا مرحله پیش پردازش آنقدر پیچیده باشد که CPU های شما نتوانند با GPU های شما هماهنگی داشته باشند یا به عبارت دیگر آنها را با سرعت کافی با داده تغذیه نکنند. این می تواند منجر به استفاده کم از GPU شود که به هدر رفتن پول / منابع تبدیل می شود.
5 نکته برای آموزش چند GPU با Keras PlatoBlockchain Data Intelligence. جستجوی عمودی Ai.
Keras معمولاً تخمین‌های دسته‌ها را به صورت موازی انجام می‌دهد، اما به دلیل GIL پایتون (قفل مترجم جهانی) شما واقعاً نمی‌توانید به چند رشته‌ای واقعی در پایتون برسید. دو راه حل برای این کار وجود دارد: یا از چندین فرآیند استفاده کنید (توجه داشته باشید که در این یکی چندین گوچا وجود دارد که من در اینجا به آنها اشاره نمی کنم) یا مرحله پیش پردازش خود را ساده نگه دارید. در گذشته من یک درخواست کششی برای Keras ارسال کرده‌ام تا مقداری از فشارهای غیرضروری را که در طول پیش‌پردازش تصویر به CPU وارد می‌کردیم کاهش دهم، بنابراین در صورت استفاده از ژنراتورهای استاندارد، اکثر کاربران نباید تحت تأثیر قرار گیرند. اگر مولدهای سفارشی دارید، سعی کنید تا جایی که ممکن است منطق را به کتابخانه های C مانند Numpy فشار دهید زیرا برخی از این روش ها در واقع GIL را آزاد کنید یعنی می توانید درجه موازی سازی را افزایش دهید. یک راه خوب برای تشخیص اینکه آیا با گرسنگی داده های GPU مواجه هستید، نظارت بر استفاده از GPU است، با این وجود هشدار داده می شود که این تنها دلیل مشاهده آن نیست (همگام سازی که در طول آموزش در چندین GPU اتفاق می افتد نیز مقصر استفاده کم است. ). معمولاً گرسنگی داده های GPU را می توان با مشاهده انفجارهای GPU و به دنبال آن مکث های طولانی بدون استفاده تشخیص داد. در گذشته من یک افزونه منبع باز برای Dstat تهیه کرده ام که می تواند به شما کمک کند میزان استفاده از GPU خود را اندازه گیری کنید، بنابراین نگاهی به پست اصلی اصلی وبلاگ.

4. ذخیره مدل های موازی شما

فرض کنید از روش mutli_gpu_model برای موازی کردن مدل خود استفاده کرده اید، آموزش به پایان رسید و اکنون می خواهید وزنه های آن را ادامه دهید. خبر بد این است که شما نمی توانید فقط save() را روی آن فراخوانی کنید. در حال حاضر Keras محدودیتی دارد که به شما اجازه نمی دهد ذخیره یک مدل موازی. دو راه برای حل این مشکل وجود دارد: یا save() را در مرجع مدل اصلی فراخوانی کنید (وزن ها به طور خودکار به روز می شوند) یا باید مدل را با بریدن نسخه موازی شده و پاک کردن تمام اتصالات غیر ضروری سریال کنید. گزینه اول بسیار ساده تر است، اما در آینده قصد دارم یک متد serialize() را به صورت متن باز باز کنم که دومی را انجام می دهد.

5. شمارش پردازنده های گرافیکی موجود یک اثر جانبی بد دارد

متأسفانه در حال حاضر، یک اثر جانبی ناخوشایند بر روی روش tensorflow.python.client.device_lib.list_local_devices() وجود دارد که باعث می شود یک TensorFlow Session جدید ایجاد شود و تمام GPU های موجود در سیستم مقداردهی اولیه شوند. این می‌تواند منجر به نتایج غیرمنتظره‌ای مانند مشاهده پردازنده‌های گرافیکی بیشتر از میزان مشخص شده یا شروع زودهنگام جلسات جدید شود (شما می‌توانید تمام جزئیات را در این مورد بخوانید. درخواست کشش). برای جلوگیری از غافلگیری های مشابه، به شما توصیه می شود به جای آن از متد Keras K.get_session().list_devices() استفاده کنید، که تمام GPU های ثبت شده فعلی در جلسه را به شما برمی گرداند. در آخر، به خاطر داشته باشید که فراخوانی متد ()list_devices به نوعی گران است، بنابراین اگر فقط به تعداد GPU های موجود علاقه دارید یک بار با روش تماس بگیرید و شماره آنها را در یک متغیر محلی ذخیره کنید.

خودشه! امیدوارم این لیست برای شما مفید بوده باشد. اگر نکات/گوچاهای دیگری برای آموزش GPU در Keras پیدا کردید، آنها را در زیر در نظرات به اشتراک بگذارید. 🙂

تمبر زمان:

بیشتر از Datumbox