تولید متن در مدلهای زبانی بزرگ ذاتاً فرایندی ترتیبی است؛ برای ساخت هر توکن باید یک گذر کامل محاسباتی روی کل وزنهای مدل اجرا شود که در مدلهای سنگین مانند کلاس 70B بخش زیادی از پهنای باند حافظه را قفل میکند. از طرفی تهیه و اجارهی کارتهای گرافیک حرفهای یا دسترسی به زیرساختهای ابری به دلیل موانع پرداخت ارزی و محدودیتهای دسترسی برای مهندسان ایرانی دشوار و پرهزینه است؛ بنابراین بهرهوری حداکثری از منابع سختافزاری و شتابدهی به خروجی مدلها اهمیت دوچندانی پیدا میکند.
دیکودینگ حدسی (Speculative Decoding) و راهکارهای پیشرفتهای مانند EAGLE این گلوگاه را هدف قرار میدهند: یک مدل کوچکتر توکنهای بعدی را تخمین میزند و مدل بزرگتر تنها با یک گذر رو به جلو چند حدس را همزمان اعتبارسنجی میکند. با این روش، سرعت استنتاج 2 تا 4 برابر بیشتر میشود بدون آنکه توزیع ریاضی یا کیفیت نهایی مدل ذرهای تغییر کند.
وقتی یک مدل زبانی بزرگ پیشرو (frontier LLM) میخواهد فقط یک توکن تولید کند، باید یک گذر رو به جلو (forward pass) کامل روی میلیاردها پارامتر اجرا شود. این گذر رو به جلو بهشدت بیش از نیازِ واقعی منابع مصرف میکند: در بیشتر مواقع، یک مدل بسیار کوچکتر هم میتواند 3 تا 5 توکن بعدی را درست حدس بزند، و مدل بزرگ صرفاً باید آن حدسها را اعتبارسنجی (verify) کند. اگر حدس درست باشد، عملاً با هزینهی پردازش یک توکن، 5 توکن به دست آوردهاید. دیکودینگ حدسی (Speculative Decoding؛ لویاتان و همکاران، 2023) این فرایند را بدون تغییر در توزیع خروجی ممکن کرد، و مدل EAGLE-3 (سال 2025) نرخ پذیرش را به حدود 4.5 توکن در هر مرحلهی اعتبارسنجی رساند؛ یعنی 4 تا 5 برابر افزایش سرعت با همان توزیع آماری خروجی.
صورت مسئله
نرخ پردازش دیکود برای مدلی در کلاس 70B روی H100 معمولاً بین 40 تا 80 توکن در ثانیه است. تولید هر توکن به یک گذر رو به جلوی کامل نیاز دارد که باید تمام وزنهای مدل را از حافظهی HBM بخواند. از یک طرف نمیتوانید مدل را کوچکتر کنید، چون کیفیت خروجیاش تغییر میکند؛ از طرف دیگر هم نمیتوانید اندازهی دسته (batch size) را فراتر از ظرفیت حافظه بالا ببرید. در نتیجه به بنبست میخورید؛ مگر اینکه ترتیبی دهید تا مدل در هر گذر رو به جلو، بیش از یک توکن تولید کند.
فرایند تولید خودبازگشتی (autoregressive) در ظاهر ذاتاً ترتیبی است: x_{t+1} = sample(p(· | x_{1:t})). اما یک فرصت برای پردازش همروند وجود دارد. اگر پیشبینیکنندهی کمهزینهای داشته باشید که بگوید «احتمالاً 4 توکن بعدی عبارتند از [a, b, c, d]»، میتوانید در تنها یک گذر رو به جلوی مدل بزرگ، هر 5 موقعیت را موازی اعتبارسنجی کنید و طولانیترین پیشوندِ تطبیقیافته را بپذیرید.
لویاتان، کالای و ماتیاس (2023، در مقالهی «Fast Inference from Transformers via Speculative Decoding») با یک قاعدهی پذیرش/رد هوشمندانه که توزیع نمونهگیری مدل هدف را دقیقاً حفظ میکند، این ایده را به فرمولی دقیق و قطعی تبدیل کردند؛ همان توزیع خروجی، اما 2 تا 4 برابر سریعتر.
مفاهیم پایه
ساختار دو مدلی
- مدل هدف (
M_p): همان مدل بزرگ، کند و باکیفیتی که واقعاً میخواهید از آن خروجی بگیرید. توزیع:p(x). - مدل پیشنویس (
M_q): مدلی کوچک، سریع و با کیفیت پایینتر که 5 تا 30 برابر کوچکتر است. توزیع:q(x).
در هر گام:
- مدل پیشنویس بهصورت خودبازگشتی
Kتوکن پیشنهاد میدهد:x_1, x_2, ..., x_K ~ q. - مدل اعتبارسنج یک گذر رو به جلو را بهطور موازی روی تمام
K+1موقعیت اجرا میکند و مقدارp(x_k)را برای هر توکن پیشنهادی به دست میآورد. - از چپ به راست، با قاعدهی نمونهگیری طردی (rejection sampling) اصلاحشدهی زیر، هر توکن پذیرفته یا رد میشود. طولانیترین پیشوندِ تطبیقیافته پذیرفته خواهد شد.
- اگر توکنی رد شود، توکن جایگزین از توزیع تصحیحشده نمونهگیری میشود و کار به پایان میرسد. در غیر این صورت، یک توکن پاداش (Bonus Token) اضافه از
p(· | x_1...x_K)نمونهگیری خواهد شد.
اگر مدل پیشنویس رفتار مدل هدف را بینقص تقلید کند، به ازای هر گذر رو به جلوی مدل هدف، K+1 توکن به دست میآورید. اگر پیشنویس در همان موقعیت اول اشتباه کند، خروجی شما تنها 1 توکن خواهد بود.
قاعدهی انطباق دقیق توزیع
دیکودینگ حدسی از نظر آماری و ریاضیاتی اثباتپذیر است که دقیقاً با نمونهگیری از توزیع 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 است. وقتی با هم اختلاف داشته باشند، توزیع باقیمانده (Residual Distribution) طوری ساخته میشود که توزیع نمونهگیری کلی همچنان دقیقاً برابر با p باقی بماند.
حالت حریصانه (Greedy): برای نمونهگیری با دمای صفر (temperature=0)، فقط بررسی کنید که آیا argmax(p) == x_t هست یا نه. اگر بود بپذیرید؛ اگر نبود، argmax(p) را خروجی دهید و کار را متوقف کنید.
شتاب مورد انتظار
اگر نرخ پذیرش توکن در مدل پیشنویس برابر با α باشد، امید ریاضی تعداد توکنهای تولیدشده به ازای هر گذر رو به جلوی مدل هدف چنین خواهد بود:
به ازای α = 0.8 و K = 4: حاصل فرمول (1 - 0.8^5)/(1 - 0.8) = 3.36 توکن به ازای هر گذر رو به جلو است. هزینهی یک گذر مدل هدف تقریباً برابر با cost_q * K + cost_p است (K گام پیشنویس بهعلاوهی یک اعتبارسنجی مدل هدف). اگر cost_p >> cost_q * K باشد، نسبت شتاب در نرخ پردازش به 3.36× / 1 = 3.36× میرسد.
تنها متغیر واقعی در اینجا α است که کاملاً به میزان همسویی مدل پیشنویس با مدل هدف بستگی دارد. همهچیز در گرو داشتن یک مدل پیشنویس خوب است.
آموزش مدل پیشنویس: تقطیر دانش
استفاده از یک مدل کوچکِ تصادفی، پیشنویس ضعیفی تحویل میدهد. روش استاندارد، تقطیر دانش (Distillation) از مدل هدف است:
- معماری کوچکی انتخاب کنید (حدود 1B برای مدل هدف 70B، و حدود 500M برای مدل هدف 7B).
- مدل هدف را روی پیکرهی متنی بزرگی اجرا کنید و توزیعهای توکن بعدی آن را ذخیره نمایید.
- مدل پیشنویس را با استفاده از واگرایی کولبک-لایبلر (KL Divergence) نسبت به توزیع مدل هدف (نه نسبت به توکنهای واقعی متن) آموزش دهید.
نتیجه: مقدار α معمولاً در کدنویسی به 0.6 تا 0.8 و در مکالمه به زبان طبیعی به 0.7 تا 0.85 میرسد؛ یعنی 2 تا 3 برابر شتاب در محیط عملیاتی (production).
روش EAGLE: پیشنویس درختی + استفادهی مجدد از ویژگیها
لی، وی، ژانگ و ژانگ (2024، در مقالهی «EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty») متوجه دو ناکارآمدی در دیکودینگ حدسی استاندارد شدند:
- مدل پیشنویس K گام متوالی را با پشتهی کامل لایهها طی میکند. در حالی که پیشنویس میتواند از ویژگیها (وضعیتهای پنهان یا همان Hidden states) مدل هدف در آخرین مرحلهی اعتبارسنجی دوباره استفاده کند؛ مدل هدف قبلاً این بازنماییهای غنی را محاسبه کرده است و پیشنویس نباید آنها را از صفر بازسازی کند.
- مدل پیشنویس یک زنجیرهی خطی خروجی میدهد. اگر بتواند یک درخت از کاندیداها بسازد (هر گره شامل چند حدس مختلف)، مدل هدف میتواند در یک گذر رو به جلو و با کمک یک ماسک اتنشن درختی (Tree Attention mask)، چند مسیر کاندید را بهطور همزمان اعتبارسنجی کند و طولانیترین شاخهی (branch) پذیرفتهشده را بردارد.
نوآوریهای EAGLE-1:
- ورودی مدل پیشنویس، آخرین وضعیت پنهان مدل هدف در موقعیت t است، نه توکنهای خام.
- معماری پیشنویس فقط 1 لایهی دیکودر ترنسفورمر (Transformer) است (نه یک مدل کوچک مستقل).
- خروجی یک درخت است که به ازای هر سطح عمق، K = 4-8 کاندیدا دارد و عمق آن بین 4 تا 6 است.
روش EAGLE-2 (سال 2024) ساختار درختی پویا را اضافه کرد: هر جا پیشنویس نامطمئن است درخت شاخهشاخه و پهنتر میشود، و هر جا اطمینان دارد باریک میماند. این کار بدون بالا بردن هزینهی اعتبارسنجی، نرخ پذیرش مؤثر (α_effective) را افزایش میدهد.
روش EAGLE-3 (لی و همکاران، 2025، «EAGLE-3: Scaling up Inference Acceleration of Large Language Models via Training-Time Test») وابستگی ثابت به ویژگیهای لایهی آخر را حذف کرد و پیشنویس را با یک تابع زیان (loss) جدید به نام «شبیهسازی زمان آزمون» آموزش داد. در این روش، پیشنویس روی خروجیهایی آموزش میبیند که منطبق بر توزیع مدل هدف در زمان آزمون (test-time) است، نه توزیع وادارسازی معلم (Teacher forcing) در زمان آموزش. در نتیجه نرخ پذیرش از 0.75 در EAGLE-2 به 0.82 در EAGLE-3 و میانگین توکن بر اعتبارسنجی از 3.0 به 4.5 رسید.
اعتبارسنجی با اتنشن درختی
وقتی پیشنویس یک درخت خروجی میدهد، مدل هدف آن را در یک گذر رو به جلو و با کمک ماسک اتنشن درختی بررسی میکند؛ یک ماسک علّی (Causal Mask) که توپولوژی درخت را بهجای یک خط ساده کدگذاری میکند. هر توکن فقط به اجداد خود در درخت اتنشن دارد. مرحلهی اعتبارسنجی همچنان یک گذر و یک ضرب ماتریسی است؛ ماسک توپولوژیک صرفاً چند درایهی اضافه در حافظهی KV هزینه برمیدارد.
root
/ \
a b
/ \ / \
c d e f
اگر a, b کاندیداهای رقیب برای اولین توکن، و c, d, e, f کاندیداهای توکن دوم باشند، هر شش موقعیت در یک گذر رو به جلو اعتبارسنجی میشوند. خروجی کار، طولانیترین پیشوند در طول هر مسیرِ پذیرفتهشده است.
کجا برنده است، کجا نه؟
موارد موفقیت:
- چت یا تکمیل متن با ساختار قابل پیشبینی (کد، متنهای رایج انگلیسی، خروجیهای ساختاریافته). در این سناریوها
αبالاست. - شرایطی که محاسبات GPU حین فرایند دیکود بدون استفاده میماند (فاز محدود به پهنای باند حافظه). پیشنویس درختی از ظرفیت پردازشی باقیمانده (FLOPs) بهخوبی بهره میبرد.
موارد شکست یا بدون فایده:
- خروجیهای بسیار تصادفی (نوشتن خلاقانه با دمای بالا). در این حالت مقدار
αبه سمت1/|vocab|افت میکند. - سرویسدهی دستهای با همروندی بسیار بالا؛ دستهبندی سنگین خودش FLOPs را پر میکند و جایی برای اعتبارسنجی درختی باقی نمیماند.
- مدلهای هدف بسیار کوچک که مدل پیشنویس تفاوت اندازهی چندانی با آنها ندارد.
تیمهای فنی در محیطهای واقعی معمولاً از شتاب زمانی (wall-clock speedup) 2 تا 3 برابری در چت، 3 تا 5 برابری در تولید کد و تقریباً صفر در نویسندگی خلاقانه گزارش میدهند.
پیادهسازی از صفر
فایل code/main.py:
- یک تابع مرجع به نام
speculative_decode(target, draft, prompt, K, temperature)که قاعدهی دقیق طرد را پیاده میکند و نشان میدهد توزیع مدل هدف دستنخورده باقی میماند (بررسی اینکه واگرایی تجربی KL در مقایسه با نمونهگیری سادهی مدل هدف کمتر از 0.01 باشد). - یک سازندهی پیشنویس درختی به سبک EAGLE که درختی به عمق K با شاخهبندی بر اساس top-p میسازد.
- یک سازندهی ماسک اتنشن درختی که الگوی علّی مناسب را برای مدل اعتبارسنج ایجاد میکند.
- یک ابزار ارزیابی نرخ پذیرش که هر دو حالت را روی مدلی کوچک اجرا میکند (تقطیر یک مدل GPT-2-small از مدل هدف GPT-2-medium).
def speculative_step(p_target, q_draft, K, temperature=1.0):
"""One round of speculative decoding. Returns list of accepted tokens."""
# 1. پیشنویس K توکن
draft_tokens = []
q_dists = []
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_dists.append(probs)
state = draft_step(state, t)
# 2. مدل هدف p را در هر موقعیت پیشنویسشده + 1 موقعیت اضافی محاسبه میکند
p_probs_all = target_forward_batched(p_target, draft_tokens, temperature)
# 3. پذیرش/رد از چپ به راست
accepted = []
for k, tok in enumerate(draft_tokens):
r = np.random.uniform()
if r < p_probs_all[k][tok] / q_dists[k][tok]:
accepted.append(tok)
else:
residual = np.maximum(p_probs_all[k] - q_dists[k], 0)
residual /= residual.sum()
accepted.append(np.random.choice(len(residual), p=residual))
return accepted
# 4. پذیرش تمام K توکن ← نمونهبرداری توکن پاداش از مدل هدف
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بدهید؛ برای EAGLE-3 باید مقدار آن را"method": "eagle3"بگذارید. - فریمورک NVIDIA TensorRT-LLM از درختهای Medusa و EAGLE بهصورت بومی پشتیبانی میکند.
- مدلهای پیشنویس مرجع: مدل
Qwen/Qwen3-0.6B(پیشنویس برای Qwen3-32B) و مدلmeta-llama/Llama-3.2-1B-Instruct(پیشنویس برای Llama 3.x 70B). - سرهای مدوسا (Medusa heads) (کای و همکاران، 2024، در مقالهی «Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads»): بهجای استفاده از یک مدل پیشنویس مجزا، K سر پیشبینی موازی به خودِ مدل هدف اضافه میشود. استقرار این روش سادهتر است، ولی نرخ پذیرش آن کمی پایینتر از EAGLE خواهد بود.
خروجی این درس
این درس سند outputs/skill-speculative-tuning.md را تولید میکند؛ مهارتی که بار کاری یک مدل هدف را تحلیل میکند و مواردی چون مدل پیشنویس، K (طول پیشنویس)، عرض درخت، دما، و زمان مناسب برای بازگشت به دیکود معمولی را انتخاب مینماید.
تمرینها
-
قاعدهی دقیق نمونهگیری طردی را پیاده کنید و درستیِ آماری آن را بسنجید. 10 هزار نمونه را از طریق
speculative_decodeو همچنین نمونهگیری مستقیم مدل هدف تولید کنید؛ سپس فاصلهی تغییرات کل (TV distance) را بین دو توزیع خروجی به دست آورید. این مقدار باید کمتر از 0.01 باشد. -
فرمول شتاب را محاسبه کنید. به ازای مقادیر ثابت
αوK، نمودار توکنهای مورد انتظار در هر گذر رو به جلوی مدل هدف را رسم کنید. مقدار بهینهی را برای پیدا کنید. -
یک پیشنویس کوچک آموزش دهید. یک مدل هدف GPT-2 با اندازهی 124M بردارید و با تابع زیان KL، یک مدل پیشنویس GPT-2 با اندازهی 30M را روی 100 میلیون توکن تقطیر کنید. نرخ
αرا روی دادههای ارزیابی (held-out) بسنجید. مقدار مورد انتظار: 0.6 تا 0.7 است. -
پیشنویس درختی به سبک EAGLE را پیاده کنید. بهجای زنجیره، کاری کنید که پیشنویس در هر عمق، 3 شاخهی برتر (top-3) را خروجی دهد. ماسک اتنشن درختی را بسازید و بررسی کنید که مدل هدف طولانیترین شاخهی درست را بپذیرد.
-
حالتهای شکست (Failure modes) را ارزیابی کنید. دیکودینگ حدسی را در دمای بالا (مثلاً temperature=1.5) اجرا کنید. نشان دهید که چطور α بهشدت افت میکند و الگوریتم به دلیل بار پردازشی اضافهی مدل پیشنویس، از دیکود ساده نیز کندتر میشود.
اصطلاحات کلیدی
| اصطلاح | در گفتگوهای عامیانه | معنای دقیق فنی |
|---|---|---|
| Target model (مدل هدف) | «مدل بزرگ» | مدل کند و باکیفیتی که میخواهید نمونهها از آن گرفته شود (توزیع p) |
| Draft model (مدل پیشنویس) | «پیشبینیکننده» | مدل کوچک و سریع پیشبینیکننده (توزیع q)؛ بین 5 تا 30 برابر کوچکتر |
| K / draft length (طول پیشنویس) | «نگاهبهجلو» | تعداد توکنهای حدسزدهشده در هر گذر اعتبارسنجی |
| α / acceptance rate (نرخ پذیرش) | «نرخ اصابت» | احتمال تأیید و پذیرفتهشدن هر یک از توکنهای پیشنهادی پیشنویس |
| Exact rejection rule (قاعدهی طرد دقیق) | «آزمون پذیرش» | مقایسهی r < p/q که موجب حفظ توزیع آماری مدل هدف میشود |
| Residual distribution (توزیع باقیمانده) | «تفاضل تصحیحشدهی p-q» | رابطهی (p - q)+ / |
| Tree drafting (پیشنویس درختی) | «حدس شاخهای» | پیشنویس درختی از کاندیداها میسازد که همگی در یک گذر مدل هدف و با ماسک اتنشن درختی ارزیابی میشوند |
| Tree attention mask (ماسک اتنشن درختی) | «ماسک ساختاری» | ماسکی علّی که ساختار درخت را کدگذاری میکند تا هر گره فقط به اجداد خود اتنشن داشته باشد |
| Medusa heads (سرهای مدوسا) | «سرهای موازی» | افزودن K سر پیشبینی اضافه به خودِ مدل هدف؛ بدون نیاز به مدل پیشنویس مجزا |
| EAGLE feature reuse (استفادهی مجدد از ویژگیها) | «پیشنویس با وضعیت پنهان» | ورودی مدل پیشنویس آخرین وضعیت پنهان مدل هدف است نه توکنهای خام؛ این امر مدل پیشنویس را بسیار کوچکتر میکند |
| Test-time simulation loss (زیان شبیهسازی زمان آزمون) | «آموزش به روش EAGLE-3» | آموزش پیشنویس روی خروجیهایی که با توزیع زمان آزمون مدل هدف همخوانی دارند، نه با وادارسازی معلم |
برای مطالعهی بیشتر
- لویاتان، کالای، ماتیاس، 2023 — «Fast Inference from Transformers via Speculative Decoding» — مقالهی مرجع قاعدهی طرد دقیق و تحلیل نظری شتاب زمانی
- چن، بورگود، ایروینگ و همکاران، 2023 — «Accelerating Large Language Model Decoding with Speculative Sampling» — مقالهی همزمان دیپمایند روی نمونهگیری حدسی
- کای، لی، گنگ، وانگ، وانگ، ژو، دائو، 2024 — «Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads» — ارائهی روش سرهای موازی بهجای مدل پیشنویس مجزا
- لی، وی، ژانگ، ژانگ، 2024 — «EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty» — استفادهی مجدد از ویژگیها و ساختار پیشنویس درختی
- لی و همکاران، 2024 — «EAGLE-2: Faster Inference of Language Models with Dynamic Draft Trees» — ساختار پویای درخت پیشنویس
- لی و همکاران، 2025 — «EAGLE-3: Scaling up Inference Acceleration of Large Language Models via Training-Time Test» — انطباق توزیع آموزش با زمان آزمون
- فو، هاوتیان، پنگ و همکاران، 2024 — «Break the Sequential Dependency of LLM Inference Using Lookahead Decoding» — روش دیکودینگ ژاکوبی/نگاهبهجلو بهعنوان جایگزینی بینیاز از مدل پیشنویس
