چیت‌شیت

دیکودینگ حدسی: پیش‌نویس، EAGLE و MTP

Speculative Decoding: Draft, EAGLE, MTP

پیش‌نویس و اعتبارسنجی بدون افت کیفیت. پیش‌نویس Vanilla، Medusa، EAGLE-3 و MTP، محاسبات شتاب، پیکربندی vLLM، گیت‌های کنترلی.

  • ۱۲ بخش
  • ۶ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. مقایسه‌ی انواع مدل پیش‌نویس
  2. یک گام حدسی
  3. حلقه‌ی الگوریتم در کد
  4. پشته‌ی سرویس‌دهی
  5. دستورات
  6. توابع موجود در درس‌ها
  7. محاسبات شتاب
  8. پیش‌فرض‌های اسکریپت
  9. عیب‌یابی
  10. چه زمانی از هر پیش‌نویس استفاده کنیم
  11. اختصارات
  12. پرسش‌ها

مقایسه‌ی انواع مدل پیش‌نویس

مقایسه
عاملپیش‌نویس VanillaMedusaEAGLE-3MTP (DeepSeek-V3)
پیش‌نویسLLM کوچک مجزاهد‌های LM اضافه روی مدل اعتبارسنجترکیب ویژگی‌های چندلایه + TTT1 بلوک ترنسفورمر + تصویر
زمان آموزشاستفاده مجدد از یک مدل موجودمرحله‌ی SFT روی مدل اعتبارسنجپس از پیش‌آموزشحین پیش‌آموزش
هزینه‌ی آموزشصفرحدود 1 میلیارد توکن SFTحدود 60 تا 200 میلیارد توکنحدود 10٪ پیش‌آموزش کندتر
α0.55-0.700.65-0.750.88-0.92بیش از 0.80 در عمق 1
شتاب1.8-2.3×2-3×3.5-6.5×1.8×
مدل دومبلهخیرهد پیش‌نویس بسیار کوچکخیر، بخشی از مدل است
وزن‌های موجودبلهنیاز به فاین‌تیون داردبلهخیر، آموزش مجدد

یک گام حدسی

گام‌به‌گام
  1. پیش‌نویسمدل ارزان $M_p$ تعداد $N$ توکن را با احتمالات $p_1 \ldots p_N$ پیشنهاد می‌دهد.
  2. اعتبارسنجیمدل اعتبارسنج $M_q$ یک بار روی پیشوند به همراه پیش‌نویس‌ها اجرا می‌شود و $q_1 \ldots q_{N+1}$ را بازمی‌گرداند.
  3. پذیرشپیمایش از چپ به راست. پذیرش با احتمال $\min(1, q_i(d_i) / p_i(d_i))$.
  4. رددر اولین رد، نمونه‌گیری از حالت نرمال‌شده‌ی $(q_j - p_j)_+$. پیش‌نویس‌های بعدی دور ریخته می‌شوند.
  5. پاداشوقتی همه‌ی $N$ توکن پذیرفته شدند، یک توکن دیگر از $q_{N+1}$ نمونه‌گیری کنید.
  6. بازگشت به عقبکش کلید-مقدار را به اندازه‌ی طول پیشوند پذیرفته‌شده تنظیم کنید.
  7. نتیجهتوزیع خروجی دقیقاً منطبق بر اجرای تکی مدل اعتبارسنج است.

حلقه‌ی الگوریتم در کد

کد
python
for i, d in enumerate(drafts):
    u = rng.random()
    ratio = q_prob / p_prob if p_prob > 0 else float("inf")  # q مدل اعتبارسنج، p مدل پیش‌نویس
    if u < min(1.0, ratio):
        emitted.append(d)
        kv.extend(1)                                         # پذیرفته شد: کش یک واحد رشد می‌کند
    else:
        correction = sample(residual(q, p), rng)             # حالت نرمال‌شده‌ی مجدد (q - p)+
        emitted.append(correction)
        kv.truncate_to(prefix_len + len(emitted))            # بازگشت وضعیت کش کلید-مقدار
        return emitted, 1                                    # یک گذر رو به جلوی مدل اعتبارسنج
