پشت صحنهی جواب دادن LLMها: prefill، decode و KV cache
خلاصهٔ کاملتر
این مقاله توضیح میده یه درخواست به LLM از یه pipeline رد میشه: tokenize شدن پرامپت، چک کردن کش، یه مرحلهی سنگین به اسم prefill برای پردازش ورودی، و بعد یه حلقهی decode که توکنهای خروجی رو یکییکی تولید میکنه. هر مرحله گلوگاه خودش رو داره و فاصلهی بین توان اسمی GPU و چیزی که واقعاً میگیری، مسئلهی اصلی سرو کردن مدلها تو مقیاس بالاست.
چرا inference از آموزش مهمتره؟ آموزش DeepSeek V3 حدود ۲.۸ میلیون ساعت GPU از نوع H800 طول کشید، ولی خود شرکت گفته روزی حدود ۴۳ هزار ساعت H800 برای inference مصرف میکنه. یعنی تو یه سال حدود ۶ برابر آموزش، و اگه مدل دو سال تو سرویس بمونه نزدیک ۱۲ برابر. نویسنده میگه برای همین مقایسهی مدلها باید با inference flops ثابت باشه نه training flops. به گفتهی مقاله، حاشیهی سود API دیپسیک هم تا ۸۰ درصد میرسه که از بهینهسازی inference میاد.
تو prefill کل پرامپت از قبل معلومه، پس میشه روی همهی توکنها موازی کار کرد. عددهای یه سرویس واقعی حدود ۶۰ هزار توکن در ثانیه برای هر GPU بدون کش و بیشتر از ۱.۵ میلیون با کش رو نشون میده. prefill همون چیزیه که TTFT (یعنی زمانی که منتظری تا اولین توکن جواب برسه) رو تعیین میکنه؛ میانهش حدود ۴۰۰ میلیثانیهست و صدک ۹۹ نزدیک ۱ ثانیه.
KV cache یعنی ذخیرهی بردارهای key و value که مدل موقع attention برای هر توکن حساب میکنه، تا لازم نباشه دوباره حساب بشن. سرویسدهندهها کشهای داغ رو تو حافظهی GPU نگه میدارن و بقیه رو با سیاست LRU به Redis یا SSD میفرستن. یه سرویسدهنده تا ۷۲ ساعت و چند پتابایت کش نگه میداره و به نرخ hit تا ۹۶ درصد میرسه. ولی این به الگوی ترافیک بستگی داره: ابزارهای کدنویسی و agentها که context تکراری دارن کش زیادی میخورن، چتهای تکوتوک تقریباً هیچی.
decode یعنی یه توکن بساز، برش گردون تو مدل، توکن بعدی رو بساز. چون هر توکن به قبلی وابستهست، موازی نمیشه؛ روی همون سختافزار حدود ۱۴ هزار توکن در ثانیه در برابر ۱.۵ میلیون prefill. MFU (یعنی چند درصد از توان اسمی چیپ واقعاً استفاده میشه) تو prefill حدود ۵۰ درصده ولی تو decode به حدود ۵ درصد میرسه. معیارهای مهم این مرحله هم time per output token، throughput و goodput (توکنهایی که تو محدودهی تأخیر قابل قبول تحویل داده میشن) هستن.
بهینهسازیها سه دستهان. تو سطح مدل: mixture-of-experts، state space modelها، multi-head latent attention، quantization و distillation. تو سطح kernel و runtime: flash attention، paged attention (paging شبیه حافظهی مجازی برای KV cache) و radix attention برای استفادهی دوباره از prefixهای مشترک. تو سطح harness: routing درخواستهای ساده به مدلهای ارزونتر و speculative decoding، یعنی یه مدل کوچیک چند توکن پیشنهاد میده و مدل بزرگ موازی تأییدشون میکنه.
نکات کلیدی:
- inference طبق عددهای DeepSeek حدود ۶ تا ۱۲ برابر آموزش compute مصرف میکنه.
- prefill با کش تا ۱.۵ میلیون توکن در ثانیه برای هر GPU میرسه، decode حدود ۱۴ هزار.
- MFU تو prefill حدود ۵۰ درصده و تو decode حدود ۵ درصد.
- نرخ hit کش تا ۹۶ درصد گزارش شده، با نگهداری تا ۷۲ ساعت.
- میانهی TTFT حدود ۴۰۰ میلیثانیه و صدک ۹۹ نزدیک ۱ ثانیهست.




