التشفير المضارب والنسر
Type: Build
Languages: Python (with numpy)
Prerequisites: Phase 10 Lesson 12 (Inference Optimization), Phase 10 Lesson 04 (Pre-training Mini-GPT)
Time: ~75 minutes
المشكلة
إن تسريع تشكيل نموذج من فئة 70B على H100 عادةً ما يكون 40-80 رمزًا في الثانية. يتطلب كل رمز مرورًا إلى الأمام كاملًا يقرأ جميع أوزان النموذج من HBM. لا يمكنك جعل النموذج أصغر دون تغيير خروجه. لا يمكنك زيادة حجم الحزمة خارج الذاكرة. أنت عالق إلا إذا تمكنت من السماح للنموذج بمخرج أكثر من رمز واحد لكل مرور إلى الأمام.
الجيل السريع يبدو بطبيعته سلسليةx_{t+1} = sample(p(· | x_{1:t}))ولكن هناك فرصة للتزامن. إذا كان لديك متنبؤ رخيص يقول "الربعة رموز التالية هي على الأرجح [a، b، c، d]" يمكنك التحقق من جميع المواقع الخمسة في a single forward pass of the big modelو تقبل أطول مُتطابقة المُستقبل
قام ليفياثان وكالاي وماتياس (2023 ، "التخفيف السريع من المحولات عبر التشخيص المضارب") بهذا الدقيق من خلال قاعدة قبول / رفض ذكية تحافظ على توزيع العينات للنموذج المستهدف. نفس توزيع الخروج ، 2-4 × أسرع.
المفهوم
الإعداد من النماذج الثنائية
- Target model
M_pالنموذج الكبير البطيء والجودة العالية التي تريد عينات منهاp(x). . . - Draft model
M_q: نموذج صغير سريع منخفض الجودة. التوزيع:q(x)5-30 × أصغر
لكل خطوة:
- مشروع النموذج المقترح
Kالـ " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "x_1, x_2, ..., x_K ~ q. . . - نموذج الهدف يستخدم واحد إلى الأمام عبر كل
K+1المواقع المتوازية، وتنتجp(x_k)لكل رمز مقترح - اقبل/رفض كل رمز من اليسار إلى اليمين من خلال قاعدة الرفض المعدلة أدناه. اقبل أطول ملحق المقبل.
- إذا تم رفض أي رمز، عينة البديل من التوزيع المصحّح ووقف. وإلا عينة واحدة من إعلانات الخصم من
p(· | x_1...x_K). . .
إذا كان المسودة تتطابق مع الهدف بشكل مثالي، تحصل على رموز K + 1 لكل هدف. إذا كان المسودة خاطئة في الموقف 1، تحصل فقط على رمزا 1.
قاعدة الدقة
التشفير المضارب هوprovably equivalent in distribution to sampling from pقاعدة الرفض:
For each drafted token x_t:
r ~ Uniform(0, 1)
if r < p(x_t) / q(x_t):
accept x_t
else:
sample replacement from residual: (p - q)+ / ||(p - q)+||_1
stopأين(p - q)+يرمز إلى الجزء الإيجابي من الفرق بين النقاط. عندما يتفق المسودة والهدف (p ≈ q) القبول هو تقريبا 1. عندما يختلفان، يتم بناء التوزيع المتبقية بحيث لا يزال العينة الكلية بالضبط p. . .
Greedy case.لقطة العينات من درجة الحرارة=0 فقط تحققargmax(p) == x_tإذا كان ذلك صحيحاً، فاقبل، وإذا كان لا، فانطلقargmax(p)و توقف
التسارع المتوقع
إذا كان معدل قبول النموذج المشروع على مستوى الرمز هو α، فإن الرموز المتوقعة التي يتم إنتاجها لكل مرسلة متقدمة هدف هي:
E[tokens] = (1 - α^{K+1}) / (1 - α) # K = draft length, α in [0, 1]فيα = 0.8, K = 4: (1 - 0.8^5)/(1 - 0.8) = 3.36الـ "Token" لكل مؤشر.cost_q K + cost_p(إثبات خطوات مسودة K بالإضافة إلى هدف واحد)cost_p >> cost_q Kنسبة تسريع هي 3.36× / 1 = 3.36×على التدفق
المعلم الحقيقي الوحيد هوα، والذي يعتمد بالكامل على التوصل إلى مسودة-هدف. مسودة جيدة هي كل شيء.
تدريب المشروع: التطهير
نموذج صغير عشوائي يُصنع مسودة سيئة، وصفة قياسية هي تقطيعها من الهدف:
- اختر معمارة صغيرة (~ 1B لهدف 70B، ~ 500M لهدف 7B).
- قم بتشغيل النموذج المستهدف على مجموعة كبيرة من النص؛ تخزين توزيعات الوهم التالي.
- قم بتدريب المسودة مع تباين KL ضد توزيع الهدف (وليس ضد رموز الحقيقة القائمة).
النتيجة:αعادةً 0.6-0.8 في التشفير، 0.7-0.85 في الدردشة باللغة الطبيعية. تسريع 2-3x في الإنتاج.
النسر: رسم الأشجار + إعادة استخدام الميزة
لاحظ لي ووي وجانغ وجانغ (2024، "إيغل: يتطلب العينات المضاربة إعادة التفكير في عدم اليقين الخاص") عدم كفاءة في فك التشفير المضاربي القياسي:
- يقدم المسودة خطوات تسلسلية K ، كل خطوة كاملة. ولكن يمكن للمسودة إعادة استخدام ميزات الهدف (الولايات المخفية) من أحدث التحقق من تمثيلات الغنية الحسابية التي قام بها الهدف بالفعل أن المسودة تستند مرة أخرى من الصفر.
- إن المسودة تنطلق سلسلة خطية. إذا كان يمكن للمسودة أن تنطلق شجرة من المرشحين (كل عقدة تخمينات متعددة) ، فإن مرور الهدف الواحد للأمام يمكن التحقق من مسارات المرشحين المتعددة بالتوازي عبر قناع مراقبة شجرة ، واختيار أطول فرع مقبول.
تغييرات في إيغل-1:
- مدخل مسودة = الحالة الخفية النهائية للهدف في الموقف t، وليس رموز خام.
- المخططات الهندسة المعمارية = 1 طبقة مُعدل مُعدل للمحول (ليس نموذج صغير منفصل).
- إنتاج = شجرة من K = 4-8 مرشحين لكل عمق، عمق 4-6.
إيجل-2 (2024) يضيف توبولوجيّة الأشجار الديناميكية: ينمو الشجرة أوسع حيث يكون المسح غير مؤكّد ويبقى ضيقًا حيث يكون واثقًا.α_effectiveدون زيادة تكلفة التحقق.
(Li et al. 2025، "EAGLE-3: زيادة تسريع الإدلاء على نماذج اللغة الكبيرة عبر اختبار وقت التدريب") يزيل اعتماد الميزات العليا الثابتة ويعمل على تدريب المسودة بخسارة جديدة "تحاكي وقت الاختبار" يرتفع معدل قبول من 0.75 (EAGLE-2) إلى 0.82 (EAGLE-3) ، ومتوسط الرموز / التحقق من 3.0 إلى 4.5.
التحقق من الاهتمام بالأشجار
عندما يخرج المسودة شجرة، يقوم النموذج المستهدف بتحققها في مرور واحد للأمام باستخدام tree attention maskقناع سببي يرمز أصل الشجرة بدلاً من خط نقي. كل رمز يقدم فقط لأجداده في الشجرة. يظل مرسل التحقق واحد إلى الأمام ، واحد ماتمول ؛ يكلّف قناع الأصل عدد قليل من إدخالات KV الإضافية فقط.
root
/ \
a b
/ \ / \
c d e fإذاa, bيتنافس المرشحون الأولين والتي تُحصل على الرمزc, d, e, fيتم التحقق من جميع المواقف الستة في مرور واحد إلى الأمام. الخروج هو أطول مقدمة على طول أي مسار مقبول.
عندما يفوز، عندما لا يفوز
Wins:
- دردشة / إكمال مع نص يمكن التنبؤ به (رمز، الإنجليزية المشتركة، الخروج المهيكلي).
αهو مرتفع. - الإعدادات مع حساب GPU غير المستخدم أثناء فك الرمز (مرحلة مقيدة بالذاكرة). استخدام رسم الأشجار FLOPs المتاحة.
Loses / no win:
- نتائج متوقعة للغاية (الكتبة الإبداعية عند درجة حرارة عالية).
αينخفض نحو1/|vocab|. . . - الحزمة التي تقدم مع التزامن عالية جدا الحزمة تملأ بالفعل FLOPs، فليس هناك مجال للتحقق من الأشجار.
- طرازات هدف صغيرة جدا حيث لا يكون المسودة أصغر بكثير.
عادة ما تُبلغ متاجر الإنتاج عن تسريع الساعة الجدارية 2-3x على الدردشة، و 3-5x على إنتاج الرموز، و 0 تقريباً على الكتابة الإبداعية.
بناءها
code/main.py:
- مرجع
speculative_decode(target, draft, prompt, K, temperature)التي تنفذ قاعدة الرفض الدقيقة وتحقق من أنها تحافظ على توزيع الهدف ( KL < 0.01 بمقارنة بعينات عينات الهدف العادي). - شكل شجرة النسر التي تبني شجرة عمق K مع فرع أعلى.
- مُصنع قناع الاهتمام للشجرة الذي ينتج النمط السببي المناسب للمؤكد
- حزمة معدل قبول تعمل على كلتا الحدود الصغيرة (تقطيع واحد GPT-2-صغير من هدف GPT-2- المتوسط).
pythondef speculative_step(p_target, q_draft, K, temperature=1.0):
"""One round of speculative decoding. Returns list of accepted tokens."""
# 1. Draft K tokens
draft_tokens = []
q_probs = []
state = draft_state_init()
for _ in range(K):
probs = softmax(q_draft(state) / temperature)
t = np.random.choice(len(probs), p=probs)
draft_tokens.append(t)
q_probs.append(probs[t])
state = draft_step(state, t)
# 2. Target computes p at every drafted position + 1 extra
p_probs_all = target_forward_batched(p_target, draft_tokens, temperature)
# 3. Accept/reject left-to-right
accepted = []
for k, tok in enumerate(draft_tokens):
r = np.random.uniform()
if r < p_probs_all[k][tok] / q_probs[k]:
accepted.append(tok)
else:
residual = np.maximum(p_probs_all[k] - q_probs[k], 0)
residual /= residual.sum()
accepted.append(np.random.choice(len(residual), p=residual))
return accepted
# 4. All K accepted → sample bonus token from target
accepted.append(np.random.choice(len(p_probs_all[-1]), p=p_probs_all[-1]))
return acceptedاستخدمها
- vLLMوSGLangفي vLLM، اجتياز
--speculative-configكائن JSON معmethod،modelوnum_speculative_tokens؛ الـ 3 هي"method": "eagle3". . . - NVIDIA TensorRT-LLMيدعم شجرة ميدوسا و شجرة النسر بشكل أصلي
- Reference draft models:
Qwen/Qwen3-0.6B(مصادر قوانين 32-32ب) ،meta-llama/Llama-3.2-1B-Instruct(مصادر للاما 3.x 70B) - Medusa heads(Cai et al. 2024, "Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads"): بدلاً من مشروع نموذج، أضف رؤوس تنبؤ متوازية K إلى الهدف نفسه. أبسط في النشر، وقبول أقل قليلاً من EAGLE.
أرسله
هذا الدرس يُنتجoutputs/skill-speculative-tuning.md مهارة تحدد تحديد حجم العمل للنموذج المستهدف وتختار: نموذج مشروع، K (طول مشروع) ، عرض الشجرة، درجة الحرارة، ومتى يجب أن يعود إلى عملية فك الرمز.
التمارين
- تنفيذ قاعدة الرفض الدقيقة والتحقق من ذلك تجريبيا.
speculative_decodeو عن طريق أخذ عينات واضحة للمستهدف؛ حساب المسافة التلفزيونية بين توزيعات المخرجين. يجب أن يكون < 0.01.
- احسب صيغة تسريع
αوK، رسم الرموز المتوقعة لكل هدف-مضي قدما. العثور على الكمية المثلى ل α ∈ {0.5 ، 0.7 ، 0.9}.
- قم بتدريب مسودة صغيرة، خذ هدف 124 مليون جبت-2 وقطع مسودة 30 مليون جبت-2 على رموز 100 مليون مع خسارة KL.
αعلى النص المُتَمَرّد. المتوقع: 0.6-0.7.
- قم بتنفيذ رسم شجرة على طراز EAGLE. بدلاً من سلسلة، قم بتقديم مسودة الخروج لأعلى 3 فروع في كل عمق. قم ببناء قناع مراقبة الشجرة. تحقق من قبول الهدف لأطول فروع صحيحة.
- قياس أوضاع الفشل. تشغيل فك التفكير عند درجة حرارة = 1.5 (استوكاستية عالية). عرض α ينهار والخوارزمية بطيئة من فك العادي بسبب مسودة التكلفة العليا.
الشروط الرئيسية
| Term | What people say | What it actually means |
|---|---|---|
| Target model | "The big model" | The slow, high-quality model you want samples from (p distribution) |
| Draft model | "The speculator" | The small, fast predictor (q distribution); 5-30x smaller |
| K / draft length | "Look-ahead" | Number of speculated tokens per verify pass |
| α / acceptance rate | "Hit rate" | Per-token probability that the draft's proposal is accepted |
| Exact rejection rule | "The accept test" | r < p/q compare that preserves target's distribution |
| Residual distribution | "Corrected p-q" | (p - q)+ / |
| Tree drafting | "Branching speculation" | Draft outputs a tree of candidates, verified in one pass with tree-structured attention mask |
| Tree attention mask | "Topological mask" | Causal mask encoding the tree topology so each node attends only to its ancestors |
| Medusa heads | "Parallel heads" | K extra prediction heads on the target itself; no separate draft model |
| EAGLE feature reuse | "Hidden-state draft" | Draft input is target's last hidden state, not raw tokens, shrinking the draft |
| Test-time simulation loss | "EAGLE-3 training" | Train draft on outputs matching target's test-time distribution, not teacher forcing |
المزيد من القراءة
- Leviathan, Kalai, Matias, 2023 — "Fast Inference from Transformers via Speculative Decoding" قاعدة الرفض الدقيقة وتحليل السرعة النظرية
- Chen, Borgeaud, Irving et al., 2023 — "Accelerating Large Language Model Decoding with Speculative Sampling" ورقة استنتاج عينات متزايدة في DeepMind
- Cai, Li, Geng, Wang, Wang, Zhu, Dao, 2024 — "Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads" البدائل المتوازية للنموذج المخطط
- Li, Wei, Zhang, Zhang, 2024 — "EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty" إعادة استخدام الميزات وصياغة الأشجار
- Li et al., 2024 — "EAGLE-2: Faster Inference of Language Models with Dynamic Draft Trees" توبولوجيات الأشجار الديناميكية
- Li et al., 2025 — "EAGLE-3: Scaling up Inference Acceleration of Large Language Models via Training-Time Test" توازن الوقت الاختبار في الوقت المتعلق بالقطار
- Fu, Haotian, Peng et al., 2024 — "Break the Sequential Dependency of LLM Inference Using Lookahead Decoding" تشفير جاكوبي/لوكا هيد، بديل خالي من المضاربين
This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.
Browse the complete course catalog or open this lesson on GitHub.