يتطلب مستوى: محترف. الشرح ده مبني على فرضية إنك بتخدم نموذج LLM مفتوح المصدر (زي Llama أو Qwen) على GPU واحد أو أكتر، وبتشوف الـ latency والـ throughput في بيئة إنتاج. لو انت مستخدم API خارجي بس، الجزء التطبيقي مش هيلزمك، بس المفهوم هيفيدك في فهم فاتورتك.
ليه سيرفر الـ LLM بيخنق عند 10 مستخدمين، وإزاي PagedAttention يحل المشكلة
تقدر تخدم من 2 لـ 24 ضعف عدد المستخدمين على نفس كرت الشاشة، من غير ما تغيّر النموذج ولا تشتري GPU أقوى. المفتاح هو طريقة إدارة الذاكرة اللي اسمها PagedAttention.
المشكلة باختصار
عندك سيرفر Llama-3 8B على كرت A100 بذاكرة 80 جيجا. النموذج نفسه بياخد حوالي 16 جيجا. المفروض يفضل 64 جيجا للمستخدمين. ومع ذلك السيرفر بيرمي "out of memory" عند المستخدم رقم 12، وكرت الشاشة مؤشره بيقول إنه نصه فاضي. ده مش عطل في الدرايفر. ده هدر في الـ KV Cache.
ما هو الـ KV Cache؟ المفهوم بمثال بسيط الأول
تخيّل إنك بتقرا كتاب بصوت عالي لصاحبك، وكل كلمة جديدة بتنطقها لازم تفتكر كل الكلمات اللي فاتت عشان الجملة تطلع مترابطة. لو في كل كلمة رجعت قريت الصفحة من أولها، هتاخد ساعة في فقرة. الحل الطبيعي: تكتب ملخص جنبك بالكلمات اللي عدّت، فتبص عليه بدل ما تعيد القراءة. الملخص ده هو الـ KV Cache.
علميًا: النموذج بيولّد التوكن التالي بناءً على كل التوكنز السابقة عبر آلية الـ attention. من غير كاش، توليد كل توكن جديد بيتطلب إعادة حساب مفاتيح (Keys) وقيم (Values) كل التوكنز السابقة. الـ KV Cache بيخزّن الـ K والـ V المحسوبين لكل توكن مرة واحدة، فبيحوّل التعقيد من تربيعي لخطي في كل خطوة. المقابل: استهلاك ذاكرة بيكبر مع طول السياق وعدد الطلبات المتوازية.
ليه بيتهدر 60–80% من الذاكرة
الأنظمة التقليدية (قبل vLLM) كانت بتحجز للـ KV Cache بتاع كل طلب كتلة ذاكرة متصلة بحجم أقصى طول ممكن للسياق، من أول لحظة. يعني لو الحد الأقصى 2048 توكن، والطلب استخدم 100 توكن بس، الـ 1948 الباقيين محجوزين وفاضيين ومش متاحين لأي طلب تاني. ده اسمه التجزئة الداخلية (internal fragmentation).
ابحاث فريق vLLM من جامعة بيركلي (Kwon et al., SOSP 2023) قاست إن الأنظمة دي كانت بتستغل فعليًا بين 20% و38% بس من الذاكرة المحجوزة للكاش. الباقي، 60–80%، بيضيع على الحجز المبكر والتجزئة. ده السبب المباشر إن سيرفرك بيخنق بدري رغم إن الذاكرة "مش مليانة".
الحل: PagedAttention — استعارة من نظام التشغيل
PagedAttention بياخد فكرة قديمة من أنظمة التشغيل: الذاكرة الافتراضية والـ paging. بدل ما يحجز كتلة متصلة كبيرة، بيقسّم الـ KV Cache لكتل صغيرة ثابتة الحجم (blocks/pages)، وبيخصّص الكتلة وقت ما الطلب يحتاجها فعليًا مش قبلها. الكتل مش لازم تكون متجاورة في الذاكرة، فبيختفي الهدر الناتج عن التجزئة، وينزل لأقل من 4%.
عمليًا انت مش هتكتب ده بإيدك. بتستخدم vLLM اللي مطبّق PagedAttention جوّه. الإعداد قابل للنسخ: