أساسيات استدلال نماذج اللغة الكبيرة

KV Cache: أساس تحسين الذاكرة

4 دقيقة للقراءة

ذاكرة التخزين المؤقت للمفتاح والقيمة (KV cache) هي أهم هيكل بيانات في استدلال LLM. فهمها يفتح جميع تقنيات التحسين المتقدمة.

لماذا يوجد KV Cache

بدون KV caching، كل توليد رمز سيعيد حساب الانتباه للتسلسل بأكمله:

بدون KV Cache (غير فعال):
─────────────────────────────
الرمز 1: حساب الانتباه لـ [1]           → حساب واحد
الرمز 2: حساب الانتباه لـ [1,2]         → حسابان
الرمز 3: حساب الانتباه لـ [1,2,3]       → 3 حسابات
الرمز 4: حساب الانتباه لـ [1,2,3,4]     → 4 حسابات
...
الرمز N: حساب الانتباه لـ [1,2,...,N]   → N حساب

المجموع: 1+2+3+...+N = O(N²) حساب

مع KV Cache (فعال):
─────────────────────────
الرمز 1: حساب K,V لـ [1]، تخزين في الذاكرة → حساب واحد
الرمز 2: استخدام K,V المخزنة، حساب فقط لـ [2] → حساب واحد
الرمز 3: استخدام K,V المخزنة، حساب فقط لـ [3] → حساب واحد
الرمز 4: استخدام K,V المخزنة، حساب فقط لـ [4] → حساب واحد
...
الرمز N: استخدام K,V المخزنة، حساب فقط لـ [N] → حساب واحد

المجموع: N حساب = O(N)

التأثير: KV caching يقلل الحساب من O(N²) إلى O(N) لطول التسلسل N.

كيف يعمل KV Cache

في انتباه المحول، كل رمز ينتج متجهات المفتاح (K) والقيمة (V):

# آلية الانتباه
# Q = الاستعلام (من الرمز الحالي)
# K = المفتاح (من جميع الرموز)
# V = القيمة (من جميع الرموز)

# Attention(Q, K, V) = softmax(Q @ K.T / sqrt(d_k)) @ V

# أثناء الفك الترميزي، بدلاً من إعادة حساب K,V لجميع الرموز:
# 1. استرجاع K,V المخزنة من الرموز السابقة
# 2. حساب K,V فقط للرمز الجديد
# 3. الدمج: K_new = [K_cached, K_current]
# 4. حساب الانتباه مع K,V الكاملة
# 5. تخزين K_current, V_current في الذاكرة

متطلبات ذاكرة KV Cache

ذاكرة KV cache تنمو مع:

  • طول التسلسل
  • حجم الدفعة
  • عدد الطبقات
  • عدد رؤوس الانتباه
  • بُعد الرأس
# صيغة ذاكرة KV Cache
# memory = 2 × batch × layers × heads × seq_len × head_dim × bytes

# مثال: Llama 3.3 70B مع 80 طبقة، 64 رأس، 128 بُعد رأس
# للدفعة=1، طول_التسلسل=4096، FP16 (2 بايت):
memory_bytes = 2 * 1 * 80 * 64 * 4096 * 128 * 2
memory_gb = memory_bytes / (1024**3)
# ≈ 10.7 جيجابايت فقط لـ KV cache!

# للدفعة=32:
# ≈ 343 جيجابايت - يتجاوز معظم ذاكرة GPU

رؤية رئيسية: KV cache غالباً يستهلك ذاكرة أكثر من أوزان النموذج أثناء الاستدلال.

مشكلة تجزئة الذاكرة

تخصيص KV cache التقليدي يعاني من التجزئة:

┌──────────────────────────────────────────────────────────┐
│                   ذاكرة GPU (مجزأة)                      │
├──────────────────────────────────────────────────────────┤
│                                                          │
│  [الطلب A: 512 رمز]  [فارغ]  [الطلب B: 256]            │
│  ████████████████████████  ░░░░░   ████████████         │
│                                                          │
│  [فارغ]  [الطلب C: 128]  [فارغ]  [الطلب D: 64]        │
│  ░░░░░░   ████████          ░░░░░░   ████               │
│                                                          │
│  المشكلة: 30% من الذاكرة ضائعة في الفجوات              │
│  طلب جديد من 300 رمز لن يناسب رغم وجود مساحة          │
│                                                          │
└──────────────────────────────────────────────────────────┘

