tgoop.com/pytorch_howsam/556
Last Update:
امروز، کمی زمان خالی داشتم و رفتم ادامه ویدئوی چهارساعته Andrej Karpathy برای پیادهسازی و آموزش GPT-2 رو ببینم. این ویدئو شامل چند بخش هست که من قبلا بخش اول رو دیده بودم. در بخش اول، مدل GPT-2 رو کامل پیادهسازی کرد و کارهای اولیه برای آموزش مدل رو انجام داد.
بخش دوم این ویدئو مربوط به کاهش زمان فرآیند آموزش مدل هست. در پایان بخش اول، مدت زمان آموزش مدل برای هر ایپاک روی دیتاست شکسپیر حدود 1000 میلی ثانیه هست. در بخش دوم، تکنیکهای مختلفی رو گام به گام اعمال میکنه و مدت زمان آموزش مدل رو کاهش میده. درادامه، بهصورت خلاصه این تکنیکها رو همراه با عدد و رقم گفتم...
در اولین گام، بجای آموزش مدل با float32 از TF32 یا تنسورفلوت 32 بیتی استفاده کرد. این باعث شد که مدت زمان اجرای هر ایپاک از 1000 به 333 میلی ثانیه کاهش پیدا کنه! البته، روی کاغذ انتظار 8 برابر بهتر شدن سرعت میرفت، ولی در عمل 3 برابر شد. این قابلیت TF32 بیتی برای هر GPU-ای فعال نیست. مثلا، A100 این قابلیت رو داره. مطالعه بیشتر
در گام دوم، بجای TF32 از bFloat16 استفاده کرد و زمان اجرای هر ایپاک از 333 به 300 میلی ثانیه رسید. بازهم این قابلیت در همه GPU-ها وجود نداره.
در گام سوم، از torch.compile پایتورچ استفاده کرد و مدت زمان اجرای هر ایپاک از 300 به 130 میلی ثانیه کاهش پیدا کرد. کاهش زمانی بسیار زیادی بود. کار سادهای هم هست.
در گام چهارم، بجای attention از flash attention استفاده کرد و مدت زمان از 130 به 96 میلی ثانیه رسید! این flash attention توی پایتورچ موجود هست و نیازی به پیادهسازی از صفر یا کتابخونه جانبی هم نیست.
و اما گام پنجم! پیشنهاد کرد که اعداد و هایپرپارامترهای موجود در کد رو به توانی از 2 تبدیل کنیم. توانی از 2 رو اعداد نایسی میدونه و GPU باهاش بهینهتر کار میکنه. مثلا وکب سایزش 50257 بود که این عدد زشتی هست! عدد رو تبدیل به 50304 کرد که باعث شد مدت زمان از 96 به 93 میلی ثانیه برسه! وکب سایز بزرگتر شد، ولی زمان کل کمتر! 😁 درسته که 50304 توانی از 2 نیست، اما تقریبا نایس هست، چون بر 2 4 8 16 32 64 128 بخشپذیره. اعداد زشت دیگهای هم توی کد بود؛ مثل تعداد لایهها، تعداد head در اتنشن که دیگه اینها رو دستکاری نکرد. بقیه زشتها با من و شما...
خلاصه اینکه، با یکسری تکنیک ساده ولی هوشمندانه، مدت زمان آموزش مدل به ازای هر ایپاک رو از 1000 میلی ثانیه به 93 میلی ثانیه رسوند. البته، خیلی از این روشها الان در مقالات استفاده میشن و اینطور نیست که وجود نداشته باشه.
یبار نگی 1000 میلی ثانیه برای یک ایپاک چیزی نیست! گناه بزرگیه! بخش سوم رو هنوز ندیدم...
@pytorch_howsam
BY PyTorch Howsam
Share with your friend now:
tgoop.com/pytorch_howsam/556