Quantization للمحترف: شغّل Llama 70B على 24GB VRAM بدل 140GB
المستوى: محترف — بيفترض إنك متعامل مع PyTorch و Hugging Face Transformers قبل كده، وعارف الفرق بين training و inference، ومعاك خلفية أساسية عن floating point.
لو حاولت تشغّل Llama 3.3 70B على RTX 4090 وطلعتلك CUDA out of memory، المشكلة مش الكرت. الموديل بـ FP16 محتاج 140GB VRAM والكرت معاه 24GB بس. Quantization بينزّل الرقم ده لـ 22GB ويخلّي الموديل يشتغل على نفس الجهاز، بفقد جودة أقل من 1% في معظم الـ benchmarks.
المشكلة باختصار
كل parameter في الموديل بياخد مكان في الذاكرة. Llama 70B فيه 70 مليار parameter. لو كل واحد متخزّن بـ FP16 يعني 2 بايت، الإجمالي = 140GB قبل ما تحسب الـ KV cache و الـ activations. ده بيخلّي تشغيله محصور على H100 بـ 80GB (اتنين على الأقل) أو A100 بـ 80GB. سعر الساعة في AWS p5.48xlarge بيتعدى 98$ /ساعة. لو نزّلت كل parameter لـ 4 بت بدل 16، الحجم بقى ربع، والكرت اللي بـ 1500$ بقى يكفي.
المثال البسيط: ليه JPEG بيشتغل أصلاً
قبل ما ندخل في التفاصيل التقنية، خد المثال ده. لو عندك صورة RAW من كاميرا بتاخد 48MB، وضغطتها لـ JPEG بجودة 90% بقت 4MB. الفرق بين الصورتين عين الإنسان مش ملاحظاه فعلياً، لكن الحجم اتقسم على 12. الفكرة في Quantization هي نفسها: الموديل فيه أرقام كتير قريبة من بعضها (الأوزان غالباً بين -1 و +1)، فبدل ما نخزّنها بدقة 16 بت، نخزّنها بدقة 4 بت، ونحتفظ بمعامل scale يرجّعها لقيمتها التقريبية وقت الاستخدام.
التعريف العلمي الدقيق
Quantization هي عملية تحويل قيمة من تمثيل floating-point عالي الدقة (FP32 أو FP16) إلى تمثيل integer منخفض الدقة (INT8 أو INT4)، مع الاحتفاظ بمعامل تحجيم (scale) ونقطة صفر (zero-point) لإعادة بناء القيمة الأصلية بشكل تقريبي. المعادلة الأساسية:
q = round(x / scale) + zero_point
x_dequantized = (q - zero_point) * scale
الفقد (quantization error) = x - x_dequantized، وكل ما قلّت عدد البتات، الفقد بيزيد. الذكاء كله في اختيار scale و zero-point بحيث الفقد يبقى أقل ما يمكن على توزيع الأوزان الفعلي للموديل.
الأنواع الأربعة الشائعة بالأرقام
على Llama 3.3 70B، الأرقام المنشورة من Hugging Face ومن ورقة GPTQ:
- FP16 (16-bit): الـ baseline. حجم 140GB. MMLU score حوالي 81.6%.
- INT8 (8-bit, bitsandbytes): حجم 70GB. MMLU 81.4%. سرعة inference أبطأ من FP16 بحوالي 30% بسبب dequantization.
- INT4 (GPTQ 4-bit): حجم 35GB تقريباً. MMLU 80.7%. تحسّن في latency لـ memory-bound workloads.
- : حجم 35GB. MMLU 80.9%. أسرع من GPTQ في الـ throughput على نفس الكرت.