هذه التجزئة تحد من أحجام الدفعات والإنتاجية.

حل PagedAttention

PagedAttention (قدمته vLLM) يعامل KV cache مثل الذاكرة الافتراضية لنظام التشغيل:

┌──────────────────────────────────────────────────────────┐
│              إدارة ذاكرة PagedAttention                  │
├──────────────────────────────────────────────────────────┤
│                                                          │
│  الكتل الفيزيائية (حجم ثابت، مثلاً 16 رمز لكل منها):   │
│  ┌────┬────┬────┬────┬────┬────┬────┬────┐              │
│  │ B0 │ B1 │ B2 │ B3 │ B4 │ B5 │ B6 │ B7 │              │
│  └────┴────┴────┴────┴────┴────┴────┴────┘              │
│                                                          │
│  الطلب A (512 رمز) → الكتل [0,1,2,3,...]               │
│  الطلب B (256 رمز) → الكتل [32,33,34,...]              │
│  الطلب C (128 رمز) → الكتل [48,49,...]                 │
│                                                          │
│  جدول الكتل (الربط الافتراضي → الفيزيائي):             │
│  الطلب A: [0,1,2,...,31]                               │
│  الطلب B: [32,33,34,...,47]                            │
│  الطلب C: [48,49,...,55]                               │
│                                                          │
│  الفوائد:                                               │
│  • هدر ذاكرة قريب من الصفر                             │
│  • تخصيص الكتل عند الطلب                               │
│  • مشاركة ذاكرة سهلة للبحث الشعاعي                     │
│  • 2-4 أضعاف الطلبات في نفس الذاكرة                    │
│                                                          │
└──────────────────────────────────────────────────────────┘

تقنيات تحسين KV Cache

1. انتباه الاستعلام المجمع (GQA)

يقلل KV cache بمشاركة K,V عبر رؤوس الاستعلام:

# انتباه متعدد الرؤوس (MHA): 64 رأس → 64 زوج K,V
# انتباه الاستعلام المجمع (GQA): 64 رأس → 8 أزواج K,V (8 مجموعات)
# تقليل الذاكرة: 8 أضعاف أصغر لـ KV cache

# Llama 3 يستخدم GQA مع 8 رؤوس KV
# نموذج 70B: 10.7 جيجابايت → 1.3 جيجابايت KV cache لنفس التسلسل

2. انتباه الاستعلام المتعدد (MQA)

الحالة القصوى: جميع رؤوس الاستعلام تشترك في K,V واحد:

# انتباه الاستعلام المتعدد: 64 رأس → زوج K,V واحد
# تقليل الذاكرة: 64 ضعف أصغر لـ KV cache
# المقايضة: بعض تدهور الجودة

3. تكميم KV Cache

تقليل دقة القيم المخزنة:

# KV cache بـ FP16: 2 بايت لكل قيمة
# KV cache بـ INT8: 1 بايت لكل قيمة → ضغط 2x
# KV cache بـ INT4: 0.5 بايت لكل قيمة → ضغط 4x

# مثال: vLLM يدعم KV cache بـ FP8
# نموذج 70B، سياق 4096: 10.7 جيجابايت → 5.35 جيجابايت

4. ضغط KV Cache

ضغط ديناميكي بناءً على أنماط الانتباه:

# نهج موجه بالإنتروبيا (بحث 2025):
# - تحديد الرموز "المهمة" عبر إنتروبيا الانتباه
# - الحفاظ على الدقة الكاملة للرموز المهمة
# - ضغط أو إزالة الرموز الأقل أهمية
# - النتائج: تقليل الذاكرة 4.18%، الحفاظ على الجودة

قياس كفاءة KV Cache

المقاييس الرئيسية:

# معدل إصابة KV Cache (للتخزين المؤقت للبادئة)
hit_rate = cached_tokens / total_tokens

# استخدام الذاكرة
utilization = used_kv_memory / allocated_kv_memory

# حجم الدفعة الفعال (مع PagedAttention)
effective_batch = actual_batch_size / theoretical_max_batch
# الهدف: >90% استخدام

فهم KV cache أساسي—كل تقنية تحسين تبني على هذا.

التالي، سنستكشف استراتيجيات التجميع التي تعظم استخدام GPU. :::

اختبار

الوحدة 1: أساسيات استدلال نماذج اللغة الكبيرة

خذ الاختبار