از Pytorch به Pytorch lightning – معرفی کلی

این مقاله به این سوال شما پاسخ خواهد داد که وقتی ما از Pytorch استفاده می کنیم، چه نیازی به Lightning داریم؟

با استفاده از Pytorch به راحتی می توان مدل های پیچیده هوش مصنوعی را ایجاد کرد. اما زمانی که تحقیقات پیچیده شود و مواردی مانند آموزش پردازنده گرافیکی چندلایه ، دقت ۱۶ بیتی و آموزش پردازنده TPU با هم درآمیخته می شوند، کاربران احتمالا در استفاده از Python دچار مشکل خواهند شد.

Pytorch Lightning ، دقیقا می تواند این گونه مشکلات را حل کند. Lightning کد شما را سازماندهی می کند تا بتواند جزییات آموزش را انتزاعی کند که باعث می شود تحقیقات هوش مصنوعی به منظور تکرار و آزمایش، به صورت مقیاس پذیر و سریع انجام شود.

Pytorch lightning برای چه کسانی ساخته شده است؟

Lightning ، برای محققان حرفه ای و دانشجویان دکترا که بر روی تحقیقات مرتبط با هوش مصنوعی کار می کنند ساخته شده است.

چارچوب Pytorch Lightning به گونه ای طراحی شده است که درعین بی اهمیت جلوه دادن تکنیک های تحقیقاتی پیشرفته به کار گرفته شده در مورد هوش مصنوعی (مانند آموزش TPU ها) ، بسیار توسعه پذیر نیز باشد.

اکنون همه مشارکت کنندگان اصلی در تحقیقات هوش مصنوعی با استفاده از Lightning در حال پیشرفت در حوزه هوش مصنوعی هستند و به افزودن ویژگی های جالب جدید ادامه می دهند.

با این حال، رابط کاربری ساده آن به تیم های تولید حرفه ای و تازه واردان اجازه می دهد تا به آخرین تکنیک های پیشرفته توسعه یافته توسط انجمن Pytorch و Pytorch Lightning دسترسی داشته باشند.

تیم محققان، متشکل از ۳۲۰ مشارکت کننده، یک تیم اصلی ۱۱ نفره دانشمندان، دانشجویان دکترا و مهندسان حرفه ای در زمینه یادگیری عمیق است.

طرح کلی برنامه

این آموزش، شما را به وسیله ساخت یک طبقه بندی کننده ساده MNIST راهنمایی می کند و کد Pytorch و Pytorch Lightning را در کنار هم نشان دهد تا بتوان آن ها را به درستی با هم مقایسه کرد. در حالی که Lightning هم می تواند هر سیستم خودمختار پیچیده ای را بسازد، ما از MNIST برای نشان دادن نحوه تغییر کد Pytorch به Pytorch Lightning استفاده می کنیم.

کد کامل این دو برنامه در این notebook colab موجود است.

پروژه تحقیقاتی متداول هوش مصنوعی

ما در یک پروژه تحقیقاتی، به طور معمول می خواهیم اجزای کلیدی زیر را شناسایی کنیم:

  • مدل
  • داده
  • ضرر
  • بهینه کننده ها

مدل

می خواهیم یک شبکه عصبی کاملا متصل ۳ لایه را طراحی کنیم که یک تصویر ۲۸*۲۸ را به عنوان وروردی می گیرد و یک توزیع احتمالی بر روی ۱۰ برچسب ممکن را به عنوان خروجی می دهد.

قبل از هر چیز می خواهیم مدل  را در برنامه PyTorch تعریف کنیم:

این مدل، یک نمودار محاسباتی را تعریف می کند تا یک تصویر MNIST را به عنوان ورودی بگیرد و آن را به یک توزیع احتمالی در ۱۰ ردیف برای ارقام ۰-۹ تبدیل کند.

برای تبدیل این مدل به Pytorch Lightning ، به سادگی nn.Module را با pl.LightningModule جایگزین کنیم.

دسته Pytorch جدید، دقیقا همان Pytorch است؛ به جز این که ماژول Lightning ، ساختاری را برای کد تحقیقاتی فراهم می آورد.

