المستوى: محترف
Llama 3.3 70B بـ FP16 محتاج 140GB ذاكرة. ده يعني 4 GPUs من نوع A100-40GB أو واحدة H100-80GB. لو كمّمت النموذج بـ AWQ INT4، الرقم بينزل 35GB ويتشغّل على RTX 3090 واحدة سعرها 700 دولار. الفقد في MMLU 1.8% بس، والـ throughput بيزيد 2.4x. المقال ده بيشرح إزاي بالظبط، وفين التكميم بيكسر النموذج بدل ما يحسّنه.
التكميم: تخفيض دقة الأرقام بدل حذف الأوزان
المشكلة باختصار
كل وزن في النموذج بيتخزّن في FP16، يعني 2 بايت للوزن. 70 مليار وزن × 2 = 140GB. المساحة دي مش بس بتاكل GPU غالي، هي اللي بتحدد batch size اللي تقدر تخدم بيه users بشكل متوازي. كل ما زادت ذاكرة الأوزان، قلّت ذاكرة KV cache المتاحة، وقل عدد الطلبات المتزامنة على نفس الـ GPU.
المفهوم الأساسي بمثال JPEG للمبتدئ
تخيّل صورة كاميرا RAW حجمها 30MB. لما تحفظها JPEG quality 85، الحجم ينزل 2MB. عينك مش بتفرّق عملياً. التكميم نفس الفكرة بالظبط: بدل ما الوزن يتخزّن كرقم عشري دقيق (3.14159265)، بنخزّنه كرقم صحيح في نطاق ضيق (3 أو 4)، مع scale factor لاسترجاع القيمة التقريبية.
التعريف العلمي: التكميم mapping من high-precision floating-point space (FP16 = 65,536 قيمة ممكنة) إلى low-precision integer space (INT4 = 16 قيمة بس). الـ mapping بيستخدم zero-point و scale لاستعادة القيمة الأصلية تقريبياً عبر المعادلة:
x_fp ≈ scale × (x_int - zero_point)الفرق عن JPEG إن الـ loss هنا مش في pixels، هو في activations اللي بتمرّ في matrix multiplications، وده اللي بيحدد لو النموذج هيفضل دقيق ولا لأ.
الفرق بين GPTQ و AWQ و bitsandbytes
التلاتة مش بدائل، كل واحد ليه استخدام مختلف:
- GPTQ (Frantar et al., ICLR 2023): تكميم post-training بحلّ مشكلة layer-wise reconstruction باستخدام approximate Hessian. بيحتاج dataset صغير للمعايرة (128 مثال كافي). الأقدم والأكتر استقراراً.
- AWQ (Lin et al., MLSys 2024): بيحدّد 1% من الأوزان "المهمة" ويحميهم من التكميم، وباقي 99% بيتكمّموا. بيدّي دقة أعلى من GPTQ في معظم الـ benchmarks، خصوصاً في instruction-tuned models زي Llama 3.3.
- bitsandbytes (NF4): تكميم on-the-fly بدون معايرة. أسرع للتجربة وأبسط في الكود، أقل دقة من AWQ بـ 0.5–1.5 نقطة على MMLU.
كود تنفيذي: تكميم Llama 3.3 70B بـ AWQ
الخطوة الأولى تكميم النموذج (مرة واحدة، وبتاخد ساعتين على H100):