تولید متن در مدلهای زبانی بزرگ ماهیتی ترتیبی و خودبازگشتی دارد؛ یعنی برای تولید هر کلمه باید تمام محاسبات سنگین مدل از ابتدا تا انتها تکرار شود. این موضوع در مدلهای سنگین باعث افت محسوس سرعت و افزایش شدید زمان پاسخدهی به کاربر نهایی میشود. از طرفی تهیه و اجارهی کارتهای گرافیکی مدرن مثل H100 هزینههای سرسامآوری دارد و بهرهوری حداکثری از پردازنده در زمان استنتاج یک ضرورت مهندسی است.
دیکودینگ گمانهزن (Speculative Decoding) یکی از مهمترین تکنیکهای روز برای حل این گلوگاه است. در این روش یک مدل فوقالعاده کوچک و سریع چند توکن را جلوتر پیشنهاد میدهد و مدل بزرگ اصلی همهی آنها را در یک رفت محاسباتی ارزیابی میکند. با این کار، بدون افت دقت یا کیفیت متن تولیدی، سرعت استنتاج بین 2 تا 4 برابر بیشتر میشود.
دیکودینگ خودبازگشتی (autoregressive decoding) کاملاً ترتیبی است؛ هر توکن باید منتظر توکن قبلی بماند. دیکودینگ گمانهزن (speculative decoding) این زنجیره را میشکند: یک مدل سبک N توکن را پیشنویس میکند و مدل اصلی و سنگین، همهی این N توکن را در یک گذر رو به جلو (forward pass) اعتبارسنجی میکند. اگر پیشنویس درست باشد، بهازای یک گذر سنگین، N توکن به دست آوردهاید.
صورت مسئله
نمونهگیری یک توکن در یک مدل زبانی بزرگ 70B روی یک پردازندهی H100 حدود 30 میلیثانیه زمان میبرد. همین کار روی یک مدل پیشنویس 3B تنها حدود 3 میلیثانیه طول میکشد. اگر بگذاریم مدل 3B پنج توکن جلوتر را پیشنویس کند و سپس مدل 70B را فقط یک بار برای بررسی هر 5 توکن اجرا کنیم، کل زمان پردازش به میلیثانیه برای حداکثر 5 توکن پذیرفتهشده میرسد؛ در مقایسه با 5×30 = 150 ms در حالت تولید خطی توکنها. تمام ایده و جذابیت دیکودینگ گمانهزن در همین است: اختصاص بخش کوچکی از حافظهی گرافیکی (VRAM) به مدل پیشنویس در ازای کاهش 2 تا 4 برابری تاخیر (latency) دیکودینگ.
نکتهی کلیدی این روش، حفظ توزیع آماری است. نمونهگیری گمانهزن که لویاتان و همکاران (2023) و بهطور همزمان چن و همکاران آن را معرفی کردند، تضمین میکند که توالی خروجی، دقیقاً دارای همان توزیع آماری است که خود مدل بزرگ بهتنهایی تولید میکرد. هیچ افت کیفیتی در کار نیست؛ فقط سرعت بالاتر میرود.
چهار خانواده از ترکیبهای «پیشنویس–اعتبارسنج» در استنتاج سال 2026 پیشتازند:
- گمانهزنی کلاسیک (Leviathan 2023): یک مدل پیشنویس مجزا (مثل Llama 3 1B) بههمراه مدل اعتبارسنج (مثل Llama 3 70B).
- مدوزا (Cai 2024 - Medusa): چند سر (head) دیکودینگ روی خود اعتبارسنج، موقعیتهای
t+1..t+kرا بهصورت موازی پیشبینی میکنند. نیازی به مدل پیشنویس مجزا نیست. - خانوادهی EAGLE (Li 2024, 2025): مدل پیشنویس سبکی که از وضعیتهای پنهان (hidden states) مدل اعتبارسنج دوباره استفاده میکند؛ نرخ پذیرش نزدیکتری نسبت به روش کلاسیک دارد و معمولاً سرعت را 3 تا 4 برابر میکند.
- دیکودینگ نگاهبهجلو (Fu 2024 - Lookahead decoding): مبتنی بر تکرار ژاکوبی (Jacobi iteration)؛ اصلاً نیازی به مدل پیشنویس ندارد. نوعی خودگمانهزنی است؛ کاربرد خاصتری دارد اما بدون هیچ وابستگی خارجی اجرا میشود.
در سال 2026، تمام استکهای استنتاج عملیاتی بهطور پیشفرض با دیکودینگ گمانهزن عرضه میشوند. ابزارهای vLLM، TensorRT-LLM، SGLang و llama.cpp همگی دستکم از روش کلاسیک و EAGLE-2 پشتیبانی میکنند.
مفاهیم پایه
الگوریتم اصلی
فرض کنید مدل اعتبارسنج و مدل پیشنویس سبکتر را در اختیار داریم:
- فرض کنید پیشوندی باشد که تا اینجا دیکود شده است.
- پیشنویس: با استفاده از ، بهصورت خودبازگشتی توکنهای را همراه با احتمالهای پیشنویس پیشنهاد دهید.
- اعتبارسنجی موازی: مدل را یک بار روی اجرا کنید تا احتمالهای اعتبارسنج را برای موقعیتهای به دست آورید.
- پذیرش یا رد هر توکن پیشنویس از چپ به راست: برای هر ، آن را با احتمال بپذیرید.
- در اولین رد در موقعیت : توکن را از توزیع «باقیمانده» (residual distribution) نرمالایزشدهی نمونهگیری کنید. تمام توکنهای پیشنویس بعد از دور ریخته میشوند.
- در صورت پذیرش همهی توکن: یک توکن اضافه از توزیع نمونهگیری کنید (توکن پاداش رایگان).
تکنیک توزیع باقیمانده همان بینش ریاضی دقیقی است که باعث میشود خروجی دقیقاً طوری توزیع شود که انگار از ابتدا خودش نمونهگیری کرده است.
عوامل تعیینکنندهی افزایش سرعت
فرض کنید = نرخ پذیرش مورد انتظار بهازای هر توکن پیشنویس باشد. همچنین فرض کنید = نسبت هزینهی مدل پیشنویس به اعتبارسنج باشد. در هر گام:
- در تولید معمولی، بهازای هر توکن 1 بار مدل بزرگ فراخوانی میشود.
- در روش گمانهزن، وقتی بالا باشد، بهازای هر توکن فقط 1 بار مدل بزرگ فراخوانی میشود.
یک قاعدهی سرانگشتی در شرایط و : فراخوانیهای مدل بزرگ 3 برابر کمتر میشود. هزینهی پیشنویس هم 5 برابر کمتر است. در نتیجه زمان کل اجرا (wall-clock time) حدود 2.5 برابر کاهش مییابد.
به این عوامل وابسته است:
- کیفیت تقریب مدل پیشنویس نسبت به اعتبارسنج. معماری یکسان یا دادههای آموزشی مشترک، را به شکل چشمگیری افزایش میدهد.
- استراتژی دیکودینگ. پیشنویس حریصانه (greedy) در برابر اعتبارسنج حریصانه: بالا. نمونهگیری با دما (temperature): تطبیق دشوارتر و افت نرخ پذیرش.
- نوع تسک. کدنویسی و خروجیهای ساختاریافته نرخ پذیرش بالاتری دارند (چون قابلپیشبینیترند)؛ متنهای خلاقانه و آزاد نرخ پذیرش کمتری دارند.
مدوزا — پیشنویس بدون مدل مجزا
مدوزا بهجای مدل پیشنویس، چند سر خروجی اضافی به اعتبارسنج اضافه میکند. در موقعیت t:
shared trunk → hidden h_t
├── head_0: predict token at t+1 (standard LM head)
├── head_1: predict token at t+2
├── head_2: predict token at t+3
├── head_3: predict token at t+4
هر سر لاجیتهای (logits) خودش را تولید میکند. در زمان استنتاج، از هر سر یک مقدار نمونهگیری میکنید تا یک توالی کاندید به دست آید؛ سپس با یک گذر رو به جلو و با استفاده از مکانیزم اتنشن درختی (tree attention) که تمام ادامههای کاندید را یکجا میسنجد، درستی آن را ارزیابی میکنید.
مزایا: نیازی به مدل دوم نیست. معایب: پارامترهای قابل آموزش اضافه میکند؛ به یک مرحله فاینتیونینگ نظارتشده (حدود 1 میلیارد توکن) نیاز دارد؛ و نرخ پذیرش آن کمی از روش گمانهزنی کلاسیک با یک مدل پیشنویس خوب پایینتر است.
مدل EAGLE — پیشنویس بهتر با استفادهی مجدد از وضعیتهای پنهان
در EAGLE-1/2/3 (Li et al., 2024–2025)، مدل پیشنویس در واقع یک ترنسفورمر بسیار کوچک (معمولاً 1 لایه) است که وضعیتهای پنهان لایهی آخرِ مدل اعتبارسنج را دریافت میکند. از آنجا که مدل پیشنویس نمایش ویژگیهای مدل اعتبارسنج را میبیند، پیشبینیهایش همبستگی بالایی با توزیع خروجی اعتبارسنج دارند. به این ترتیب نرخ پذیرش از حدود 0.6 در روش کلاسیک، به بیش از 0.85 میرسد.
مدل EAGLE-3 (2025) جستجوی درختی روی ادامههای کاندید را هم اضافه کرد. vLLM و SGLang نسخههای EAGLE-2/3 را بهعنوان مسیر پیشفرض دیکودینگ گمانهزن برای Llama 3/4 و Qwen 3 ارائه میدهند.
زیروبم مدیریت کَش KV
در مرحلهی اعتبارسنجی، توکن پیشنویس در یک گذر رو به جلو وارد مدل اعتبارسنج میشوند. این کار کَش کلید-مقدار (KV cache) اعتبارسنج را به اندازهی درایه گسترش میدهد. اگر برخی توکنها رد شوند، باید وضعیت کش را به طول پیشوند پذیرفتهشده برگردانید (rollback).
پیادهسازیهای عملیاتی (مثل پرچم --speculative-config در vLLM یا LookaheadDecoder در TensorRT-LLM) این موضوع را با بافرهای موقت KV مدیریت میکنند: اول در بافر موقت مینویسند و پس از پذیرش توکنها، تغییرات را نهایی (commit) میکنند. از نظر مفهومی سخت نیست، اما پیادهسازی پردردسری دارد.
ساخت و پیادهسازی
کد کامل در فایل code/main.py آمده است. الگوریتم اصلی نمونهگیری گمانهزن (مرحلهی رد/پذیرش + توزیع باقیمانده) را با این بخشها پیاده میکنیم:
- یک «مدل بزرگ» که یک سافتمکس (softmax) معین روی یک توزیع دستی است (تا بتوانیم محاسبات نرخ پذیرش را به شکل تحلیلی بررسی کنیم).
- یک «مدل پیشنویس» که نسخهی دستکاریشدهی مدل بزرگ است.
- یک حلقهی رد و پذیرش که همان توزیع حاشیهای (marginal distribution) نمونهگیری مستقیم را بازتولید میکند.
گام 1: مرحلهی رد و پذیرش
def accept_or_reject(q_prob, p_prob, draft_token, u):
ratio = q_prob / p_prob if p_prob > 0 else float("inf")
return u < min(1.0, ratio)
متغیر u یک عدد تصادفی یکنواخت است. q_prob احتمال مدل اعتبارسنج برای توکن پیشنویسشده و p_prob احتمال مدل پیشنویس است. قضیهی لویاتان اثبات میکند که این تصمیمگیری برنولی، در صورت همراهی با نمونهگیری از توزیع باقیمانده هنگام رد شدن، توزیع مدل اعتبارسنج را دقیقاً حفظ میکند.
گام 2: توزیع باقیمانده
def residual_dist(q, p):
raw = [max(0.0, qi - pi) for qi, pi in zip(q, p)]
s = sum(raw)
return [r / s for r in raw]
مقدار p را بهصورت نظیربهنظیر (element-wise) از q کم کنید، مقادیر منفی را به صفر محدود کنید (clamp) و دوباره مقدارها را نرمالایز کنید. در صورت رد شدن هر توکن، باید از این توزیع نمونهگیری کنید.
گام 3: یک گام دیکودینگ گمانهزن
def spec_step(prefix, q_model, p_model, N, rng):
drafts = []
p_probs = []
ctx = list(prefix)
for _ in range(N):
p_dist = p_model(ctx)
d = sample(p_dist, rng)
drafts.append(d)
p_probs.append(p_dist[d])
ctx.append(d)
q_dists = [q_model(prefix + drafts[:i]) for i in range(N + 1)]
for i, d in enumerate(drafts):
u = rng.random()
q_prob = q_dists[i][d]
p_prob = p_probs[i]
if u < min(1.0, q_prob / p_prob if p_prob > 0 else float("inf")):
prefix = prefix + [d]
else:
res = residual_dist(q_dists[i], p_model(prefix))
prefix = prefix + [sample(res, rng)]
return prefix
prefix = prefix + [sample(q_dists[N], rng)]
return prefix
پنج توکن پذیرفتهشده ← یک توکن پاداش ← تولید شش توکن تنها با یک گذر رو به جلوی اعتبارسنج.
گام 4: سنجش نرخ پذیرش
10,000 گام گمانهزن را با کیفیتهای مختلف برای مدل پیشنویس اجرا کنید. نمودار نرخ پذیرش را بر حسب واگرایی کولبک-لایبلر (KL Divergence) بین توزیعهای پیشنویس و اعتبارسنج رسم کنید. باید یک رابطهی کاملاً یکنواخت و معکوس مشاهده کنید.
گام 5: تایید همارزی توزیعها
به شکل تجربی بررسی کنید: هیستوگرام توکنهای تولیدشده در حلقهی گمانهزن باید با هیستوگرام توکنهای حاصل از نمونهگیری مستقیم اعتبارسنج مطابقت داشته باشد. این همان قضیهی لویاتان در عمل است. یک آزمون کای-دو (chi-square) این همارزی را در حد خطای نمونهگیری تایید میکند.
استفادهی عملی
در محیط عملیاتی:
# اجرای vLLM با EAGLE
vllm serve meta-llama/Llama-3.1-70B-Instruct \
--speculative-config '{"method": "eagle", "model": "/models/llama-3.1-eagle-70b", "draft_tensor_parallel_size": 1, "num_speculative_tokens": 5}'
# اجرای vLLM با مدل پیشنویس استاندارد (vanilla)
vllm serve meta-llama/Llama-3.1-70B-Instruct \
--speculative-config '{"method": "draft_model", "model": "meta-llama/Llama-3.2-1B-Instruct", "num_speculative_tokens": 5}'
تا اواسط سال 2026، کتابخانهی TensorRT-LLM سریعترین مسیر مدوزا را دارد. همچنین پکیج faster-whisper دیکودینگ گمانهزن را برای Whisper-large بهکمک یک مدل پیشنویس کوچک پیادهسازی کرده است.
راهنمای انتخاب مدل پیشنویس:
| استراتژی | چه زمانی انتخاب کنیم؟ | افزایش سرعت |
|---|---|---|
| پیشنویس کلاسیک (خانوادهی Llama 1B/3B) | نمونهسازی سریع، بدون نیاز به آموزش | 1.8 تا 2.3 برابر |
| سرهای مدوزا (Medusa heads) | امکان فاینتیونینگ مدل اعتبارسنج وجود دارد | 2 تا 3 برابر |
| نسخههای EAGLE-2 / 3 | محیط عملیاتی و بالاترین سرعت ممکن | 3 تا 4 برابر |
| نگاهبهجلو (Lookahead) | بدون مدل پیشنویس، بدون آموزش و بدون پارامتر اضافه | 1.3 تا 1.6 برابر |
چه زمانی نباید از دیکودینگ گمانهزن استفاده کرد؟
- تولید توالیهای تکی به طول 1 تا 5 توکن؛ چرا که سربار محاسباتی غالب میشود.
- نمونهگیریهای بسیار خلاقانه یا با دمای بالا (افت شدید ).
- دیپلویهای محدود به حافظه (مدل پیشنویس به VRAM اضافه نیاز دارد).
استقرار و خروجی
فایل outputs/skill-spec-decode-picker.md را بررسی کنید. این ابزار متناسب با بار کاری استنتاجی جدید، استراتژی دیکودینگ گمانهزن مناسب (کلاسیک / Medusa / EAGLE / Lookahead) و پارامترهای تنظیمی (مثل N و دمای پیشنویس) را انتخاب میکند.
تمرینها
- ساده. فایل
code/main.pyرا اجرا کنید. تایید کنید که توزیع توکنهای گمانهزن در 50,000 توکن، با آزمون chi-square با مقدار p > 0.05 بر توزیع نمونهگیری مستقیم اعتبارسنج منطبق است. - متوسط. نمودار شتاب (تعداد توکن بهازای هر گذر مدل بزرگ) را بر حسب برای بازهی رسم کنید. مقدار بهینهی را برای هر مشخص کنید. (راهنمایی: امید ریاضی توکنها بهازای هر فراخوانی اعتبارسنجی برابر با است.)
- سخت. یک مدل مدوزای کوچک بسازید: مدل GPT پروژهی نهایی درس 14 را بردارید و 3 سر زبانی (LM head) اضافه کنید تا موقعیتهای t+2، t+3 و t+4 را پیشبینی کنند. مدل را با یک تابع زیان (loss) چندسرهی مشترک روی مجموعهدادهی tinyshakespeare آموزش دهید. نرخ پذیرش آن را با یک مدل پیشنویس کلاسیک که حاصل هرس کردن همین مدل است، مقایسه کنید.
- سخت. مکانیزم بازگشت به عقب (rollback) را پیادهسازی کنید: کار را با یک کش KV پیشوند 10 توکنی شروع کنید، 5 توکن پیشنویس به آن بدهید و رد شدن توکن در موقعیت 3 را شبیهسازی کنید. بررسی کنید که دادههای خواندهشده از کش در تکرار بعدی دقیقاً معادل «پیشوند + 2 توکن اول پذیرفتهشده» باشد.
اصطلاحات کلیدی
| اصطلاح | اصطلاح رایج | تعریف دقیق فنی |
|---|---|---|
| مدل پیشنویس (Draft model) | «مدل سبک و ارزان» | مدل کوچکتری که توکنهای کاندید را پیشنهاد میدهد؛ معمولاً 10 تا 50 برابر ارزانتر از اعتبارسنج است. |
| مدل اعتبارسنج (Verifier) | «مدل اصلی و سنگین» | مدل هدف که توزیع آن را حفظ میکنیم؛ در هر گام گمانهزنی یک بار اجرا میشود. |
| نرخ پذیرش () | «درصد درستی پیشنویس» | احتمال پذیرش هر توکن پیشنویس توسط مدل اعتبارسنج؛ معمولاً بین 0.7 تا 0.9 است. |
| توزیع باقیمانده (Residual distribution) | «توزیع جایگزین پس از رد» | توزیع نرمالایزشدهی (q - p)_+؛ نمونهگیری از این توزیع هنگام رد شدن توکن، توزیع اعتبارسنج را حفظ میکند. |
| توکن پاداش (Bonus token) | «توکن رایگان» | در صورت پذیرش تمام N توکن پیشنویس، یک توکن دیگر از توزیع گام بعدی اعتبارسنج نمونهگیری میشود. |
| مدوزا (Medusa) | «گمانهزنی بدون پیشنویس» | چند سر زبانی روی اعتبارسنج که موقعیتهای t+1 تا t+k را بهصورت موازی پیشبینی میکنند. |
| مدل EAGLE | «پیشنویس با وضعیتهای پنهان» | ترنسفورمر بسیار کوچکی که ورودی آن، وضعیتهای پنهان لایهی آخر مدل اعتبارسنج است. |
| دیکودینگ نگاهبهجلو (Lookahead decoding) | «تکرار ژاکوبی» | خودگمانهزنی با روش تکرار نقطه ثابت؛ بدون نیاز به مدل پیشنویس. |
| اتنشن درختی (Tree attention) | «اعتبارسنجی همزمان چند کاندید» | اعتبارسنجی شاخهای که چند ادامهی پیشنویس مختلف را بهطور همزمان بررسی میکند. |
| بازگشت کش (KV rollback) | «حذف پیشنویسهای ردشده» | بافر موقت KV؛ تغییرات پس از پذیرش نهایی (commit) و در صورت رد شدن دور ریخته میشوند. |
برای مطالعهی بیشتر
- Leviathan, Kalman, Matias (2023). Fast Inference from Transformers via Speculative Decoding — الگوریتم اصلی و قضیهی همارزی توزیعها.
- Chen et al. (2023). Accelerating Large Language Model Decoding with Speculative Sampling — مقالهی همزمان با اثباتی شفاف برای رد برنولی.
- Cai et al. (2024). Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads — مقالهی مدوزا و اعتبارسنجی مبتنی بر اتنشن درختی.
- Li et al. (2024). EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty — مقالهی EAGLE-1؛ پیشنویس شرطیشده بر وضعیتهای پنهان.
- Li et al. (2024). EAGLE-2: Faster Inference of Language Models with Dynamic Draft Trees — مقالهی EAGLE-2؛ عمق پویای درخت.
- Li et al. (2025). EAGLE-3: Scaling up Inference Acceleration of Large Language Models via Training-Time Test — مقالهی EAGLE-3.
- Fu et al. (2024). Break the Sequential Dependency of LLM Inference Using Lookahead Decoding — روش نگاهبهجلو، بدون نیاز به مدل پیشنویس.
- مستندات vLLM — Speculative Decoding — مرجع اصلی پیادهسازی عملیاتی هر چهار استراتژی.
- SafeAILab / پیادهسازی مرجع EAGLE — کد مرجع برای EAGLE-1/2/3.
