یک وزن پرت (Outlier) در یک ماتریس ۴۵ میلیون پارامتری میتواند تمام وزنهای دیگر یک مدل ۴ بیتی را عملاً صفر کند، اگر مقیاسبندی بیش از حد درشت باشد. این آسیبپذیری ساختاری دلیل آن است که کاربران GPTQ و AWQ بهشدت روی اندازهٔ گروه (Group Size) حساس هستند؛ مکانیزمی خاص که با ایزوله کردن مقادیر حدی، از فاجعههای کوانتش جلوگیری میکند. در این راستا، نقش اندازهٔ گروه در مدیریت توازن حافظه و دقت کلیدی است تا از تخریب مدل جلوگیری شود.
برای درک این موضوع، ابتدا باید بدانید کوانتش (Quantization) — شبیه تبدیل یک عکس با کیفیت بسیار بالا به یک فایل JPEG کمحجم است که در آن برخی جزئیات برای کاهش حجم فدا میشوند — چگونه کار میکند. چالش اصلی این است که تعیین کنیم چند عدد باید یک مقیاس مشترک داشته باشند. در یک سامانهٔ کوانتیده، یک عدد واقعی با استفاده از فرمول «مقدار واقعی ≈ مقیاس × (کد − نقطه صفر)» بازیابی میشود. دانه-بندی یا Granularity در واقع اندازهٔ مجموعهای از مقادیر است که برای استخراج آن مقیاس (Scale) استفاده میشوند.
همانطور که در تحلیلهای قبلی ما دربارهی بهینهسازی حافظه در مدلهای زبانی اشاره کردیم، مدیریت این مقیاسها تعیینکنندهٔ نهایی توازن بین حافظه و کیفیت است.
سه سطح رزولوشن در مقیاسبندی
سه روش اصلی برای اعمال این مقیاسها روی ماتریس وزنها وجود دارد که هر کدام اثر متفاوتی بر دقت و حافظه دارند:
- در سطح تنسور (Per-tensor): یک مقیاس واحد برای کل ماتریس. در این حالت، تمام ۴۵ میلیون وزن در یک لایه ۴۰۹۶×۱۱۰۰۸ با یک عدد سنجیده میشوند که از بزرگترین مقدار مطلق در کل لایه به دست آمده است.
- در سطح کانال (Per-channel): یک مقیاس برای هر کانال خروجی (که معمولاً همان هر سطر است). در ماتریسی با ۴۰۹۶ کانال خروجی، ۴۰۹۶ مقیاس ذخیره میشود؛ این یعنی وزنهای هر نورون با محدودهٔ خاص خودشان مقیاسبندی میشوند.
- در سطح گروه (Per-group): یک مقیاس برای هر دسته متوالی از وزنها در امتداد بُعد ورودی. برای مثال، با اندازهٔ گروه (g) برابر با ۱۲۸ و ۱۱۰۰۸ ویژگی ورودی، هر سطر بهجای یک مقیاس، ۸۶ مقیاس مجزا دارد.
در مورد فعالسازها (Activations)، محورها نامهای متفاوتی دارند اما منطق یکسان است: «در سطح توکن» (Per-token) به معنای یک مقیاس برای هر سطر از ماتریس فعالسازها (یک مقیاس برای هر توکن در بچ) است، که در واقع معادل فعالساز-محورِ مقیاسبندی در سطح کانال است.
مالیات متاداده
به نقل از تحلیل فنی منتشر شده در ۱۵ اوت ۲۰۲۶ در وبسایت dev.to، هزینهٔ حافظه در این رزولوشنها بهشدت متفاوت است. برای درک بهتر، یک ماتریس [۴۰۹۶, ۱۱۰۰۸] با ۴۵.۱ میلیون وزن را در نظر بگیرید. اگر مدل ۴ بیتی باشد و برای هر گروه یک مقیاس ۱۶ بیتی و نقطه صفر ۴ بیتی (مجموعاً ۲۰ بیت) ذخیره کنیم، حجم دادههای اصلی (Payload) ۲۲.۵۵ مگابایت باقی میماند، اما متادادهها به این شکل تغییر میکنند:
- سطح تنسور: ۱ مقیاس = ۲۰ بیت سربار. به ازای هر وزن، این مقدار تقریباً ۰.۰۰۰۰۰۰۴ بیت است.
- سطح کانال (سطر): ۴۰۹۶ مقیاس = ۸۱,۹۲۰ بیت سربار. به ازای هر وزن، این مقدار ۲۰/۱۱۰۰۸ یا تقریباً ۰.۰۰۱۸ بیت است.
- سطح گروه (g=۱۲۸): ۴۰۹۶ * ۸۶ = ۳۵۲,۲۵۶ مقیاس = ۷.۰۵ میلیون بیت سربار. به ازای هر وزن، این مقدار ۲۰/۱۲۸ یا ۰.۱۵۶ بیت است.
- سطح گروه (g=۳۲): ۴۰۹۶ * ۳۴۴ = ۱.۴۱ میلیون مقیاس = ۲۸.۲ میلیون بیت سربار. به ازای هر وزن، این مقدار ۲۰/۳۲ یا ۰.۶۲۵ بیت است.
این محاسبات ریاضی توضیح میدهد چرا کوانتش در سطح کانال جهانی و پذیرفته شده است؛ چون هزینهاش کمتر از یکبیستم درصدِ حجم کل دادههاست. تنها جایی که نیاز به تنظیم دقیق و فعال دارد، اندازهٔ گروه است، زیرا اولین سطحی است که هزینهٔ متاداده در آن به شکلی قابل اندازهگیری و محسوس میشود.
فاجعهٔ دقت
اثر این موضوع روی دقت، بسیار دراماتیکتر از هزینهٔ حافظه است. تصور کنید در آن ماتریس ۴۵ میلیون تایی، یک وزن مقدار ۰.۹ داشته باشد در حالی که وزنهای معمولی ۰.۰۲ هستند.
در یک شبکه ۴ بیتی در سطح تنسور، محدوده [۰.۹- , ۰.۹] به ۱۶ پله تقسیم میشود. این یعنی اندازه هر پله ۰.۱۲ است؛ یعنی ۶ برابر بزرگتر از یک وزن معمولی. در نتیجه، اساساً تقریباً تمام وزنهای ماتریس هنگام گرد کردن به صفر تبدیل میشوند و اطلاعات مدل نابود میشود. این نوع فروپاشی دقت میتواند با عدم تطابق دادههای کالیبراسیون تشدید شود و منجر به تخریب کامل فرمت خروجی گردد.
مقیاسبندی در سطح کانال این فاجعه را به یک سطر خروجی واحد محدود میکند. مقیاسبندی در سطح گروه با g=۱۲۸، آن را به تنها ۱۲۸ وزن از ۴۵ میلیون محدود میکند. در واقع، پرداخت هزینهٔ متاداده، باعث میشود کنترل خطا سه مرتبه (۱۰۰۰ برابر) دقیقتر شود و به همین دلیل هیچکس وزنهای زیر ۸ بیت را در سطح تنسور منتشر نمیکند.
تفاوت وزنها و فعالسازها
وزنها میتوانند دانه-بندی ظریفی داشته باشند چون ایستا (Static) هستند. مقیاس یک گروه وزن یکبار بهصورت آفلاین محاسبه و ذخیره میشود و در زمان اجرا فقط هزینهٔ خواندن از حافظه دارد. از آنجا که هستههای ۴ بیتیِ وزن-محور (Weight-only) در حال حاضر محدود به پهنایباند حافظه (Memory-bound) هستند، افزودن ۰.۱۵۶ بیت به هر وزن، جابهجایی دادهها را تنها حدود ۳.۸٪ (۰.۱۵۶/۴.۱۵۶) افزایش میدهد.
اما فعالسازها نمیتوانند از مقیاسبندی در سطح گروه استفاده کنند. در یک ضرب ماتریسی کوانتیده، تجمیع (Accumulation) روی بُعد کاهش (Reduction dimension) انجام میشود. اگر مقیاس در آن بُعد تغییر کند، سامانه مجبور است هر حاصلضرب جزئی را بهصورت جداگانه در داخلیترین حلقه مقیاسبندی کند. این کار کارایی هستههای تنسور صحیح (Integer Tensor Cores) را کاملاً از بین میبرد.
به همین دلیل، فعالسازها معمولاً به مقیاسبندی در سطح تنسور یا توکن محدود میشوند. مقیاسهایی که در امتداد ابعاد خروجی تغییر میکنند (per-token برای فعالسازها و per-channel برای وزنها) را میتوان بیرون کشید و یکبار روی تجمیعکننده نهایی اعمال کرد، بدون اینکه هزینهٔ خاصی داشته باشد. این دلیل آن است که تکنیکهایی مثل SmoothQuant مجبورند مقادیر پرت را جابهجا کنند بهجای اینکه آنها را ایزوله نمایند.
نقطهٔ میانی: KV Cache
حافظه KV Cache بین وزنها و فعالسازها قرار دارد. کلیدها و مقادیر ذخیرهشده در واقع فعالساز هستند، بنابراین مقیاس آنها را نمیتوان بهصورت آفلاین دانست. اما برخلاف فعالسازهای داخل یک ضرب ماتریسی، اینها ذخیره میشوند و بلافاصله مصرف نمیشوند.
این یعنی میتوان یک مقیاس را به هر سر (Head)، هر توکن یا هر بلوک از حافظه اختصاص داد بدون اینکه وارد حلقهٔ تجمیع شود. به همین دلیل است که طرحهای کوانتش حافظه بهطور معمول از دانه-بندیهایی استفاده میکنند که برای فعالسازهای لایههای خطی غیرممکن است و یک حافظه ۴ یا ۸ بیتی اغلب کیفیت بیشتری نسبت به فعالسازهای مشابه حفظ میکند.
رمزگشایی فایلهای پیکربندی
در فایلهای تنظیمات مدل، دانه-بندی اغلب پشت اصطلاحات خاصی پنهان شده است:
group_size=128: وزنهای در سطح گروه.group_size=-1: در GPTQ یا AWQ به معنای مقیاسبندی در سطح کانال (یک مقیاس برای هر سطر خروجی) است.W8A8با «dynamic per-token»: فعالسازهای در سطح توکن که در زمان اجرا محاسبه میشوند و معمولاً با وزنهای در سطح تنسور یا کانال جفت میشوند.Block-wise: نام دیگر مقیاسبندی در سطح گروه در bitsandbytes و طرحهای FP8.- NF4: بهطور معمول از بلوکهای ۶۴ استفاده میکند.
FineGrainedFP8Config: در کتابخانه Transformers، این تنظیمات یکweight_block_sizeپیشفرض (۱۲۸, ۱۲۸) را مستند میکند که نشاندهنده یک بلوک دوبعدی است، نه یک ردیف یکبعدی.- K-quants (llama.cpp): از سلسلهمراتبی از «ابر-بلوکها» (Super-blocks) استفاده میکند، جایی که یک بلوک مقیاس کوانتیده خودش را دارد و یک ابر-بلوک مقیاسی روی آنها دارد. این ساختار در نامگذاریهای GGUF با حروف K، M و S رمزگشایی میشود.
اگر دو مدل با بیت-ویث یکسان اما اندازه فایل متفاوت دیدید، دلیل آن تقریباً همیشه دانه-بندی مقیاسهاست. این تغییر در دیدگاه، کوانتش را از یک «فولکلور» یا حدس و گمان به یک علم محاسباتی تبدیل میکند. با محاسبه دقیق هزینهٔ بیت به ازای هر وزن، توسعهدهندگان میتوانند بهجای حدس زدن بین گروههای ۳۲، ۶۴ یا ۱۲۸، مدل را دقیقاً برای پهنایباند حافظه سختافزار خود بهینه کنند.
گام بعدی شما
- هنگام دانلود مدلهای کوانتیده از HuggingFace، مقدار
group_sizeرا در فایلconfig.jsonچک کنید تا توازن حافظه و دقت را بسنجید. - اگر با افت شدید دقت در مدلهای ۴ بیتی مواجه شدید، از نسخههایی با
group_size=32بهجای ۱۲۸ استفاده کنید. - برای کاهش مصرف VRAM بدون افت کیفیت شدید، ابتدا کوانتش KV Cache را روی ۸ بیت تنظیم کنید.
اما داستان سختافزاری این تحول حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای Blackwell مراجعه کنید.




گفتگو