Lightning ، ساختاری را برای کد Pytorch فراهم می آورد.

مشاهده کردید؟ این کد دقیقا برای هر دو برنامه یکی است!

به این معناست که شما می توانید از ماژول Lightning ، دقیقا مشابه ماژول Pytorch برای پیش بینی استفاده کنید

و یا از آن به عنوان یک مدل از پیش آموزش دیده استفاده کنید.

تفاوت Pytorch و Pytorch Lightning

داده

برای این برنامه آموزشی هم ما از MNIST استفاده می کنیم.

MNIST سه بخش دارد؛ بخش آموزش، آزمایش و اعتبارسنجی

این بخش نیز در Lightning مشابه Pytorch است.

مجموعه داده به بخش بارگذار داده اضافه می شود که به ترتیب بارگذاری، ترکیب و دسته بندی مجموعه داده را مدیریت می کند.

مراحل آماده سازی داده به طور خلاصه چهار مرحله دارد:

۱- دانلود تصاویر

۲- تغییر شکل تصاویر

۳- ایجاد سه بخش آموزش، اعتبارسنجی و آزمایش

۴- هر مجموعه داده در یک dataloader قرار داده شود

دوباره کد دقیقا یکسان است؛ با این تفاوت که ما کد Pytorch را در ۴ تابع سازماندهی کرده ایم :

آماده سازی داده

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

دلیل این اتفاق این است که هر پردازنده گرافیکی ، یک بار کد Pytorch را اجرا می کند و در نتیجه باعث تکرار می شود. با اجرای تمام کد ها در Lightning این اطمینان را حاصل می شود که بخش های مهم فقط از روی یک پردازنده گرافیکی بازخوانی می شوند.

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

هر یک از این بخش ها مسئول بازگردانی بخشی از داده های تقسیم شده هستند. Lightning برنامه را به این شکل سازماندهی می کند تا نحوه دستکاری داده ها بسیار واضح باشد. اگر تا به حال کد پایتونی را به طور تصادفی در github دیده باشید، تقریبا غیرممکن است که بفهمید آن ها چگونه داده ها را دستکاری می کنند.

Lightning حتی امکان استفاده از چند بارگذار داده آزمایش یا اعتبارسنجی را نیز می دهد.

این کد، به وسیله بخشی به نام ماژول داده سازماندهی می شود. اگر چه این امر ۱۰۰ درصد اختیاری است و Lightning می تواند به طور مستقیم از بارگذار داده (DataLoader) استفاده کند، اما ماژول داده (DataMadule) می تواند داده های شما را قابل استفاده دوباره کرده و اشتراک گذاری آن ها را آسان کند.

بهینه ساز

حالا زمان آن فرارسیده تا بهینه سازی را انجام دهیم. ما به جای SGD از Adam استفاده می کنیم؛ زیرا یک پیش فرض خوب در بیشتر تحقیقات مربوط به یادگیری عمیق است.

مجددا کد در هر دو برنامه دقیقا یکسان است؛ به جز این که در عملکرد بهینه ساز های پیکربندی، سازماندهی شده است.

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

همچنین متوجه خواهید شد که در Lightning ، ما self.parameters() را ارسال می کنیم و نه یک مدل؛ زیرا LightningModule خود مدل است.

ضرر

برای طبقه بندی n مسیری می خواهیم خطای آنتروپی متقاطع را محاسبه کنیم. آنتروپی متقاطع ، همان NegativeLogLikelihood(log_softmax) است که ما به جای آن استفاده می کنیم.

مجددا، دوباره همان کد است!

حلقه آموزش و اعتبارسنجی

ما تمام عناصر کلیدی مورد نیاز برای آموزش را گردآوری کردیم. این عناصرعبارتند از:

۱- مدل (شبکه سه لایه عصبی)

۲- مجموعه داده ( MNIST )

۳- بهینه ساز

۴- خطا

حال ما می خواهیم یک برنامه ترکیبی آموزشی کامل را که شامل موارد زیر است پیاده سازی کنیم:

  • چندین دوره تکرار می شود ( منظور از یک دوره، گذر کامل از مجموعه داده D است)
  • هر دوره، مجموعه داده را در مجموعه ای کوچک به نام دسته b تکرار می کند.
  • یک گذر به جلو انجام می دهیم.
  • ضرر را محاسبه می کنیم.
  • برای محاسبه تمام گرادیان های هر وزن ، گذر به عقب انجام می دهیم.
  • گرادیان ها را به هر یک از وزن ها اعمال کنید.
  • در هر دو برنامه Pytorch و Lightning ، شبه کدی مانند شکل زیر به نظر می رسد.

این جا همان جایی است که Lightning ، کد متفاوتی دارد. در Pytorch ، شما حلقه for را خودتان می نویسید و این بدین معناست که باید به یاد داشته باشید تا موارد صحیح را به ترتیب درست فراخوانی کنید. این کار باعث می شود احتمال بروز باگ ها زیاد شود.

حتی اگر مدل شما ساده باشد، زمانی که شروع به انجام کارهای پیشرفته تری مانند استفاده از چند پردازنده گرافیکی ، برش گرادیان ، توقف زودهنگام ، بررسی ، آموزش TPU ، دقت ۱۶ بیتی و… می کنید، پیچیدگی کد شما به سرعت بیشتر می شود.

حتی اگر مدل شما هم ساده باشد، نمی توانید شروع به انجام کارهای پیشرفته تر کنید.

در این قسمت، شما حلقه اعتبارسنجی و آموزش را برای دو برنامه Pytorch و Lightning مشاهده می کنید.

این بخش، مزیت کار با Lightning را به شما نشان می دهد. بخشی از کد را (خارج از کادر ها) به حالت انتزاعی در می آورد. اما بقیه چیز ها را بدون تغییر باقی می گذارد.این بدین معناست که شما هنوز درحال کد نویسی در Pytorch هستید با این تفاوت که کد برنامه شما به خوبی سازماندهی شده است.

این کار باعث خوانایی بهتر برنامه می شود که به تکرارپذیری نیز بسیار کمک می کند!

آموزش دهنده Lightning

این آموزش دهنده به ما در نحوه انتزاعی کردن کد های موجود در صفحه کمک می کند.

تمام این بهینه سازی ها در کد نویسی به واسته ی سازماندهی کد های Pytorch در ماژول Lightning اتفاق افتاده است.

حلقه آموزشی کامل برای Pytorch

نمونه کامل MNIST در Pytorch ، به شرح زیر نوشته شده است:

حلقه آموزشی کامل برای Lightning

ورژن Lightning نیز دقیقا مانند pytorch است؛ به جز موارد زیر که عبارتند از :

  • عناصر کلیدی توسط ماژول Lightning سازماندهی شده است.
  • کد حلقه آموزش / اعتبار سنجی توسط برنامه آموزش دهنده، به حالت انتزاعی درآمده است.

این ورژن از ماژول داده استفاده نمی کند؛ اما به جای آن، بارگذار داده ها را جداگانه تعریف کرده است.

و در این جا نیز همان کد است؛ به جز آنکه داده ها در قالب ماژول داده گروه بندی شده و قابلیت استفاده دوباره را دارا هستند.

نکات مهم

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

۱- بدون استفاده از Lightning ، کد Pytorch امکان دارد تا در بخش های برنامه ریزی نشده برود. اما با استفاده از برنامه Lightning ، این کدها ساختاردهی می شوند.

۲- در هر دو حالت کد دقیقا یکسان است و تنها تفاوتی که با هم دارند این است که کد ها در داخل  Lightning سازماندهی شده هستند.( ارزش دوباره گفتن را دارد)

۳- با پیچیده تر شدن پروژه، کد پیچیده تر نخواهد شد؛ زیرا Lightning بیشتر این کدها را به حالت انتزاعی درآورده است.

۴- شما بخش انعطاف پذیر Pytorch را حفظ می کنید؛ زیرا بر تمام موارد کلیدی آموزش کنترل و تسلط کامل دارید. به عنوان مثال، شما ممکن است یک گام آموزشی پیچیده مانندseq2seq دارید.

