Speculative Decoding: ليه الموديل بيرد 3x أسرع بنفس الجودة
المقال ده يتطلب مستوى محترف. لازم تكون فاهم Transformer architecture، الـ autoregressive generation، وحجم الـ KV cache. لو لسه بتبدأ مع LLMs، ابدأ بمقال Tokenization ومقال Context Window الأول.
لو بتشغّل Llama 3 70B على H100 وكل request بياخد 8 ثواني علشان يولّد 200 توكن، المشكلة مش في الـ GPU. المشكلة إن الموديل بيولّد توكن واحد في كل forward pass، والـ memory bandwidth بتاع الـ GPU بيقعد فاضي 60% من الوقت. Speculative Decoding بيحل ده ويرفع الـ throughput من 24 توكن/ثانية لـ 71 توكن/ثانية على نفس الـ hardware ونفس الموديل ونفس الجودة بالظبط.
المشكلة باختصار: ليه الـ GPU فاضي والموديل بطيء
الـ autoregressive generation طبيعتها تسلسلية. كل توكن جديد محتاج يقرا الـ KV cache كله من الـ HBM (high bandwidth memory) ويعمل matrix multiplication بكل الباراميترات. على H100 SXM بـ 3.35 TB/s bandwidth وموديل 70B بـ FP16 = 140GB، أنت محدود نظرياً بـ 3350 ÷ 140 ≈ 24 توكن/ثانية. ده اسمه memory-bound regime: الـ compute مش هو الـ bottleneck، النقل من الذاكرة هو اللي بياكل الوقت.
المفارقة: نفس الـ GPU يقدر يعمل forward pass على 5 توكن في وقت واحد بنفس الزمن تقريباً، لأن الـ matrix multiplication بيستفيد من الـ tensor cores اللي قاعدة فاضية. Speculative Decoding بيستغل المفارقة دي بالظبط.
المثال البسيط: الكاشير اللي بيخمّن الطلب
تخيل مطعم وجبات سريعة فيه عميل ثابت بيطلب نفس الحاجة كل يوم: برجر، بطاطس، كولا، كاتشب، صوص. لو الكاشير الأساسي (الموديل الكبير) بيسأل سؤال سؤال، الطلب بياخد 30 ثانية. لكن لو في كاشير مساعد سريع (الموديل الصغير) بيخمّن الـ 5 حاجات الكاملة في 3 ثواني ويقدّمها للأساسي، الأساسي يبص ثانيتين ويقول "كله صح". الطلب اتنجز في 5 ثواني بدل 30.
لو المساعد غلط في حاجة (مثلاً قال "سبرايت" والعميل عايز كولا)، الأساسي بيرفض من النقطة دي ويكمل بنفسه. الحاجات اللي قبلها الصح بتتحفظ. النتيجة النهائية مطابقة 100% لو الأساسي اشتغل لوحده، بس في وقت أقل بكتير. ده بالظبط اللي بيحصل في Speculative Decoding.
التعريف العلمي الدقيق
Speculative Decoding هو خوارزمية inference بتستخدم موديلين بنفس عيلة الـ tokenizer:
- Draft model (q): موديل صغير سريع (مثلاً Llama 3.2 1B). بيولّد K توكن متتالية بشكل autoregressive عادي.
- Target model (p): الموديل الكبير اللي عايز مخرجه (مثلاً Llama 3 70B). بيقيّم الـ K توكن في forward pass واحد بالتوازي ويطلع توزيع احتمالي لكل واحد.
للتوكن t من المسودة، نحسب الـ acceptance probability:
α(t) = min(1, p(t | context) / q(t | context))