bonus = sample(q, rng)                                       # همه‌ی N پذیرفته شدند: توکن رایگان
emitted.append(bonus)

پشته‌ی سرویس‌دهی

معماری
k توکنپذیرش، نمونه‌گیری مجددورودی درخواستchat completionsvLLM یا SGLangیک رپلیکا به ازای هر GPUپیش‌نویسهدهای EAGLE-3 یا ngramهدفکوانتایز شده با FP8 یا INT4گذر اعتبارسنجیk توکن پیش‌نویس در یک گذرجریان توکن‌هاارسال پیشوند پذیرفته‌شده به کلاینتسنجه‌های Prometheusنرخ پذیرش، انتظار در صف، p99HPAمقیاس‌پذیری بر اساس انتظار در صف

دستورات

دستورها
دستورعملکرد
vllm serve <model> --speculative-config '{"method": "eagle", "model": "<draft>", "num_speculative_tokens": 5}'هد پیش‌نویس EAGLE
--speculative-config '{"method": "draft_model", "model": "meta-llama/Llama-3.2-1B-Instruct", "num_speculative_tokens": 5}'مدل پیش‌نویس Vanilla
--speculative-config '{"model": "<draft>", "num_speculative_tokens": 5, "method": "eagle3"}'پیش‌نویس EAGLE-3
python main.py --vocab 64 --alpha 0.75 --k 4 --samples 50000قاعده‌ی رد، بررسی بازه‌ی آلفا، دموی ماسک درختی

توابع موجود در درس‌ها

کار و کد
وظیفهکد
باقیمانده در زمان ردresidual(q, p)
یک گام با بازگشت وضعیت کش کلید-مقدارspec_step(q, p, N, kv, rng)
توکن‌ها به ازای هر اعتبارسنجیexpected_tokens_per_verify(alpha, N)
زمان واقعی به ازای هر توکنwall_time_per_token(alpha, N, c)
شتاب برای یک پیکربندیexpected_speedup(p)
ماسک اعتبارسنجی درختیtree_attention_mask(tree)
بررسی توزیعchi_square(observed, expected)
نرخ پذیرش اندازه‌گیری‌شدهm.acceptance_rate(k)

محاسبات شتاب

مفهوم‌ها
توکن‌ها به ازای هر اعتبارسنجی
$\mathbb{E}[\text{accepted}] = \frac{1 - \alpha^{N+1}}{1 - \alpha}$
مثال
α = 0.8, K = 4 مقدار 3.36 توکن در هر گذر رو به جلو می‌دهد.
زمان واقعی به ازای هر توکن
(N * c + 1) / E[accepted]، با فرض c = cost(draft) / cost(verifier).
بزرگ‌ترین اهرم
نرخ پذیرش α بیشتر از طول پیش‌نویس N شتاب را افزایش می‌دهد.
فرم محیط عملیاتی
S(alpha, K) = (1 + K*alpha) / (1 + verify_overhead)
نقطه‌ی سرربه‌سر
alpha_breakeven = verify_overhead / K. با افزایش همزمانی بالاتر می‌رود.
تابع زیان (loss) مدل MTP
$L_{\text{MTP}} = \frac{\lambda}{D} \sum_{k=1}^{D} L_k$، ابتدا lambda با 0.3 و سپس 0.1.

پیش‌فرض‌های اسکریپت

پیش‌فرض‌ها
تنظیمپیش‌فرضیادداشت
--vocab32اندازه‌ی دایره واژگان، حداقل 2
--alpha0.75نرخ پذیرش هدف در بازه‌ی (0, 1]
--k4طول پیش‌نویس، حداقل 1
--samples20000تعداد نمونه
--seed0سید تصادفی
n_tokens1000simulate_tail توکن در هر اجرا

عیب‌یابی

