انتقال push-based کش KV در vLLM؛ TTFT تا ۳ برابر بهتر
خلاصهٔ کاملتر
vLLM یه موتور متنباز برای سرو کردن مدلهای زبانی بزرگه. inference (یعنی اجرای مدل برای گرفتن جواب) دو مرحله داره: prefill که پرامپت رو پردازش میکنه و KV cache (یعنی حافظه میانیای که مدل برای تولید توکنهای بعدی لازم داره) رو میسازه، و decode که با همین کش، توکنها رو یکییکی تولید میکنه. تو حالت P-D disaggregation این دو مرحله روی سرورهای جدا اجرا میشن تا هر کدوم مستقل scale بشه. ولی هزینهش اینه که KV cache باید قبل از شروع decode از سرور prefill به سرور decode منتقل بشه.
این انتقال تو vLLM با NIXL connector انجام میشه که روی شبکههای RDMA مثل AWS EFA کار میکنه. RDMA یعنی یه سرور مستقیم بدون درگیر کردن CPU به حافظه سرور دیگه دسترسی داره. حالت پیشفرض pull هست: بعد از تمومشدن prefill، router اطلاعات بلاکها رو به decode میده، decode بلاکهای مقصد رو رزرو میکنه و بعد با NIXL READ داده رو میکشه. همه این مراحل پشت سر هم و بعد از prefill اتفاق میافتن، پس مستقیم به TTFT (یعنی زمان رسیدن اولین توکن) اضافه میشن.
تو مقاله AWS اومده که حالت push این ترتیب رو برعکس میکنه. سرور decode همون موقع که بلاکها رو رزرو میکنه، آدرسشون رو برای prefill میفرسته؛ یعنی وقتی prefill هنوز داره کار میکنه. هر کدوم از این دو اتفاق (رسیدن آدرس یا تمومشدن prefill) که دیرتر بیفته، انتقال رو شروع میکنه. بعد سرور prefill با NIXL WRITE داده رو مستقیم تو حافظه decode مینویسه. حتی اگه اندازه بلاک دو طرف فرق داشته باشه، هر طرف موقع انتقال بلاکها رو به چیدمان خودش تطبیق میده.
یه نکته مهم دیگه thread جداست. سمت prefill یه thread پسزمینه ساخت connection، آمادهسازی descriptorها، ادغام بلاکهای پشتسرهم و ارسال WRITE رو انجام میده و حلقه اصلی مدل سریع برمیگرده سر کارش. به گفته نویسندهها، تو حالت pull این کارها داخل حلقه اصلی سرور decode انجام میشد و تولید توکن رو متوقف میکرد. یعنی push هم TTFT رو کم میکنه و هم TPOT (یعنی زمان تولید هر توکن) رو.
بنچمارک روی مدل Qwen3-32B با یه سرور prefill و یه سرور decode (1P1D) روی EC2 P5en با EFA اجرا شده و prefix caching رو هم خاموش کردن تا کل کش هر بار منتقل بشه. تو بار کم دو حالت تقریباً یکیان. ولی تو ۸ درخواست در ثانیه و ورودی ۱۶ هزار توکنی، TTFT حالت pull به حدود ۱٬۷۴۴ میلیثانیه میرسه و push حدود ۵۴۰ میلیثانیه میمونه. TPOT هم تو pull تا حدود ۱۰٫۴ میلیثانیه بالا میره و push نزدیک ۷ میلیثانیه میمونه. خود نویسندهها گفتن نتیجه بسته به workload فرق میکنه.
برای استفاده کافیه هر دو سرور prefill و decode رو بهجای NixlConnector روی NixlPushConnector تنظیم کنی. ولی یه trade-off هست: تو push باید سرور decode رو زودتر انتخاب کنی، پس router دیگه نمیتونه بعد از prefill بر اساس بار تصمیم بگیره. نویسندهها میگن برای انتقال دوطرفه KV یا routing وابسته به بار، pull هنوز گزینه بهتریه. این قابلیت اول روی Trainium ساخته شده و مستقل از نوع شتابدهنده به vLLM اضافه شده.
نکات کلیدی:
- push تو بار بالا TTFT رو تا ۳ برابر و TPOT رو تا ۳۰ درصد بهتر کرده
- تو ۸ QPS و ورودی ۱۶k، TTFT از حدود ۱٬۷۴۴ به حدود ۵۴۰ میلیثانیه رسیده
- فعالسازی با تنظیم NixlPushConnector روی هر دو سرور prefill و decode
- trade-off: سرور decode باید قبل از prefill انتخاب بشه
- برای انتقال دوطرفه KV یا routing وابسته به بار، حالت pull مناسبتره