۵- در Lightning ، شما موارد زیادی مانند نوار پیشرفت برنامه را دریافت می کنید.

شما هم چنین خلاصه ای از وزن ها را به دست می آورید.

 لاگ های مربوط به تنسور بُرد ( بله! به راحتی شما می توانید این کار را انجام دهید)

و نقاط بررسی و توقف. تمام این ویژگی ها به سادگی و به طور رایگان در دسترس شما قرار دارد.

سایر ویژگی ها…

  • با Lightning شما می توانید مدل خود را بر روی CPU، پردازنده های گرافیکی ، پردازنده های گرافیکی چند لایه و یا TPU ها بدون نیاز به تغییر کد Pytorch ، آموزش را انجام دهید.
  • شما همچنین می توانید با دقت ۱۶ بیتی آموزش را انجام دهید.

لاگ های دریافت شده با استفاده از ۵ جایگزین دیگر برای تنسوربورد

حتی یک پروفایل داخلی وجود دارد که به شما می گوید گلوگاه آموزشی کجاست.

با فعال سازی فلگ این خروجی به شما نشان داده می شود.

یا اگر خروجی پیشرفته تری می خواهید باید به شیوه زیر عمل کنید.

ما همچنین می توانیم چند پردازنده گرافیکی را همزمان آموزش دهیم. بدون آن که نیاز به انجام کار خاصی باشد (هنوزباید یک SLURM ارسال کنید).

و همچنین Lightning از حدود ۴۰ ویژگی دیگر نیز پشتیبانی می کند که می توانید مستندات آن ها را بخوانید.

توسعه پذیری با Hook ها

احتمالا برای شما سوال است که چگونه ممکن است Lightning این کار را برایتان انجام دهد و در عین حال به نحوی این کار را انجام دهد که کنترل کاملی بر همه چیز داشته باشید؟

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

اولین مورد، توسعه پذیری از طریق Hook ها است.

در این جا یک لیست غیر جامع وجود دارد:

  • و سایر چیزهایی که برای پیکربندی به آن ها نیاز دارید

همه این عملیات ها در Lightning اتفاق می افتد.

توسعه پذیری با فراخوان ها

فراخوان، قطعه ای از یک کد است که شما می خواهید در بخش های مختلف آموزش تان، آن را پیاده سازی و اجرا کنید. فراخوان ها در Lightning برای کدهای غیر ضروری مانند ورودی و یا هر چیزی که به کد تحقیقاتی مربوط نیست، ذخیره می شوند. این کار باعث می شود تا خللی در کد تحقیقاتی وارد نشود و به خوبی سازماندهی شود.

فرض کنید شما می خواهید در بخش های مختلف آموزشی بعضی چیزها را ذخیره و یا پرینت کنید. تصویر زیر به شما نحوه این فراخوانی را نشان می دهد.

اکنون شما این کد را به برنامه آموزش دهنده خود می دهید و این کد در زمان های مختلف فراخوانی  می شود.

این الگو، کد شما را در سه سطح مختلف دسته بندی می کند:

  • کد تحقیق( ماژول Lightning )
  • کد مهندسی( آموزش دهنده )
  • کدهای غیر مرتبط با تحقیق ( فراخوان ها )

از کجا شروع کنیم؟

ما در این آموزش شما را راهنمایی کردیم که چه کار باید انجام دهید. برای شروع کافی است نوتبوک Colab را روی داده های MNIST اجرا کرده و یا Lightning را مطابق دستور زیر نصب کنید

نصب python lightning

و یا به صفحه github بروید.

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

منبع Towards Data Science

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

خودآموز یادگیری ماشین نرم افزار ها

۱۱ نرم افزار برتر یادگیری ماشین – پیش از اینکه پشیمان شوید، یاد بگیرید!

نرم افزار های یادگیری ماشین بخش مهم و جدیدی در مجموعه خودآموز یادگیری ماشین است. …

دیدگاهتان را بنویسید

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