عیب‌یابی
  • عدم شتاب پس از استقرار

    علت
    دیکودینگ حدسی نیاز به فعال‌سازی دستی دارد
    راه‌حل
    speculative_config را صراحتاً تنظیم کنید
  • میانگین ITL کاهش و P99 ITL افزایش می‌یابد

    علت
    پیش‌نویس‌های ردشده به دو گذر نیاز دارند
    راه‌حل
    P99 ITL را رصد کنید، قبل از عرضه آن را تنظیم کنید
  • α زیر 0.55 روی ترافیک واقعی

    علت
    مدل پیش‌نویس روی داده‌های عمومی آموزش دیده
    راه‌حل
    یک پیش‌نویس تخصصی دامنه آموزش دهید یا آن را غیرفعال کنید
  • افت شدید α

    علت
    نمونه‌گیری خلاقانه با دمای بالا
    راه‌حل
    برگشت به رمزگشایی ساده
  • عدم بهبودی در همزمانی بالا

    علت
    دسته‌بندی (batching) در حال حاضر تمام FLOPs را پر کرده است
    راه‌حل
    نقطه‌ی سرربه‌سر را در همان همزمانی بسنجید
  • خرابی کش پس از رد شدن

    علت
    داده‌های فراتر از j-1 نوشته‌شده باقی می‌مانند
    راه‌حل
    برش به اندازه‌ی پیشوند پذیرفته‌شده
  • بهبود ناچیز روی مدل کوچک

    علت
    پیش‌نویس تفاوت هزینه‌ی چندانی ندارد
    راه‌حل
    دیکودینگ حدسی را برای مدل‌های زیر 3B نادیده بگیرید

چه زمانی از هر پیش‌نویس استفاده کنیم

نکته‌ها
  • استفاده از پیش‌نویس vanilla برای یک پیش‌نمونه‌ی سریع بدون نیاز به آموزش.
  • استفاده از هدهای Medusa در صورتی که می‌توانید مدل اعتبارسنج را فاین‌تیون کنید.
  • استفاده از EAGLE-2 یا EAGLE-3 در محیط عملیاتی برای حداکثر سرعت.
  • استفاده از lookahead وقتی هیچ پیش‌نویس، آموزش و پارامتر اضافی نمی‌خواهید. انتظار 1.3 تا 1.6× داشته باشید.
  • استفاده از MTP در صورتی که کنترل پیش‌آموزش دست شماست و hidden size حداقل 4096 است.
  • استفاده از دیکودینگ حدسی برای کاهش تاخیر چت، خروجی کد و JSON، و تولید متن‌های طولانی.
  • رد شدن از آن برای خروجی‌های زیر 50 توکن و کارهای آفلاین با batch-1.

اختصارات

اصطلاح‌ها
α
نرخ پذیرش. شانس پذیرفته شدن هر توکن پیش‌نویس توسط مدل اعتبارسنج.
K یا N
طول پیش‌نویس. معمولاً 4 تا 8 توکن به ازای هر فوروارد هدف.
EAGLE
پیش‌نویس بسیار کوچک مشروط به وضعیت‌های پنهان مدل اعتبارسنج.
TTT
تست زمان آموزش. مدل پیش‌نویس حین آموزش خروجی‌های خود را می‌بیند.
MTP
پیش‌بینی چندتوکنی. ماژولی که توکن k گام جلوتر را پیش‌بینی می‌کند.
P99 ITL
سنجه‌ی دنباله‌ای که پس از فعال‌سازی دیکودینگ حدسی باید بررسی شود، نه P50.
HPA
مقیاس‌پذیری خودکار سرور بر اساس انتظار در صف، نه CPU.

پرسش‌ها

پرسش و پاسخ
آیا دیکودینگ حدسی کیفیت خروجی را تغییر می‌دهد؟
خیر. خروجی دقیقاً با توزیع مدل اعتبارسنج مطابقت دارد.
چرا مرحله‌ی رمزگشایی فضا برای این کار باقی می‌گذارد؟
رمزگشایی متکی به پهنای باند حافظه است و پردازنده بیکار می‌ماند.
چگونه مقدار alpha را در vLLM V1 بخوانیم؟
مقدار spec_decode_metrics.accepted_tokens_per_request را بر طول پیش‌نویس تقسیم کنید.
EAGLE-3 چه تغییری ایجاد کرد؟
تابع زیان ویژگی‌ها را حذف کرده و با تست زمان آموزش یاد می‌گیرد.
چرا MTP یک پیش‌نویس خوب است؟
ماژول‌های متوالی، زنجیره‌ی علی را مشابه یک دیکودر حفظ می‌کنند.