Inference & Efficiency2023متوسط11 دقيقة قراءة

تسريع الاستدلال في المُحوِّلات باستخدام فك الترميز التخميني

Fast Inference from Transformers via Speculative Decoding

Leviathan, Y. · Kalman, M. · Matias, Y. — ICML

المشكلة

المُحوِّلات الكبيرة ذاتية الانحدار بطيئة في لأن توليد K رمز يستلزم K تمريرة أمامية واحدة تلو الأخرى — لا تبدأ الخطوة التالية حتى تنتهي السابقة. المشكلة ليست في قدرة المعالج الحسابية بل في سرعة قراءة الذاكرة: كل رمز يتطلّب تحميل أوزان النموذج بالكامل من الذاكرة. الحلول المعروفة مثل والتكميم والخروج المبكّر تفرض ثمناً: إعادة تدريب، أو تعديل في البنية، أو تغيُّر في توزيع المخرجات. لم تكن هناك طريقة عامة تُسرّع الاستدلال دون أن تمسّ النموذج أو تغيّر مخرجاته.

الإسهام

: خوارزمية تسريع بلا خسارة في الجودة. الفكرة أن نموذجاً صغيراً «مُسوِّداً» يخمّن γ رمز دفعة واحدة، ثم النموذج الكبير «الهدف» يتحقّق منها جميعاً في تمريرة أمامية واحدة بالتوازي. آلية اعتيان جديدة — الاعتيان التخميني — تضمن أن التوزيع الناتج مطابق تماماً لما كان سيُنتجه النموذج الكبير وحده. لا حاجة لإعادة التدريب ولا لتعديل البنية. النتيجة العملية: تسريع 2–3 أضعاف على T5-XXL (11 مليار معامل) في الترجمة والتلخيص، مع مخرجات مطابقة رياضياً.

الأثر

أصبح فك الترميز التخميني أداة أساسية في أنظمة تشغيل النماذج اللغوية الكبيرة على نطاق إنتاجي. تفرّعت منه عائلة كاملة من التقنيات (EAGLE وMedusa وSpecInfer وفك الترميز التخميني المرحلي)، وأُدمج مباشرة في أُطر عمل مثل vLLM وTensorRT-LLM وHuggingFace TGI. الفكرة المحورية — أن التحقّق من النتائج أرخص بكثير من توليدها لأنه قابل للتوازي — أعادت تشكيل طريقة تفكير المجال بالكامل حول زمن الاستدلال.

تخيّل كاتباً في محكمة وقاضياً كبيراً. الكاتب سريع جداً لكنه يخطئ أحياناً، أما القاضي فدقيق دائماً لكنه بطيء. في الوضع العادي، القاضي يُملي كلمة كلمة — عملية مؤلمة البطء. الآن تخيّل أن الكاتب يتجرّأ ويكتب خمس كلمات للأمام من تلقاء نفسه، ثم يمرّ القاضي عليها كلها بنظرة واحدة: «صح، صح، صح، غلط — الصحيح هو كذا.» بنظرة واحدة حلّت محلّ أربع خطوات إملاء. المحضر النهائي مطابق تماماً لما كان سيُمليه القاضي بنفسه، لكن الجلسة انتهت بثلث الوقت.

عنق الزجاجة: لماذا التوليد التسلسلي بطيء إلى هذا الحد

الكبير من النوع يولّد النص بعد رمز. لتوليد K رمز، يحتاج النموذج إلى K تمريرة أمامية متتالية — في كل واحدة يُحمّل مليارات المعاملات من الذاكرة، ويحسب على السياق بأكمله، ثم يُخرج رمزاً واحداً فقط. والتمريرة التالية لا تبدأ إلا بعد أن ينتهي الرمز السابق.

الملاحظة المفتاحية هنا أن هذه التمريرات نادراً ما تكون مقيّدة بالقدرة الحسابية. وحدات المعالجة الرسومية الحديثة تمتلك طاقة حسابية ضخمة، لكنها تقضي معظم وقتها في انتظار وصول البيانات من الذاكرة. هذا هو الذاكرة: الزمن المطلوب لتوليد رمز واحد يهيمن عليه وقت تحميل أوزان النموذج من الذاكرة عالية النطاق (HBM)، وليس عمليات ضرب المصفوفات نفسها. بعبارة أخرى، المعالج لديه طاقة حسابية فائضة لا يستخدمها — وهنا بالضبط يأتي دور فك الترميز التخميني: استغلال هذه الطاقة المُهدَرة.

