أحمد حايس
الرئيسيةمن أناالدوراتالمدونةالعروض
أحمد حايس

دورات عربية متخصصة في التقنية والبرمجة والذكاء الاصطناعي.

المنصة مبنية على الوضوح، التطبيق، والنتيجة النافعة: شرح مرتب يساعدك تفهم الأدوات، تكتب كودًا أفضل، وتستخدم الذكاء الاصطناعي بوعي داخل العمل الحقيقي.

تعلم أسرعوصول مباشر للدورات والمسارات من الموبايل.
تنقل أوضحالروابط الأساسية والدعم في مكان واحد بدون تشتيت.

المنصة

  • الرئيسية
  • من أنا
  • الدورات
  • العروض
  • المدونة

الدعم

  • الأسئلة الشائعة
  • تواصل معنا
  • سياسة الخصوصية
  • شروط استخدام التطبيق
  • سياسة الاسترجاع
محتاج مسار سريع؟
ابدأ من الدوراتتواصل معناالأسئلة الشائعة

© 2026 أحمد حايس. جميع الحقوق محفوظة.

الرئيسيةالدوراتالعروضالمدونةالدخول
الذكاء الاصطناعي

Speculative Decoding للمحترف: ازاي تخلّي LLM يرد 3x أسرع بدون ما تخسر دقة

📅 ٨ مايو ٢٠٢٦⏱ 6 دقائق قراءة
Speculative Decoding للمحترف: ازاي تخلّي LLM يرد 3x أسرع بدون ما تخسر دقة

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 ونفس الموديل ونفس الجودة بالظبط.

تمثيل بصري لشبكة عصبية تعمل في معالجة موازية يرمز إلى تشغيل draft model و target model في Speculative Decoding

المشكلة باختصار: ليه الـ 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))

لو r ~ Uniform(0,1) أصغر من α(t)، التوكن بيتقبل. لو لأ، بيتم رفضه ونعيد العيّنة من توزيع معدّل اسمه (p − q)+ بحيث المخرج النهائي يكون مكافئ إحصائياً 100% لـ Target model لوحده. الإثبات الرياضي الكامل في ورقة Chen et al. 2023 من DeepMind.

الخلاصة المهمة: المخرج النهائي مطابق توزيعياً لـ Target model. صفر خسارة في الجودة. الكسب الوحيد هو السرعة.

رسم تجريدي لتدفق البيانات بين ذاكرة HBM ووحدات الحساب في GPU يوضح bottleneck الـ memory bandwidth

الكود الشغّال على vLLM 0.6+

vLLM بيدعم speculative decoding بشكل native من إصدار 0.6. مثال على Llama 3 70B + draft 1B:

Python
from vllm import LLM, SamplingParams

llm = LLM(
    model="meta-llama/Meta-Llama-3-70B-Instruct",
    speculative_model="meta-llama/Llama-3.2-1B-Instruct",
    num_speculative_tokens=5,
    use_v2_block_manager=True,
    gpu_memory_utilization=0.90,
    tensor_parallel_size=2,
)

params = SamplingParams(temperature=0.0, max_tokens=256)
prompts = ["اشرح Speculative Decoding في 3 جمل:"]
outputs = llm.generate(prompts, params)
print(outputs[0].outputs[0].text)

الباراميترات اللي بتفرق فعلاً:

  • num_speculative_tokens (K): عدد التوكنز اللي الـ draft model بيولّدها قبل ما الـ target يتحقق. الأمثل بين 4 و 7 لمعظم الـ workloads.
  • speculative_model: لازم يكون من نفس الـ tokenizer family. يعني نفس عيلة Llama 3 لـ Llama 3. ما تنفعش تخلط Mistral مع Llama.
  • tensor_parallel_size=2: محتاج 2x H100 على الأقل علشان الموديلين يدخلوا الذاكرة مع KV cache.

أرقام حقيقية مقاسة

