المستوى: محترف — يفترض إنك شغّلت LLM في الإنتاج قبل كده وعارف معنى KV cache و GPU memory و batch size.
لو بتشغّل Llama 3.1 70B على H100 80GB وبتقدر تخدم 23 request متزامن بس قبل ما تقع في CUDA OOM، المشكلة مش في حجم النموذج. 60% إلى 80% من ذاكرة الـ KV cache بتضيع في fragmentation بدون ما تستخدمها. PagedAttention بيحل ده بفكرة عمرها 60 سنة من نظام التشغيل، والنتيجة 2.7× throughput على نفس الـ hardware بدون تغيير سطر في النموذج.
المشكلة باختصار: KV Cache بياكل ذاكرتك من غير ما تشتغل
في كل request بتبعته لنموذج LLM، النموذج بيحتفظ بـ key و value tensors لكل token في الـ context. ده اسمه KV cache. على Llama 70B بـ context 4096 token، الـ KV cache بياخد ~1.3GB لكل request. لو عندك 80GB على H100 وحاجبلك النموذج 140GB موزّعة على tensor parallelism بـ 4 GPUs، الذاكرة المتاحة للـ KV cache بتبقى ~30GB لكل GPU.
الحساب البسيط بيقول: 30GB ÷ 1.3GB = 23 request. الحساب الفعلي على Hugging Face TGI بدون PagedAttention: 14 إلى 18 request قبل OOM. الفرق ده هو fragmentation.
مثال للمبتدئ: رفوف المكتبة
تخيّل عندك مكتبة فيها رفوف. كل رف بياخد 100 كتاب. لما يجي زائر يطلب إنه يحجز رف لمشروع بحث، انت بتحجزله رف كامل حتى لو هو محتاج 12 كتاب بس. الـ 88 مكان الفاضي مش بيقدر حد تاني يستخدمهم لحد ما الزائر يخلّص.
ده بالظبط اللي بيحصل في الـ KV cache التقليدي. كل request بيحجز chunk ثابت ومستمر (contiguous) من الذاكرة بحجم الـ max_sequence_length. لو الـ request خلّص بعد 300 token من أصل 4096، الـ 3796 token الفاضيين بيقعدوا محجوزين بدون فايدة.
PagedAttention بيغيّر القاعدة: بدل ما تحجز رف كامل، احجز أرفف صغيرة (blocks) بحجم 16 كتاب. لما الزائر يحتاج كتاب رقم 17، احجزله رف تاني. لما يخلّص، الرف يرجع للـ pool وحد تاني ياخده فورًا.
الشرح العلمي: ليه PagedAttention يعتبر breakthrough
الورقة الأصلية: "Efficient Memory Management for Large Language Model Serving with PagedAttention" — Kwon et al., UC Berkeley، SOSP 2023. الفكرة مستلفة من Virtual Memory في Linux من 1962 (Multics).
الـ KV cache بيتقسم لـ blocks ثابتة الحجم (default = 16 token لكل block). كل block ممكن يتخزّن في أي مكان فيزيائي في الـ GPU memory، ومش لازم يكون مستمر. الـ vLLM scheduler بيحتفظ بـ block table لكل request بيـربط الـ logical blocks بالـ physical blocks (نفس فكرة page table في نظام التشغيل).
النتيجة من الورقة الأصلية:
- Memory waste من 60-80% (vanilla) إلى أقل من 4% (PagedAttention).
- Throughput على Llama 7B: 2× إلى 4× مقارنة بـ FasterTransformer و Orca.
- Copy-on-Write للـ parallel sampling: nucleus sampling بـ n=4 ياخد ذاكرة تقريبًا مساوية لـ n=1.