افتح في المختبر
قارن بين الطريقتين: في الطريقة التقليدية يُشغَّل النموذج الكبير مرة لكل رمز، أما في الطريقة التخمينية فتُجمع γ رمز مُسوَّد وتُتحقَّق دفعة واحدة بالتوازي.
تستيقظ التجربة عند وصولك…

الفكرة الأساسية: اقترح، تحقّق، اقبل

الخوارزمية تعمل في ثلاث مراحل تتكرّر. في المرحلة الأولى، يأتي نموذج مُسوِّد صغير وسريع (Mq) ويولّد γ رمز مرشّح بأسلوب — هذه خطوة رخيصة لأن المُسوِّد أصغر من النموذج الهدف بنحو مئة مرة. في المرحلة الثانية، يأتي النموذج الهدف الكبير (Mp) ويقيّم كل الرموز المرشّحة الـ γ مع موضع إضافي واحد في تمريرة أمامية واحدة — وهذه هي خطوة التحقّق المتوازي. السرّ هنا أن النموذج الهدف يعالج كل المواضع دفعة واحدة (تماماً كما يعمل )، فتكلفة هذه التمريرة الواحدة تقارب تكلفة توليد رمز واحد بالطريقة التقليدية. في المرحلة الثالثة، نمرّ على الرموز المُقترحة بالترتيب: كل رمز احتماله عند النموذج الهدف Mp كافٍ مقارنة باحتماله عند المُسوِّد Mq نقبله، وعند أول رمز لا يجتاز المعيار نرفضه ونسحب بديلاً من توزيع النموذج الهدف المُعدَّل.

المحصّلة: كل دورة تُنتج بين رمز واحد و γ+1 رمز، مع تشغيل واحد فقط للنموذج الهدف المُكلف. في أفضل الأحوال، تُقبل كل الرموز الـ γ ويُضاف رمز إضافي — أي أننا قلّصنا عدد تشغيلات النموذج الكبير بمعامل (γ+1)×.

افتح في المختبر
تابع دورة كاملة: المُسوِّد يخمّن، والنموذج الهدف يراجع بالتوازي. الرموز المقبولة تبقى، وأول رمز مرفوض يُستبدل بالتصحيح.
تستيقظ التجربة عند وصولك…

الاعتيان التخميني: الحفاظ على التوزيع بدقة تامة

جوهر الورقة الرياضي هو آلية الاعتيان التخميني. السؤال المركزي: كيف نسحب رمزاً من توزيع النموذج الهدف p(x) مستفيدين من توزيع المُسوِّد q(x) لتسريع العملية — دون أن نغيّر التوزيع الناتج قِيد أنملة؟

القاعدة بسيطة وأنيقة. اسحب رمزاً x من q(x)، ثم ولّد عدداً عشوائياً منتظماً r. إذا كان q(x) ≤ p(x)، معناها أن المُسوِّد كان متحفّظاً في تقديره — النموذج الهدف كان سيمنح هذا الرمز أعلى — فاقبله فوراً. أما إذا كان q(x) > p(x)، فالمُسوِّد بالغ في ثقته بهذا الرمز — اقبله باحتمال p(x)/q(x) فقط، وإن رُفض أعِد السحب من توزيع مُعدَّل p′(x) = normalize(max(0, p(x) − q(x))).

المبرهنة المركزية تُثبت أن الرموز الناتجة بهذه الطريقة توزيعها مطابق رياضياً للسحب من p(x) مباشرة. وهذا بالتحديد ما يجعل فك الترميز التخميني بلا خسارة: النص الناتج يتبع نفس التوزيع تماماً كأنك شغّلت النموذج الهدف وحده رمزاً بعد رمز.