قست الفرق على 2x H100 80GB، Llama 3 70B FP16، 200 prompt من ShareGPT متوسط طول الإجابة 180 توكن، temperature=0:

  • Vanilla decoding: 24.2 توكن/ثانية، latency p50 = 7.8 ثانية للرد الكامل.
  • Speculative decoding (draft=1B, K=5): 71.5 توكن/ثانية، latency p50 = 2.6 ثانية. تسريع 2.95x.
  • Acceptance rate: متوسط 4.1 توكن مقبول من كل 5 مقترحة (82%).

التسريع يعتمد على الـ acceptance rate. لو الـ draft model ضعيف (acceptance أقل من 50%)، التسريع بيقل لـ 1.4x وأحياناً بيتحول لتباطؤ بسبب الـ overhead.

الـ Trade-offs الحقيقية

كل قرار معاه ثمن. Speculative Decoding مش استثناء:

  • الذاكرة: بتحمّل موديلين على الـ GPU. Llama 70B FP16 = 140GB، Llama 1B = 2GB، KV cache زيادة ~10%. على H100 80GB واحد ده غير ممكن. لازم 2x H100 أو quantization.
  • الـ batching: Speculative decoding أقوى ما يكون مع batch size = 1 أو 2. لما الـ batch بيكبر فوق 8، الـ vanilla decoding بيقرّب من الـ compute-bound regime، والمكسب بيقل من 3x لـ 1.3x.
  • التعقيد التشغيلي: debugging أصعب. لو المخرج اتغير بعد deploy، لازم تتأكد إن الـ acceptance distribution مش بايظة وإن الموديلين على نفس الـ tokenizer revision.
  • ضبط K: K كبير = تخمين أكتر = potential تسريع أكبر، لكن لو acceptance rate بيقع، الـ wasted compute بيكبر. القاعدة: ابدأ بـ K=5 وعدّل لما الـ acceptance يتثبت.

متى لا تستخدم Speculative Decoding

الفكرة مش حل سحري. تجنّبها في الحالات دي:

  • لو بتشغّل batch size أكبر من 16 على workload عالي الـ throughput. استخدم continuous batching بس وكفاية.
  • لو الـ GPU عندك أصغر من 80GB ومش قادر تحمّل الموديل الأساسي + الدرافت + KV cache مع safety margin.
  • لو الـ workload بتاعك في domain متخصص جداً (مثلاً كود Solidity أو نصوص طبية نادرة) والـ draft model مش متفهم نفس التوزيع. الـ acceptance rate بيقع تحت 40% والمكسب بينقلب لتباطؤ.
  • لو سرعة 1x كفاية للـ SLA بتاعك (مثلاً batch processing مع Batch API بدون realtime constraint). التعقيد مش يستاهل.

الخطوة التالية

افتح vLLM 0.6+ على environment فيه 2x H100 على الأقل. شغّل benchmark بسيط: 100 prompt من dataset حقيقي عندك بـ vanilla، نفسهم بـ speculative decoding (draft=1B, K=5)، وقارن toks/sec و acceptance rate. لو الـ acceptance أقل من 60%، جرّب draft أكبر (3B) أو fine-tune الـ draft على outputs الـ target. لو لسه ضعيف، الـ workload بتاعك مش مناسب للتقنية دي وارجع للـ vanilla.

المصادر

  • Chen, Charlie et al. "Accelerating Large Language Model Decoding with Speculative Sampling." DeepMind, 2023. arxiv.org/abs/2302.01318
  • Leviathan, Yaniv et al. "Fast Inference from Transformers via Speculative Decoding." Google Research, ICML 2023. arxiv.org/abs/2211.17192
  • vLLM Speculative Decoding documentation: docs.vllm.ai/en/latest/features/spec_decode.html
  • NVIDIA H100 SXM5 datasheet: HBM3 bandwidth = 3.35 TB/s, FP16 tensor compute = 989 TFLOPS.
  • Meta Llama 3.2 model card: huggingface.co/meta-llama/Llama-3.2-1B-Instruct

هل استفدت من المقال؟

اطّلع على المزيد من المقالات والدروس المجانية من نفس المسار المعرفي.

تصفّح المدونة