چیتشیت
مقایسهی فرمتهای کوانتیزهسازی
Quantization Formats Compared
انتخاب فرمت وزن بر اساس سختافزار، موتور و بار کاری. بیتها، حافظه، دستورات و تلههایی که به دقت لطمه میزنند.
فهرست مطالب
مقایسهی فرمتهای محیط عملیاتی در کنار هم
مقایسه| فاکتور | GGUF Q4_K_M | GPTQ | AWQ | FP8 |
|---|---|---|---|---|
| بیتها | 4-5 | 4-8 | 4 | 8 |
| نقطهی ایدهآل | پردازندهی CPU، دستگاههای لبه، لپتاپها | اجرای Multi-LoRA روی vLLM | محیط عملیاتی GPU در دیتاسنتر | دیتاسنترهای Hopper/Ada/Blackwell |
| موتورها | llama.cpp, Ollama | vLLM, TGI | vLLM (Marlin-AWQ), TGI | vLLM, TRT-LLM, SGLang |
| سرعت مدل 7B در vLLM | ~93 tok/s | ~712 tok/s | ~741 tok/s | عددی اعلام نشده |
| بهرهی کرنل | هیچ روی GPU | Marlin: 2.6x در برابر غیر Marlin | Marlin-AWQ: 10.9x در برابر حالت ساده | بومی روی هستهی تنسور Hopper |
| کیفیت | نزدیک به BF16 در 4-5 بیت | نیازمند پاس کالیبراسیون | بهترین Pass@1 در INT4 | تقریباً بدون اتلاف کیفیت |
چه زمانی استفاده کنیم؟
نکتهها- سرویسدهی روی CPU یا لبه: GGUF Q4_K_M.
- سرویسدهی روی GPU، چتهای معمول، بدون LoRA: فرمت AWQ.
- سرویسدهی روی GPU همراه با multi-LoRA: فرمت GPTQ با Marlin.
- بار کاری استدلالی: FP8.
- دیتاسنتر Blackwell با کیفیت اعتبارسنجیشده: NVFP4 + FP8 KV.
- فاینتیون روی یک GPU مصرفی: QLoRA با پایهی NF4.
- اگر مطمئن نیستید: ارزیابی 1000 نمونهای روی هر فرمت کاندید اجرا کنید.
چیدمان بیتها
مفهومها- FP32
- شامل 1 علامت، 8 توان، 23 مانتیس. استفاده برای انباشتگر.
- BF16
- شامل 1 علامت، 8 توان، 7 مانتیس. دامنهی یکسان با FP32.
- FP16
- شامل 1 علامت، 5 توان، 10 مانتیس. بیشینه مقدار ~65,504.
- FP8 E4M3
- شامل 1 علامت، 4 توان، 3 مانتیس. وزنها و اکتیویشنهای استنتاج.
- FP8 E5M2
- شامل 1 علامت، 5 توان، 2 مانتیس. گرادیانهای آموزش.
- INT8
- 256 مقدار از -128 تا 127. نیازمند یک ضریب مقیاس.
- INT4
- 16 سطح. نیازمند GPTQ یا AWQ برای حفظ کیفیت.
- NVFP4
- فرمت 4-bit FP با یک ضریب مقیاس به ازای هر بلوک. معماری Blackwell.
کوانتیزهسازی و واکوانتیزهسازی
کدpython
def quantize_symmetric(tensor, num_bits=8):
qmin = -(2 ** (num_bits - 1)) # -128 در 8 بیت
qmax = 2 ** (num_bits - 1) - 1 # 127 در 8 بیت
abs_max = np.max(np.abs(tensor)) # به ازای هر تنسور: یک مقیاس
if abs_max == 0:
return np.zeros_like(tensor, dtype=np.int32), 1.0
scale = abs_max / qmax
quantized = np.clip(np.round(tensor / scale), qmin, qmax).astype(np.int32)
return quantized, float(scale)
def dequantize_symmetric(quantized, scale):
return quantized.astype(np.float64) * scale # خطا حداکثر مقیاس / 2
zero_point = int(np.round(qmin - t_min / scale)) # آفست نامتقارن
سنجش مدل Llama 3 70B
مقایسه| فاکتور | FP16 | FP8 | GPTQ INT4 | AWQ INT4 |
|---|---|---|---|---|
| اندازه | 140GB | 70GB | 35GB | 35GB |
| پرپلکسیتی (WikiText-2) | 3.12 | 3.14 | 4.32 | 4.18 |
| MMLU | 79.5% | 79.3% | 77.8% | 78.1% |
| توکن بر ثانیه (A100) | 38 | 55 | 72 | 75 |
مقایسهی PTQ و QAT
مقایسه| فاکتور | PTQ | QAT |
|---|---|---|
| هزینه | دقیقهها تا چند ساعت | یک دور آموزش کامل |
| کیفیت در INT8 | عالی (کمتر از 0.1% افت) | عالی |
| کیفیت در INT4 | خوب با GPTQ/AWQ (1-3% افت) | بهتر (کمتر از 1% افت) |
| کیفیت در INT2 | ضعیف | قابل استفاده برای برخی وظایف |
| دادههای کالیبراسیون | 128-1024 نمونه | مجموعه داده کامل آموزش |
حساسیت، از کم به زیاد
گامبهگام- وزنهاگاوسی نزدیک به صفر. INT4 با GPTQ یا AWQ به خوبی کار میکند.
- اکتیویشنهادامنهی گستردهتر با مقادیر پرت. از INT8 با احتیاط استفاده کنید.
- کش کلید-مقدارخطاها در طول توکنهای بعدی جمع میشوند. از FP8 یا INT8 استفاده کنید.
- لاجیتهای اتنشنسافتمکس خطا را تقویت میکند. آنها را روی FP16 نگه دارید.
بودجهی HBM: مدل 70B با AWQ
معماریکوانتیزهسازی و سرویسدهی
کار و کد| وظیفه | کد |
|---|---|
| تبدیل به GGUF | python llama.cpp/convert_hf_to_gguf.py <model> --outtype f16 --outfile <f16>.gguf |
| ساخت Q4_K_M | llama.cpp/build/bin/llama-quantize <f16>.gguf <out>.gguf Q4_K_M |
| سرویسدهی GGUF | llama.cpp/build/bin/llama-server -m <out>.gguf -c 4096 -ngl 99 |
| پیکربندی GPTQ | GPTQConfig(bits=4, group_size=128) |
| کالیبراسیون GPTQ | model.quantize(calibration_texts[:128], batch_size=1) |
| مرحلهی دستورالعمل AWQ | AWQModifier(duo_scaling="both") |
| اسکیمای AWQ | QuantizationModifier(ignore=["lm_head"], scheme="W4A16_ASYM", targets=["Linear"]) |
| سرویسدهی AWQ یا GPTQ | vllm serve <model> --max-model-len 8192 |
پایهی QLoRA در 4-bit
کدpython
bnb_config = BitsAndBytesConfig(
load_in_4bit=True, # پایهی فریز شده در 4-bit
bnb_4bit_quant_type="nf4", # سطوح در چندکهای نرمال
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True, # ثابتهای مقیاس به fp8
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-8B",
quantization_config=bnb_config,
device_map="auto",
)
model = get_peft_model(model, lora_config) # آموزش تطبیقدهندهها در fp16
عیبیابی
عیبیابیافت چند امتیازی HumanEval Pass@1
- علت
- کالیبراسیون روی متن عمومی وب انجام شده
- راهحل
- کالیبراسیون با دادههای دروندامنهای
اتمام حافظهی HBM پس از مدل 4-bit
- علت
- کش کلید-مقدار در حالت FP16/FP8 مانده است
- راهحل
- بودجهبندی وزنها، کش کلید-مقدار و اکتیویشنها
افت ~3-5 امتیازی بنچمارک MATH
- علت
- استفاده از AWQ INT4 روی مدل استدلالی
- راهحل
- عرضه با FP8 یا BF16
سرعت ~93 tok/s روی مدل 7B در vLLM
- علت
- موتور اجرایی GGUF اشتباه است
- راهحل
- سرویسدهی GGUF با llama.cpp
فروپاشی امتیازات اتنشن
- علت
- کش کلید-مقدار در FP4
- راهحل
- نگهداشتن کش کلید-مقدار در FP8
فرمت INT4 ساده مدل را خراب میکند
- علت
- انباشته شدن خطاهای گرد کردن
- راهحل
- استفاده از GPTQ یا AWQ همراه با کالیبراسیون
اختلاف پرپلکسیتی بیشتر از 2.0
- علت
- مشکلی رخ داده است
- راهحل
- بررسی متد و ضرایب مقیاس
عدم وجود LoRA روی NVFP4
- علت
- هنوز LoRA پشتیبانی نمیشود (اوایل 2026)
- راهحل
- استفاده از GPTQ-Int4 در vLLM
پرسش و پاسخ
پرسش و پاسخ- اختلاف پرپلکسیتی مناسب چقدر است؟
- زیر 0.5 عالی است.
- چند نمونه کالیبراسیون برای GPTQ نیاز است؟
- 128 نمونه معمول است.
- پیکربندی معمول Blackwell چیست؟
- وزنها و اکتیویشنهای NVFP4، کش کلید-مقدار FP8، انباشتگر اتنشن FP32.
- AWQ یا GPTQ؟
- ردپای 4-bit یکسان است. بر اساس پشتیبانی LoRA انتخاب کنید.
- فرمت GGUF Q4_K_M برای 70B؟
- حدود 40GB. سرعت 10 تا 15 توکن در ثانیه روی M3 Max با 64 گیگابایت حافظه.