من عملکرد Speculative Decoding را محک زدم — a = 3.5 کافی نبود
روش Speculative Decoding (SD) بر یک قاعده ریاضی ساده تکیه دارد: a > 1 + α + β
طول پذیرش (a) باید از مجموع ۱ بهاضافه نسبت محاسباتی (α) و سربار تأیید (β) بیشتر باشد. اگر چنین باشد، SD پیروز است؛ در غیر این صورت، شکست میخورد.
من این تئوری را روی یک سیستم واقعی آزمایش کردم. از یک CPU نسل ۱۲ اینتل با ۶۴ گیگابایت RAM استفاده کردم. یک مدل پیشنویس (draft model) کوچک Qwen2.5-0.5B را با یک مدل هدف (target model) بزرگتر Qwen2.5-1.5B جفت کردم.
نتایج غافلگیرکننده بود. SD بین ۴۹٪ تا ۶۲٪ کندتر از تولید متن خام (raw generation) بود.
در اینجا نحوه تغییر طول پذیرش (a) بر اساس نوع وظیفه آورده شده است:
• JSON (ساختاریافته): a = 3.50. مدل پیشنویس فرمت را به خوبی پیشبینی کرد. • کد (نیمهساختاریافته): a = 3.00. خوب بود، اما الگوهای نامگذاری متفاوت بودند. • داستان (خلاقانه): a = 2.11. مدل پیشنویس در انتخاب کلمات با مشکل مواجه شد.
حتی زمانی که "a" بالا بود، SD روی CPU شکست خورد. چرا؟
بزرگترین مشکل، نرخ پذیرش صفر (zero-accept rate) بود. بین ۱۵٪ تا ۳۰٪ از دورها، هیچ توکنی پذیرفته نشد.
در این دورها، مدل پیشنویس کار میکند، مدل هدف تأیید میکند، اما شما هیچ چیز جدیدی به دست نمیآورید. شما هزینه دو بار اجرا را دادید تا فقط یک توکن بگیرید. این باعث میشود SD برای همان خروجی، ۲ برابر بیشتر هزینه داشته باشد.
این موضوع نشان میدهد که چرا SD یک بهینهسازی مخصوص GPU است.
در یک GPU، مدل پیشنویس تقریباً رایگان است. نسبت محاسباتی (α) بسیار ناچیز است. اما در یک CPU، مدل پیشنویس برای پهنای باند حافظه رقابت میکند. رایگان نیست. در CPU، این نامساوی از هم میپاشد.
اگر قصد استفاده از SD روی CPU را دارید، این کار را نکنید. اعداد و ارقام کار نمیکنند.
نکات کلیدی برای استقرار (deployments) شما:
- مقدار "a" خود را اندازهگیری کنید. به ادعاهای سازندگان اعتماد نکنید.
- دادههای خود را بر اساس نوع وظیفه تقسیم کنید. کد و چت نرخ پذیرش متفاوتی دارند.
- مراقب نرخ پذیرش صفر باشید. واریانس بالا باعث خراب شدن تأخیر (latency) p99 شما میشود.
- از SD روی GPUها استفاده کنید، جایی که هزینه مدل پیشنویس در حداقل است.
بهترین بهینهسازی، دانستن این است که چه زمانی آن را خاموش کنید.
Source: https://dev.to/zxpmail/i-benchmarked-speculative-decoding-a-35-wasnt-enough-1geb
Optional learning community: https://t.me/GyaanSetuAi
