اگر قصد دارید مدلهای زبانی را بهصورت محلی اجرا کنید، باید بدانید که افزایش اندازه مدل همیشه به معنای بهبود عملکرد نیست؛ گاهی مقیاس بزرگتر، مدل را در برابر فشردهسازی شکننده میکند. در نقطه ۶.۷ میلیارد پارامتر، یک تغییر ساختاری رخ میدهد که روشهای متداول کوانتش را به بنبست میکشاند. در این مقیاس، مدلهای زبانی بزرگ (LLM) مجموعهای کوچک از ابعاد نهان را توسعه میدهند که بزرگی آنها بسیار فراتر از سایر ابعاد است و بهطور مؤثر کوانتش سادهی ۸ بیتی را مختل میکند.
این پدیده یک خطای تصادفی در آموزش یا نویز نیست، بلکه یک ظهور ساختاری است که مدلهای کوچک را برای فشردهسازی ایدهآل و مدلهای بزرگتر و توانمندتر را آسیبپذیر میکند. همانطور که در تحلیل قبلی ما دربارهی مدیریت خروجیهای ناپایدار هوش مصنوعی، مانند قرنطینه کردن تستهای متزلزل، اشاره کردیم، درک این ناهنجاریهای ساختاری داخلی برای هر کسی که مدلهای محلی را مستقر میکند، ضروری است.
مدل زبانی بزرگ (LLM) — مثل کتابخانهداری که میلیاردها صفحه را خوانده و حالا با همان لحن کتابها جواب میدهد — در مقیاسهای بالا رفتاری غیرمنتظره نشان میدهد. برای درک این موضوع، تصور کنید یک دسته متن را از یک ترنسفورمر (Transformer) عبور میدهید و وضعیتهای نهان (hidden state) ورودی به یک لایه خطی را بررسی میکنید. این وضعیت یک ماتریس است که در آن هر ردیف مربوط به یک توکن و هر ستون مربوط به یک بُعد نهان است. در مدلهای کوچک و سالم، اکثر ورودیها در فاصله چند واحدی از صفر قرار دارند. اما در مدلهای بزرگ، تعداد کمی از ستونها بهطور شدید منحرف میشوند و مقادیری دارند که یک مرتبه بزرگی (ده برابر) یا بیشتر از بقیه است.
این ویژگیهای پرت (Outlier Features) صرفاً کنجکاویهای آماری نیستند، بلکه ساختاری هستند. آنها سیستماتیکاند، به این معنی که فارغ از اینکه چه دستهای از دادهها وارد شود، همان ابعاد خاص به عنوان پرت ظاهر میشوند. آنها پایدار هستند و بهجای اینکه به یک مرحله خاص محدود شوند، در تمام لایههای مدل دیده میشوند. در نهایت، آنها «ظهوری» (Emergent) هستند؛ یعنی با مقیاس شدن مدل بهطور نرم رشد نمیکنند، بلکه زیر یک آستانه خاص غایب هستند و ناگهان بالای آن آستانه ظاهر میشوند.
این وضعیت شبیه ترازویی است که برای وزن کردن اشیای ۰ تا ۱۰ گرمی با دقت بالا طراحی شده است. اگر ناگهان یک وزنه ۶۰ گرمی روی آن بگذارید، ترازو باید بازه خود را گسترش دهد تا این شیء سنگین را بپذیرد؛ در این حالت، ترازو توانایی تشخیص تفاوت بین ۱ و ۲ گرم را از دست میدهد. این دقیقاً همان اتفاقی است که در کوانتش (Quantization) — شبیه تبدیل یک عکس با کیفیت بالا به فرمت JPEG برای کم کردن حجم — در حالت per-tensor int8 رخ میدهد.
به نقل از مقالهای که در سال ۲۰۲۲ توسط Dettmers et al. در کنفرانس NeurIPS منتشر شد، این ویژگیهای پرت بهطور سیستماتیک در آستانه ۶.۷ میلیارد پارامتر ظاهر میشوند. محققان دریافتند که کوانتش کلاسیک در مقیاس بالا برای مدلهای ترنسفورمر بالای ۶ میلیارد پارامتر شکست میخورد. اگرچه عدد ۶.۷ میلیارد یک ویژگی مربوط به خانوادههای OPT و BLOOM بود که در مطالعه استفاده شده بودند و نه یک قانون جهانی، اما این پدیده در معماریهای متأخر نیز مستحکم باقی مانده است. این چالشهای ساختاری در معماریهای فعلی باعث شده تا برخی استارتاپها با بازطراحی بنیادین ترنسفورمر به دنبال کاهش هزینهها و بهینهسازی مدلها باشند.
جزئیات فنی این تخریب به شرح زیر است:
- آستانه مقدار: هر مقداری برابر یا بزرگتر از ۶.۰ یک «پرت» محسوب میشود. این آستانه تصادفی نیست؛ مقاله گزارش میدهد که تخریب perplexity زمانی متوقف میشود که هر ویژگی با بزرگی ۶ یا بیشتر به عنوان پرت در نظر گرفته شود. این همان آستانهای است که امروزه در
BitsAndBytesConfigکتابخانه Hugging Face تحت عنوانllm_int8_threshold(با مقدار پیشفرض ۶.۰) استفاده میشود. - دامنه اثر: این پرتها تنها حدود ۰.۱٪ از کل ویژگیهای ورودی را تشکیل میدهند، اما در ۷۵٪ از تمام ابعاد توالی در تمامی لایهها فعال هستند.
- سقوط عملکرد: حذف یا صفر کردن این ویژگیها باعث میشود جرم احتمال سافتمکس (softmax probability mass) در لایه توجه (top-1 attention) بیش از ۲۰٪ افت کند.
- ضربه به دقت: نادیده گرفتن این ویژگیها باعث افزایش ۶۰۰ تا ۱۰۰۰ درصدی perplexity (معیاری برای سنجش میزان پیشبینیناپذیری مدل) در دادههای اعتبارسنجی میشود.
در واقع، حذف یک دهم درصد از ویژگیها، مدل را تقریباً یک مرتبه بزرگی تخریب میکند. این ابعاد اتفاقی نیستند؛ آنها سهم نامتناسبی از محاسبات مدل را بر عهده دارند.
وقتی یک مدل از مقیاسبندی per-tensor استفاده میکند، یک مقدار پرت که به عدد ۶۰ میرسد — بازهای که در مستندات خود Hugging Face توصیف شده — شبکه کوانتش را مجبور به گسترش میکند. حالت int8 دارای ۲۵۶ سطح است. گام شبکه به صورت 2 * 60 / 255 محاسبه میشود که منجر به گامی برابر با ۰.۴۷ میگردد.
اگر فعالسازهای معمولی در بازهای حدود [۳.۵- و ۳.۵+] قرار داشته باشند، این بازه ۷ واحد عرض دارد. تقسیم ۷.۰ بر گام شبکه ۰.۴۷، تنها حدود ۱۵ سطح در دسترس باقی میگذارد. از آنجایی که log2(15) تقریباً ۳.۹ است، شما در واقع دقت ۸ بیتی میخواهید اما برای بخش اصلی سیگنال، کیفیتی در حد ۴ بیت دریافت میکنید.
اکنون هر بُعدی که سیگنال اصلی را حمل میکند، خشنتر از یک فرمت وزنی ۴ بیتی کوانتش شده است. برخلاف وزنها، فعالسازها مقیاس per-group ندارند تا آنها را نجات دهد، زیرا مقیاسی که در طول بُعد کاهش (reduction dimension) تغییر میکند، نمیتواند از مجموع (accumulation) خارج شود. همچنین، برش دادن (clipping) مقدار پرت در ۶.۰ برای محافظت از شبکه، بهطور مشابه مخرب است، زیرا ویژگیای را نابود میکند که ۲۰٪ از جرم توجه را حمل میکند.
مهندسان برای جلوگیری از این فروپاشی از سه استراتژی اصلی استفاده میکنند:
اول، جداسازی در LLM.int8()؛ این تجزیه با دقت مختلط، ضرب ماتریسی را تقسیم میکند: ابعاد بالای آستانه از یک ضرب ۱۶ بیتی عبور میکنند، در حالی که ۹۹.۹٪ مقادیر دیگر در ۸ بیت باقی میمانند. سپس نتایج جمع میشوند. این روش صحت محاسبات را تضمین میکند اما به دلیل ایجاد یک شاخه (branch)، یک gather و دو ضرب ماتریسی (به جای یک ضرب)، سربار محاسباتی اضافه میکند.
دوم، انتقال در SmoothQuant؛ این متد از یک هویت جبری برای کوچک کردن مقیاس کانالهای پرت و بزرگ کردن ردیفهای وزنی متناظر استفاده میکند، بهطوری که حاصلضرب بدون تغییر باقی بماند. این کار دشواری را به بخش وزنها منتقل میکند که میتوانند مقیاسهای per-channel داشته باشند. این روش از سربار زمان اجرا جلوگیری میکند اما وابسته به معماری است و نیاز به تنظیمات هر مدل دارد.
سوم، اجتناب؛ بسیاری از فرمتهای محلی محبوب صرفاً از کوانتش کامل فعالسازها خودداری میکنند و آنها را در FP16 نگه میدارند. این امنترین مسیر است زیرا FP16 از توانها (exponents) استفاده میکند و اجازه میدهد مقداری مانند ۶۰ و ۰.۰۰۱ بدون اشتراک در یک مقیاس خطی محدود، در کنار هم coexist کنند.
این موضوع توضیح میدهد چرا کوانتشِ فقط-وزنها مانند NF4 بهخوبی کار میکند. توزیع وزنها در هر کانال تقریباً نرمال است و فاقد این جهشهای شدید پرت است. با این حال، مشکل همچنان به عنوان یک اثر مرتبه دوم باقی میماند.
تکنیکهایی مثل AWQ و GPTQ این مسئله را با شناسایی کانالهای «حیاتی» (salient) مدیریت میکنند. آنها تشخیص میدهند که اگرچه یک وزن ممکن است معمولی به نظر برسد، اما ضرب آن در یک فعالساز پرت، خطای خروجی عظیمی ایجاد میکند. AWQ این کانالها را از آمار فعالسازها انتخاب میکند و GPTQ جبران خطای خود را بر اساس یک ماتریس Hessian ساخته شده از فعالسازها وزندهی میکند. هر دو روش، ویژگیهای پرت را در سمت وزنیِ ضرب مدیریت میکنند، جایی که مقیاسبندی per-group در دسترس است.
برای کاربر نهایی، این یعنی جادوی مدلهای ۴ بیتی یا ۸ بیتی محلی، صرفاً کوچک کردن اعداد نیست، بلکه نبردی پیچیده با چند بُعد افراطی است که بخش نامتناسبی از هوش مدل را حمل میکنند.
گام بعدی شما
- اگر از مدلهای بالای ۷ میلیارد پارامتر استفاده میکنید، از متدهای کوانتش وزن-محور (Weight-only) مانند NF4 یا AWQ استفاده کنید تا از تخریب فعالسازها جلوگیری شود.
- در تنظیمات
BitsAndBytesمقدارllm_int8_thresholdرا بر اساس نوع دادههای خود بررسی کنید تا تعادل بین دقت و فشردهسازی برقرار شود. - برای استقرار در محیطهای با حافظه محدود، مدلهای کوچکتر (زیر ۶ میلیارد پارامتر) را تست کنید تا ببینید آیا افت کیفیت ناشی از کوانتش در آنها کمتر است یا خیر.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو