هذا المقال يتطلب مستوى محترف. الافتراض إنك بتشغّل Llama 3.1 70B أو نموذج مكافئ على GPU من فئة H100/A100، وعندك معرفة مسبقة بـ vLLM أو TGI، وفاهم الفرق بين memory-bound و compute-bound inference.
لو الـ p95 latency بتاع الـ inference عندك واقف عند 2,400ms ومحتاج تنزّله تحت 800ms بدون ما تشتري GPU إضافي، Speculative Decoding هو أرخص طريقة. النتيجة الفعلية على workload chatbot عربي: throughput قفز من 24 إلى 58 token/sec على H100 80GB، بدون أي تغيير في مخرجات النموذج.
Speculative Decoding: تسريع الـ Inference بدون فقدان جودة
المشكلة باختصار
توليد الـ tokens في LLM تقليدي بيشتغل serial. كل token جديد محتاج forward pass كامل عبر الـ 70B parameter. على H100، ده بياخد حوالي 41ms لكل token. لو الإجابة 300 token، المستخدم بيستنى 12.3 ثانية. المشكلة مش في قوة الـ GPU — H100 عنده 80GB HBM3 ببandwidth 3.35 TB/s. المشكلة إن كل forward pass بيتقرأ كل الـ 70B parameter من الـ HBM، فبتبقى memory-bound مش compute-bound.
المثال المبسّط: المحرر والمدقق اللغوي
تخيّل إنك محرر صحفي محترف، وعندك مدقق لغوي مبتدئ. لو خليت المدقق المبتدئ يكتب الفقرة الأولى من المقال بسرعة (هو سريع لكنه بيغلط)، وانت كمحرر بتقرا كل اللي كتبه دفعة واحدة وتقول "أول 7 كلمات صح، الكلمة التامنة غلط، خليني أعيدها".
الموضوع هنا إنك كمحرر بتقرا 7 كلمات في نفس الوقت اللي كنت هتقرا فيه كلمة واحدة. المدقق المبتدئ يقدر يكتب 5x أسرع منك. لو 70% من اللي بيكتبه طلع صح، انت كسبت سرعة حقيقية بدون ما تتنازل عن جودة المخرج النهائي — لأن المحرر هو اللي بيعتمد الكلام في النهاية.
ده بالظبط اللي بيعمله Speculative Decoding: نموذج صغير سريع (الـ draft) بيخمّن عدة tokens متتالية، والنموذج الكبير (الـ target) بيتحقق منهم في forward pass واحد.
الشرح العلمي الدقيق
الفكرة ظهرت في ورقتين متوازيتين سنة 2022/2023: Leviathan et al. (Google Research) و Chen et al. (DeepMind). الخطوات الرياضية:
- Draft phase: نموذج صغير (مثلاً Llama-3.2-1B) بيولّد k token متتالية autoregressively. التكلفة k × t_small حيث t_small ≈ 4ms.
- Verify phase: النموذج الكبير (Llama 3.1 70B) بيستلم الـ k token مرة واحدة كـ batch، ويحسب الـ logits لكل واحد منهم في forward pass واحد بزمن t_large ≈ 45ms (بدل k × 41ms).
- Acceptance criterion: لكل token من الـ draft، نحسب نسبة p_target(x) / p_draft(x). لو ≥ 1 نقبل. لو < 1 نقبل باحتمال يساوي النسبة. أول token مرفوض نوقف عنده، ونعيد sampling من توزيع متعدّل.
الميزة الرياضية الأساسية: التوزيع النهائي للـ tokens المقبولة identical لتوزيع النموذج الكبير لو شغّاله لوحده. ده مش approximation — ده lossless تماماً (راجع Theorem 1 في Leviathan 2022).