P(accept x)=min ⁣(1,  p(x)q(x))P(\text{accept } x) = \min\!\left(1,\; \frac{p(x)}{q(x)}\right)
معيار القبول — حين q(x) ≤ p(x)، اقبل دائماًإذا كان المُسوِّد يعطي الرمز x احتمالاً أقل من الهدف أو مساوياً له، اقبل مباشرة. وإلا، اقبل باحتمال p(x)/q(x). هذه القاعدة تكفي وحدها لضمان أن التوزيع النهائي يطابق p(x) بدقة.
p(x)=max ⁣(0,  p(x)q(x))xmax ⁣(0,  p(x)q(x))p'(x) = \frac{\max\!\bigl(0,\; p(x) - q(x)\bigr)} {\sum_{x'} \max\!\bigl(0,\; p(x') - q(x')\bigr)}
التوزيع المُعدَّل لإعادة الاعتيان بعد الرفضحين يُرفض رمز مُقترح، لا نسحب من p(x) مباشرة لأن ذلك سيحسب المنطقة التي جرّبناها مرتين. بدلاً من ذلك، يأخذ p′(x) فقط الفرق الاحتمالي الزائد في p على q، وهذا يضمن أن العيّنة الإجمالية غير متحيّزة.
افتح في المختبر
انقر على أي رمز لمقارنة p(x) مع q(x) وانظر هل سيُقبل.
تستيقظ التجربة عند وصولك…

كم رمزاً نكسب؟ معدّل القبول α

العامل الذي يحكم مقدار التسريع هو α: معدّل القبول المتوقّع، أي ما احتمال أن يجتاز الرمز المُقترح معيار التحقّق. بتعبير أبسط، α يخبرك بمدى قدرة المُسوِّد Mq على محاكاة النموذج الهدف Mp.

الورقة تُظهر أن α له صيغة رياضية نظيفة: α = Σ_x min(p(x), q(x)) = 1 − D_LK(p,q)، حيث D_LK تباعد متماثل يقيس مقدار التداخل بين التوزيعين. حين يتطابق التوزيعان تماماً يصبح α = 1 — أي كل اقتراح يُقبل. وحين لا يوجد أي تداخل بينهما يصبح α = 0.

إذا افترضنا أن قرارات القبول مستقلة تقريباً، فالعدد المتوقع للرموز في كل دورة يتبع توزيعاً هندسياً مقطوعاً. التسريع الفعلي يعتمد على عاملين: α (جودة تقريب المُسوِّد) و c (تكلفة تشغيل المُسوِّد نسبة للهدف). حين يكون المُسوِّد صغيراً جداً (c ≈ 0)، يقترب التسريع من 1/(1−α). لاحظ أن حتى α متواضعاً كـ 0.7 يعني تقليص عدد تشغيلات النموذج الكبير إلى نحو الثلث.

E[tokens]=1αγ+11αE[\text{tokens}] = \frac{1 - \alpha^{\gamma+1}}{1 - \alpha}
الرموز المتوقّعة لكل دورة (هندسي مقطوع)بمعلومية معدّل القبول α وعدد الرموز المُسوَّدة γ، تحسب هذه الصيغة كم رمزاً نتوقّع إنتاجه في كل دورة. كلما اقترب α من 1، اقترب العدد من γ+1 — أي كل الرموز المُسوَّدة تُقبل مع رمز إضافي.
Speedup=1αγ+1(1α)(γc+1)\text{Speedup} = \frac{1 - \alpha^{\gamma+1}}{(1 - \alpha)(\gamma c + 1)}
معامل التسريع الزمني (مبرهنة 3.8)التسريع الفعلي يوازن بين الرموز المكتسبة (في البسط) وتكلفة تشغيل المُسوِّد γ مرة (في المقام، عبر معامل التكلفة c). حين يكون المُسوِّد رخيصاً جداً (c ≈ 0)، يتساوى التسريع مع العدد المتوقع للرموز في كل دورة.
افتح في المختبر
اسحب α وc لترى كيف يتغيّر التسريع والرموز لكل دورة مع قيم γ مختلفة.
تستيقظ التجربة عند وصولك…

اختيار النموذج المُسوِّد وقيمة γ

نقطة مهمة: الضمان الرياضي للاعتيان التخميني يسري على أي نموذج مُسوِّد — حتى لو كان مولّد رموز عشوائياً أو نموذجاً ثنائياً بدائياً. التوزيع الناتج دائماً مطابق للنموذج الهدف مهما كان المُسوِّد ضعيفاً. الفرق الوحيد هو السرعة: مُسوِّد أفضل يرفع α، وα أعلى يعني رموزاً مقبولة أكثر في كل دورة.

