کوانتیزه کردن مدل
جواب کوتاه
کوانتیزه کردن یعنی هر عدد مدل رو به نزدیکترین پله از یه تعداد پلهی کمتر گرد کنیم، تا با بیت کمتری ذخیره بشه؛ مثلا ۸ بیت ۲۵۶ پله داره و ۴ بیت فقط ۱۶ پله. از ۱۶ بیت به ۸ بیت، حافظه نصف میشه و به ۴ بیت، یکچهارم. هر چی پله کمتر، خطای گرد کردن بیشتر. یه پژوهش ۲۰۲۲ نشون داد با ۸ بیت میشه مدلهای تا ۱۷۵ میلیارد پارامتر رو بی افت اجرا کرد، به شرطی که چند عدد خیلی بزرگ رو جدا با ۱۶ بیت نگه داریم. یه پژوهش دیگهی ۲۰۲۲ با یه روش دقیقتر، مدل ۱۷۵ میلیاردی رو تا ۴ بیت با افت ناچیز کوچیک کرد؛ در حالی که گرد کردن ساده کیفیت رو خیلی بیشتر پایین آورد.
یعنی چی
مثل گرد کردن قیمت: هر عدد مدل رو به نزدیکترین پله گرد میکنیم.
وقتی یه چیزی ۱۲٬۴۸۰ تومن میشه، معمولا میگیم ۱۲٬۵۰۰. کمی دقت از دست رفت، ولی عدد سادهتر شد و کسی هم ناراحت نشد. کوانتیزه کردن همین کار رو با میلیاردها عدد مدل میکنه. توی درس چقدر حافظه لازمه دیدیم که هر چی عدد با بیت کمتری نوشته بشه، مدل جای کمتری میگیره. سوال اینه که چقدر میشه گرد کرد، بی اینکه مدل خراب بشه.
پلهها
با چند بیت، چند تا عدد مختلف میشه نوشت؟ با ۸ بیت ۲۵۶ تا، با ۴ بیت ۱۶ تا، با ۲ بیت فقط ۴ تا. یعنی هر بیت کمتر، تعداد پلهها رو نصف میکنه.
مثلا فرض کنید وزنهای یه بخش از مدل بین منفی ۱ و ۱ باشن. با ۴ بیت، این فاصله به ۱۶ پله تقسیم میشه و هر وزن میپره روی نزدیکترین پله. وزن ۰٫۸۳ میشه ۰٫۸۶۷. حالا بهجای اینکه کل عدد رو نگه داریم، فقط شمارهی پلهش رو نگه میداریم، که با ۴ بیت جا میشه.
خطای گرد کردن
هر گرد کردن یه کم خطا داره. هر چی پله کمتر، فاصلهی بین پلهها بیشتر و خطا بیشتر.
برای همون پنج وزن ساختگی، بیشترین خطا با ۸ بیت ۰٫۰۰۳ بود، با ۴ بیت ۰٫۰۵۷، و با ۲ بیت ۰٫۲۱۷. یعنی ۸ بیت تقریبا بیخطاست، ۴ بیت یه کم خطا داره، و ۲ بیت خیلی زیاد. ولی خطای یه وزن، خطای کل مدل نیست؛ میلیاردها وزن با هم کار میکنن و گاهی خطاها هم رو خنثی میکنن، گاهی روی هم جمع میشن. برای همین باید دید پژوهشها روی مدل واقعی چی دیدن.
۸ بیت و چند عدد بزرگ
یه پژوهش ۲۰۲۲ نشون داد با ۸ بیت میشه حافظهی لازم برای اجرا رو نصف کرد، بی هیچ افت کیفیتی، حتی برای مدلهای ۱۷۵ میلیاردی. ولی یه دام پیدا کردن.
از حدود ۶٫۷ میلیارد پارامتر به بالا، توی همهی لایههای مدل چند تا عدد خیلی بزرگ پیدا میشه، تا ۲۰ برابر بزرگتر از بقیه، و فقط توی ۶ بعد جمع شدن. اگه همهی عددها رو با یه پلهبندی گرد کنیم، این غولها پلهها رو برای بقیه خیلی درشت میکنن، و روشهای سادهی ۸ بیتی دقیقا از همین اندازه خراب میشدن. این عددها کمان، حدود ۰٫۱ درصد، ولی خیلی مهم: صفر کردنشون سرگشتگی مدل رو ۶۰۰ تا ۱۰۰۰ درصد بدتر کرد. راهحل ساده بود: همین چند بعد بزرگ با ۱۶ بیت، و بیش از ۹۹٫۹ درصد بقیه با ۸ بیت.
۴ و ۳ بیت
یه پژوهش دیگهی ۲۰۲۲ رفت سراغ ۴ و ۳ بیت. روشش دقیقتر از گرد کردن ساده بود: وزنها رو یکییکی گرد میکرد و خطای هر گرد کردن رو با کمی جابهجا کردن وزنهای باقیمونده جبران میکرد. کل این کار برای یه مدل ۱۷۵ میلیاردی حدود ۴ ساعت کار یه کارت گرافیک طول کشید.
نتیجه رو با سرگشتگی سنجیدن. با ۴ بیت، مدل ۱۷۵ میلیاردی فقط ۰٫۰۳ سرگشتگی از دست داد؛ تقریبا هیچ. ولی گرد کردن ساده ۲٫۲ از دست داد و حتی از یه مدل ۱۰ برابر کوچیکتر با دقت کامل بدتر شد. با ۳ بیت، گرد کردن ساده کاملا فرو ریخت، ولی روش دقیق هنوز قابل قبول بود. دو خبر خوب هم داشت: مدلهای بزرگتر معمولا راحتتر کوانتیزه میشن، و برای اولین بار یه مدل ۱۷۵ میلیاردی روی یه کارت گرافیک تنها اجرا شد، و سریعتر هم شد.
یک درصد مهم
پژوهش ۸ بیتی چند تا عدد بزرگ رو جدا نگه میداشت. یه پژوهش ۲۰۲۳ یه قدم جلوتر رفت و پرسید: کدوم وزنها واقعا مهمترن؟
جوابش جالب بود: مهم بودن یه وزن رو از خود وزن نمیشه فهمید، از ورودیای که بهش میرسه میشه فهمید. ستونهایی از وزن که همیشه ورودی بزرگ میگیرن، اثر بیشتری روی جواب دارن، چون هر خطای کوچیکشون بزرگ میشه. پژوهشگرها دیدن اگه فقط حدود ۱ درصد از همین وزنهای مهم رو محافظت کنن، خطای کوانتیزه کردن خیلی کم میشه. ولی نگه داشتن چند وزن با دقت بیشتر روی سختافزار کند و دردسره؛ پس یه حقه زدن: پیش از گرد کردن، همون ستونهای مهم رو بزرگتر میکنن و ورودیشون رو به همون اندازه کوچیکتر، که نتیجه عوض نشه ولی خطای گرد کردن روشون کمتر بشه. با همین روش، یه مدل ۷۰ میلیاردی روی کارتهای گرافیک کوچیک و همراه هم قابل اجرا شد.
فاینتیون روی مدل ۴ بیتی
کوانتیزه کردن فقط برای اجرا نیست. یه پژوهش ۲۰۲۳ نشون داد میشه روی یه مدل ۴ بیتی فاینتیون هم کرد.
ایده اینه که مدل اصلی رو ۴ بیتی و دستنخورده نگه دارن، و فقط چند تکهی کوچیک ۱۶ بیتی کنارش آموزش بدن؛ همون روش LoRA. برای کم کردن حافظه سه تا کار دیگه هم کردن: یه نوع عدد ۴ بیتی تازه که پلههاش با پخش معمول وزنها جوره، کوانتیزه کردن خود عددهای کمکی کوانتیزه کردن، و جا به جا کردن حافظه موقع اوج مصرف. نتیجه این شد که یه مدل ۶۵ میلیاردی روی یه کارت گرافیک ۴۸ گیگابایتی فاینتیون شد، بی افت نسبت به فاینتیون ۱۶ بیتی. بهترین مدلشون، با ۲۴ ساعت فاینتیون روی یه کارت، روی یه آزمون گفتگو به ۹۹٫۳ درصد سطح ChatGPT اون موقع رسید.
سه عدد، از اول
تا اینجا همهجا مدل رو اول با دقت کامل ساختیم و بعد گرد کردیم. یه پژوهش ۲۰۲۴ برعکس فکر کرد: اگه مدل از اول با عددهای خیلی ساده آموزش ببینه چی؟
توی این مدل هر وزن فقط یکی از سه عدده: منفی یک، صفر یا یک. خوبیش اینه که ضرب کردن ورودی در وزن دیگه ضرب نیست؛ یا جمعش میکنی، یا کمش میکنی، یا ازش رد میشی؛ و ضرب گرونترین بخش کاره. پژوهشگرها دیدن چنین مدلی، اگه هماندازه و با همون مقدار دادهی یه مدل ۱۶ بیتی آموزش ببینه، تقریبا همون سرگشتگی و همون نمرهها رو میگیره، ولی سریعتره و حافظه و برق خیلی کمتری میخواد. خودشون نوشتن این کار «هنوز در جریانه»، و برای اینکه کاملا به صرفه بشه سختافزار مخصوص لازمه؛ ولی نشون میده کوچیک کردن عددها میتونه از خود آموزش شروع بشه، نه فقط بعدش.
کدوم رو انتخاب کنیم
از این دو پژوهش دو تا نتیجهی ساده درمیاد. اول، ۸ بیت با روش درست تقریبا مجانیه: نصف حافظه، بی افت. دوم، ۴ بیت با روش خوب کمافته، ولی «روش خوب» مهمه؛ با گرد کردن ساده ممکنه مدل بزرگتون از یه مدل کوچیکتر هم بدتر بشه. پس وقتی یه فایل کوانتیزهشده دانلود میکنید، فقط به تعداد بیت نگاه نکنید؛ ببینید با چه روشی ساخته شده، و اگه شد، روی کار خودتون امتحانش کنید. زیر ۴ بیت، حتی با روش خوب، افت بیشتر میشه.
چند نکته
- بیت کمتر، حافظهی کمتر. ۸ بیت نصف، ۴ بیت یکچهارم ۱۶ بیت.
- پله کمتر، خطای بیشتر. ولی با روش خوب، کم.
- روش مهمتر از عدد بیته. گرد کردن ساده میتونه خرابش کنه.
- روی کار خودتون امتحانش کنید.
درس بعد میگه چرا مدل کوچیکتر و کوانتیزهشده سریعتر هم جواب میده: سرعت اجرا: توکن در ثانیه.
جمعبندی. آنچه از این درس با خودتان میبرید.
- هر عدد، به نزدیکترین پله.
- ۸ بیت ۲۵۶ پله، ۴ بیت ۱۶ پله.
- ۸ بیت: نصف حافظه، بی افت.
- ۴ بیت: یکچهارم، با روش خوب کمافت.
- روش گرد کردن مهمه.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.