چرا speculative decoding سریعتره، با اینکه کار بیشتری میکنه؟
خلاصهٔ کاملتر
Joe Barrow تو این مقاله یه تصور غلط رایج رو رد میکنه: اینکه speculative decoding سریعتره چون «تأیید کردن» توکنها FLOP کمتری از «تولید کردن»شون لازم داره. به گفتهی نویسنده، برعکسه و کل محاسبات برای یه دنبالهی یکسان بیشتر هم میشه. سرعت از نوع کاری میاد که GPU انجام میده.
اول یه یادآوری: speculative decoding یعنی یه مدل کوچیک (draft model) چند توکن بعدی رو حدس میزنه و بعد مدل بزرگ همهشون رو با هم تو یه forward pass چک میکنه و اونایی رو که خودش هم تولید میکرد قبول میکنه. در حالت عادی، مدل توکنها رو یکییکی تولید میکنه.
نکتهی اصلی، فرق بین کار memory bound و compute boundـه. memory bound یعنی GPU منتظره داده از حافظهی global لود بشه، و compute bound یعنی همهچی لوده و منتظر تموم شدن ضرب ماتریسهاست. وقتی LLM یه توکن تولید میکنه، باید همهی پارامترهای فعال مدل رو از حافظه رد کنه (مثلاً ۲۷ میلیارد پارامتر برای Qwen3.5-27B)، پس شدیداً memory boundـه و توان محاسباتی هدر میره. نویسنده میگه اگه به جای یه دنباله دو تا رو decode کنی، زمان هر توکن تقریباً عوض نمیشه.
نویسنده یه مثال میزنه: فرض کن تعداد بهینهی توکن تو هر forward pass پنج تاست. یا میتونی پنج دنباله رو همزمان یه قدم جلو ببری (breadth)، یا با speculative decoding یه دنباله رو پنج قدم جلو ببری (depth). کار GPU تقریباً یکیه. پس وقتی batch size خیلی کمتر از اون عدد بهینهست، speculative decoding از محاسبات «مجانی» استفاده میکنه. ولی اگه batch بزرگ باشه و هنوز speculate کنی، compute bound میشی و همه کند میشن، و هر توکنی که رد بشه هم کار هدررفتهست.
به همین دلیل vLLM پارامتر --speculative-disable-by-batch-size رو داره که تو throughput بالا این قابلیت رو خاموش میکنه. به گفتهی نویسنده، همین دید باعث شد محققها بپرسن چرا عمق speculation باید همیشه ثابت باشه؛ ایدههایی مثل dSpark وقتی batch کوچیکه عمیقتر و وقتی بزرگه کمعمقتر یا حتی per-sequence حدس میزنن.
نکات کلیدی:
- speculative decoding در کل FLOP بیشتری مصرف میکنه، نه کمتر.
- decode یکییکی memory boundـه، چون برای هر توکن باید همهی پارامترهای فعال مدل از حافظه رد بشن.
- این روش فقط وقتی batch size خیلی کمتر از تعداد بهینهی توکن در هر pass باشه سود داره.
- تو batchهای بزرگ، speculative decoding سیستم رو compute bound و کندتر میکنه.
- vLLM با --speculative-disable-by-batch-size میتونه این قابلیت رو تو بار بالا خاموش کنه.
- ایدههایی مثل dSpark عمق speculation رو بسته به batch size تغییر میدن.