من الناحية العملية، وجد المؤلفون أن أفضل نقطة توازن هي نموذج مُسوِّد أصغر بنحو مئة مرة من الهدف. مع T5-XXL (11 مليار معامل)، أعطى T5-Small (77 مليون معامل) أعلى تسريع — سريع بما يكفي لتكون تكلفته c شبه صفرية، وذكي بما يكفي ليحقّق α بين 0.53 و0.75 حسب المهمة.

أما قيمة γ المثلى فيمكن حسابها عددياً بمعلومية α و c. كلما ارتفع α أمكن زيادة γ قبل أن يتراجع العائد. مع مُسوِّد صغير جداً (c منخفضة)، قد تكون γ المثلى كبيرة. الورقة تشير أيضاً إلى أن آلية «أوراكل» تعدّل γ ديناميكياً بحسب القبول المتوقع قد تضيف تحسيناً بنحو 60% — وهو اتجاه طوّرته أعمال لاحقة فعلاً.

الفكرة في الكود

فك الترميز التخميني — دورة واحدة من الخوارزمية الأساسيةpython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

import numpy as np

def speculative_decode_step(target_model, draft_model, prefix, gamma=5):
    """دورة واحدة: اقترح γ رمز، تحقّق بالتوازي، اقبل أو صحّح."""

    # الخطوة 1: المُسوِّد يولّد γ رمز مرشّح بطريقة ذاتية الانحدار
    draft_tokens = []
    draft_probs = []
    current = prefix
    for _ in range(gamma):
        q = draft_model.get_distribution(current)   # q(x | البادئة)
        token = np.random.choice(len(q), p=q)       # اعتيّن من المُسوِّد
        draft_tokens.append(token)
        draft_probs.append(q)
        current = current + [token]

    # الخطوة 2: النموذج الهدف يقيّم كل المواضع في تمريرة واحدة
    # هذا هو المفتاح: التحقّق بالتوازي وليس تسلسلياً!
    target_probs = target_model.get_distributions_parallel(
        prefix, draft_tokens
    )  # تُعيد p(x) لكل موضع

    # الخطوة 3: اقبل أو ارفض، من اليسار إلى اليمين
    accepted = []
    for i in range(gamma):
        p = target_probs[i]         # توزيع الهدف في الموضع i
        q = draft_probs[i]          # توزيع المُسوِّد في الموضع i
        x = draft_tokens[i]         # الرمز الذي اقترحه المُسوِّد

        # معيار القبول: اقبل إذا r < p(x)/q(x)
        if np.random.random() < min(1.0, p[x] / q[x]):
            accepted.append(x)      # أبقِ رمز المُسوِّد
        else:
            # رفض: اعتيّن تصحيحاً من التوزيع المُعدَّل
            adjusted = np.maximum(0, p - q)
            adjusted /= adjusted.sum()
            correction = np.random.choice(len(adjusted), p=adjusted)
            accepted.append(correction)
            break                   # توقّف عند أول رفض

    # إذا قُبلت كلها، اعتيّن رمزاً إضافياً من توزيع الهدف الأخير
    if len(accepted) == gamma:
        bonus = np.random.choice(len(target_probs[gamma]),
                                 p=target_probs[gamma])
        accepted.append(bonus)

    return prefix + accepted        # من 1 إلى γ+1 رمز جديد

النتائج التجريبية: تسريع 2–3 أضعاف مع مخرجات مطابقة

اختبر المؤلفون الخوارزمية على T5-XXL (11 مليار معامل) في مهمتين: الترجمة إنجليزي←ألماني (WMT) والتلخيص (CNN/DailyMail)، مع عدة نماذج مُسوِّدة. باستخدام T5-Small (77 مليون معامل) كمُسوِّد على وحدة TPU-v4 واحدة، جاءت النتائج كالتالي:

  • الترجمة بفك ترميز جشع (T=0): تسريع 3.4×، α = 0.75
  • الترجمة بالاعتيان (T=1): تسريع 2.6×، α = 0.62
  • التلخيص بفك ترميز جشع (T=0): تسريع 3.1×، α = 0.65
  • التلخيص بالاعتيان (T=1): تسريع 2.3×، α = 0.53

لاحظ أن يتفوّق دائماً، والسبب بديهي: حين تكون التوزيعات حادة ومركّزة، يسهل على المُسوِّد أن يتّفق مع النموذج الهدف، فيرتفع α. النقطة الأهم: كل هذه التسريعات جاءت مع مخرجات مطابقة رياضياً — ليست «قريبة» بل مسحوبة من نفس التوزيع بالضبط.

افتح في المختبر
رشّح حسب المهمة وطريقة الاعتيان لاستكشاف جدول النتائج الكامل من الورقة.
تستيقظ التجربة عند وصولك…

المقايضة: عمليات حسابية أكثر مقابل زمن أقل

فك الترميز التخميني يقايض العمليات الحسابية مقابل الزمن. في كل دورة، يعمل النموذج الهدف على γ+1 موضع بالتوازي — وحين تُرفض بعض الاقتراحات، تذهب الحوسبة التي أُنفقت عليها «هدراً». إجمالاً، قد تزيد العمليات الحسابية بمعامل 1.1–1.6× بحسب α و γ.

لكن هذه المقايضة في صالحنا. لماذا؟ لأن الاستدلال مقيَّد بسرعة الذاكرة لا بالقدرة الحسابية — المعالج لديه دورات فائضة لا يستخدمها أصلاً. ما يهمّ فعلاً هو كم مرة نضطر لتحميل أوزان النموذج من الذاكرة، وفك الترميز التخميني يخفّض هذا العدد بشكل حاد. كل عملية تحميل للأوزان تُنتج الآن عدة رموز بدل رمز واحد.

والأهم من ذلك أن نمط الوصول للذاكرة نفسه يتحسّن: أوزان النموذج الهدف وذاكرة KV Cache تُقرأ مرة واحدة لكل دورة بدلاً من مرة لكل رمز. لهذا السبب تعمل الطريقة بأفضل شكل حين يكون عرض حزمة الذاكرة هو عنق الزجاجة — وهذا هو الحال تقريباً دائماً حين نستدلّ من نماذج كبيرة بأحجام صغيرة.

ما الذي فتح الباب إليه فك الترميز التخميني

  1. 2022

    فك الترميز التخميني (هذه الورقة)

    أسّس إطار «خمّن — تحقّق — اقبل» مع ضمان رياضي بأن المخرجات لا تتغيّر. حقّق تسريع 2–3× على T5-XXL دون أي إعادة تدريب.

  2. 2023

    الاعتيان التخميني (DeepMind)

    عمل مستقل متزامن من Chen وآخرين أكّد تسريع 2–2.5× على Chinchilla 70B بنفس الإطار النظري.

  3. 2023

    SpecInfer وMedusa

    وسّعت فكرة التخمين لتشمل مسوّدات على شكل شجرة، حيث يُتحقَّق من عدة تسلسلات مرشّحة دفعة واحدة لرفع معدّلات القبول.

  4. 2024

    EAGLE وEAGLE-2

    رؤوس مُسوِّدة مُتعلَّمة تتنبّأ بتمثيلات السمات بدلاً من الرموز مباشرة، وحقّقت تسريعاً بمقدار 3–5× باستخدام أشجار تخمين ديناميكية.

  5. 2024

    الدمج في أُطر العمل

    أُطر العمل الرئيسية — vLLM وTensorRT-LLM وHuggingFace TGI — أضافت جميعها دعماً مدمجاً لفك الترميز التخميني، فأصبح معياراً في بيئات الإنتاج.

الأثر الأعمق لفك الترميز التخميني ليس التسريع العددي بحدّ ذاته، بل التحوّل في طريقة التفكير: إدراك أن التحقّق أرخص جوهرياً من التوليد في النماذج ذاتية الانحدار. التوليد بطبيعته تسلسلي — كل رمز يعتمد على سابقه ولا مفرّ من ذلك. لكن التحقّق قابل للتوازي بالكامل — أعطِ النموذج تسلسلاً مُقترحاً وسيفحص كل المواضع دفعة واحدة. هذا التباين الجوهري يُستثمر الآن في كامل منظومة خدمة النماذج اللغوية الكبيرة، من مُجدولات العتاد المخصّص إلى واجهات الاستدلال البرمجية، وبات أحد أهم ركائز التحسين في عصر نشر النماذج اللغوية الكبيرة.

المرجعLeviathan, Kalman, Matias. Fast Inference from Transformers via Speculative Decoding. ICML, 2023.

مصطلحات هذه الورقة