فاز 17 · درس 18

معماری پروداکشن vLLM: تخلیه کش KV و مسیریابی آگاه از کش

نوع
مفهومی
زمان
حدود 60 دقیقه
زبان‌ها
Python (stdlib, toy KV-spill simulator)
پیش‌نیاز
فاز 17 · 04 (سازوکار داخلی موتور سرویس‌دهی)، فاز 17 · 06 (SGLang/RadixAttention)
یک تراشه پردازنده گرافیکی درخشان متصل به بانک‌های ماژولار رم سرور با مسیرهای نوری داده در یک رک شبکه
فهرست مطالب
  1. اهداف یادگیری
  2. صورت مسئله
  3. مفاهیم پایه
  4. استک عملیاتی vLLM
  5. اتصال‌دهنده‌ی تخلیه‌ی کش کلید-مقدار (v0.9.0+)
  6. مقایسه‌ی تخلیه روی پردازنده‌ی اصلی به‌شکل توکار و LMCache
  7. رفتار در بنچمارک‌ها
  8. چه زمانی LMCache تعیین‌کننده است؟
  9. چه زمانی نباید آن را فعال کرد؟
  10. هماهنگی با سرویس‌دهی تفکیک‌شده
  11. اعدادی که باید به خاطر بسپارید
  12. پیاده‌سازی و آزمایش
  13. خروجی این درس
  14. تمرین‌ها
  15. اصطلاحات کلیدی
  16. برای مطالعه‌ی بیشتر

هنگام استقرار مدل‌های بزرگ زبانی در محیط عملیاتی، با افزایش همزمانی درخواست‌ها حافظه‌ی بسیار گران‌قیمت HBM به سقف 100% می‌رسد. در این وضعیت، کارت گرافیک دچار رخدادهای پیش‌دستی (Preemption) می‌شود؛ بدین معنا که بخشی از زمینه‌های متنی پاک شده و سیستم مجبور می‌شود پرامپت‌های چند هزار توکنی را بارها و بارها از نو محاسبه کند. این معضل توان پردازشی مفید (Goodput) را کاهش داده و هزینه محاسباتی را به‌شدت بالا می‌برد.

افزایش تعداد GPU برای جبران کمبود حافظه راه‌حلی خطی، بسیار پرهزینه و برای اغلب زیرساخت‌ها ناممکن است. با این حال، رم سیستم (CPU DRAM) ظرفیت فراوان و قیمت بسیار پایین‌تری دارد. اتصال‌دهنده‌های مدرن تخلیه‌ی کش کلید-مقدار (KV Cache Offloading) مانند LMCache در vLLM امکان می‌دهند داده‌های پردازش‌شده را بدون ایجاد گلوگاه به حافظه سیستم منتقل کرده و از محاسبه‌ی مجدد پیشوندها میان موتورهای مختلف جلوگیری کنید.

یک استک سرویس‌دهی در محیط عملیاتی (پروداکشن)، مسیریاب، موتورها و لایه‌ی پایش‌پذیری را در قالب یک دپلویمنت Kubernetes سرهم می‌کند — و به کش کلید-مقدار (KV cache) به چشم منبعی نگاه می‌کند که می‌تواند از GPU خارج شود. تخلیه‌ی کش کلید-مقدار این کش را از حافظه‌ی GPU بیرون می‌کشد و آن را میان کوئری‌ها و موتورهای مختلف بازاستفاده می‌کند (ابتدا در رم CPU، سپس روی دیسک/Ceph). استک عملیاتی vLLM دپلویمنت مرجع به حساب می‌آید و LMCache لایه‌ی تخلیه است. اتصال‌دهنده‌ی تخلیه‌ی کش کلید-مقدار در vLLM 0.11.0 (ژانویه‌ی 2026) این سازوکار را از طریق API اتصال‌دهنده (v0.9.0+) ناهمگام و ماژولار می‌کند. مسیر تخلیه معمولاً از مسیر پردازش درخواست پنهان می‌ماند، هرچند عدم اصابت به کش (Cache miss) و ارتقا می‌توانند تاخیر سرتاسری را افزایش دهند. LMCache حتی بدون پیشوندهای مشترک هم ارزشمند است — وقتی اسلات‌های کش کلید-مقدار یک GPU پر می‌شود، درخواست‌های پیش‌دستانه‌شده (Preempted) می‌توانند به جای محاسبه‌ی دوباره‌ی پیش‌پرکنی (Prefill)، از CPU بازیابی شوند. بنچمارک‌های منتشرشده روی 16 کارت H100 (با حافظه‌ی 80GB HBM) در 4 ماشین a3-highgpu-4g نشان می‌دهد: وقتی حجم کش کلید-مقدار از ظرفیت HBM فراتر می‌رود، هم تخلیه روی پردازنده‌ی اصلی به‌شکل توکار و هم LMCache به‌طور چشمگیری نرخ پردازش را بهبود می‌دهند؛ در حجم‌های پایین کش، همه‌ی پیکربندی‌ها با اندکی سربار، عملکردی نزدیک به خط مبنا دارند.

اهداف یادگیری

  • ترسیم لایه‌های استک عملیاتی vLLM: مسیریاب، موتورها، تخلیه‌ی کش کلید-مقدار و پایش‌پذیری.
  • توضیح API اتصال‌دهنده‌ی تخلیه‌ی کش کلید-مقدار (v0.9.0+) و چگونگی پنهان‌سازی تاخیر تخلیه در مسیر ناهمگام نسخه‌ی 0.11.0.
  • سنجش دقیق شرایطی که رم پردازنده‌ی LMCache بازدهی دارد (وقتی کش > HBM) در برابر شرایطی که سربار اضافه می‌کند (وقتی کش آن‌قدر کوچک است که در HBM جا می‌شود).
  • انتخاب آگاهانه بین تخلیه روی پردازنده‌ی اصلی به‌شکل توکار در vLLM و اتصال‌دهنده‌ی LMCache با توجه به محدودیت‌های دپلویمنت.

صورت مسئله

در سیستم سرویس‌دهی vLLM شما، با بالا رفتن همزمانی (Concurrency)، مصرف HBM کارت‌های گرافیک به 100% می‌رسد و رخدادهای پیش‌دستانه پیاپی ثبت می‌شوند. درخواست‌ها بیرون انداخته می‌شوند، دوباره در صف قرار می‌گیرند و شما مجبور می‌شوید یک پرامپت 2K توکنی یکسان را در طول یک دقیقه چهار بار پیش‌پرکنی کنید. توان محاسباتی GPU صرف پیش‌پرکنی‌های بیهوده می‌شود و نرخ پردازش مفید (Goodput) بسیار پایین‌تر از نرخ پردازش خام قرار می‌گیرد.

اضافه کردن کارت گرافیک بیشتر، هزینه‌ی خطی دارد. افزودن به ظرفیت HBM هم ناممکن است. اما رم CPU ارزان است — یک سوکت به تنهایی بیش از 512GB رم دارد؛ گرچه تاخیر آن چند مرتبه‌ی بزرگی از HBM بدتر است، ولی برای یک کش کلید-مقدار «موقتاً آماده» کاملاً کفایت می‌کند.

ابزار LMCache کش کلید-مقدار را به رم CPU منتقل می‌کند تا درخواست‌های پیش‌دستانه‌شده سریع بازیابی شوند و پیشوندهای تکراری میان موتورهای مختلف به اشتراک گذاشته شوند، بدون اینکه هر موتور مجبور به پیش‌پرکنی دوباره باشد.

مفاهیم پایه

استک عملیاتی vLLM

مخزن github.com/vllm-project/production-stack دپلویمنت مرجع مبتنی بر Kubernetes است:

  • مسیریاب (Router) — آگاه از کش (فاز 17 · 11). رویدادهای کش کلید-مقدار را مصرف می‌کند.
  • موتورها (Engines) — ورکر‌های vLLM؛ یکی به ازای هر GPU یا به ازای هر گروه موازی‌سازی تنسور/خط‌لوله‌ای (TP/PP).
  • تخلیه‌ی کش کلید-مقدار — دپلویمنت LMCache یا اتصال‌دهنده‌ی توکار.
  • پایش‌پذیری — جمع‌آوری متریک‌ها با Prometheus، داشبوردهای Grafana، ردگیری محاسبات با OTel.
  • کنترل پلین (Control plane) — شناسایی سرویس، پیکربندی، به‌روزرسانی‌های پیوسته (Rolling updates).

این مجموعه در قالب Helm chart به همراه یک Operator عرضه می‌شود.

اتصال‌دهنده‌ی تخلیه‌ی کش کلید-مقدار (v0.9.0+)

نسخه‌ی vLLM 0.9.0 یک API اتصال‌دهنده برای بک‌اندهای ماژولار کش کلید-مقدار معرفی کرد. موتور شما بلوک‌ها را به اتصال‌دهنده منتقل می‌کند؛ اتصال‌دهنده آن‌ها را ذخیره می‌سازد (در RAM، دیسک، فضای ذخیره‌سازی ابری یا LMCache). هر وقت درخواستی به بلوکی نیاز داشته باشد، اتصال‌دهنده دوباره آن را بارگذاری می‌کند.

نسخه‌ی vLLM 0.11.0 (ژانویه‌ی 2026) یک مسیر تخلیه‌ی ناهمگام اضافه کرده است — عملیات تخلیه می‌تواند در پس‌زمینه انجام شود تا در حالت معمول، موتور مسدود (Block) نشود. با این حال، تاخیر سرتاسری و نرخ پردازش همچنان به الگوی بار کاری، نرخ اصابت (Hit rate) کش کلید-مقدار و فشار کلی سیستم بستگی دارد؛ در یادداشت‌های خودِ vLLM اشاره شده که تخلیه با کرنل سفارشی ممکن است در نرخ‌های اصابت پایین به نرخ پردازش ضربه بزند و زمان‌بندی ناهمگام با دیکودینگ حدسی (Speculative Decoding) تداخل‌های شناخته‌شده‌ای دارد.

مقایسه‌ی تخلیه روی پردازنده‌ی اصلی به‌شکل توکار و LMCache

تخلیه روی پردازنده‌ی اصلی به‌شکل توکار در vLLM: محدود به همان موتور (Engine-local). بلوک‌های کش کلید-مقدار را در رمِ میزبان نگه می‌دارد. پیاده‌سازی سریع، بدون هیچ گام لغزش شبکه‌ای. امکان اشتراک‌گذاری بین چند موتور را ندارد.

اتصال‌دهنده‌ی LMCache: در مقیاس کلاستر. بلوک‌ها را در یک سرور مشترک LMCache (لایه‌ی رم CPU + Ceph/S3) ذخیره می‌کند. این بلوک‌ها برای تمام موتورها در دسترس هستند. بنچمارک‌های آن روی 16 کارت H100 منتشر شده است.

اگر تنها یک موتور زیر فشار کمبود HBM قرار دارد، گزینه‌ی توکار را انتخاب کنید. اگر چندین موتور پیشوندهای مشترک دارند (مثل معماری‌های RAG با پرامپت‌های سیستمی یکسان، یا سیستم‌های چندمستاجری با قالب‌های مشترک)، سراغ LMCache بروید.

رفتار در بنچمارک‌ها

آزمایش انجام‌شده روی 16 کارت H100 (با حافظه‌ی 80GB HBM) در 4 سرور a3-highgpu-4g نشان می‌دهد:

  • ردپای پایین کش (پرامپت‌های کوتاه، همزمانی کم): تمام پیکربندی‌ها عملکردی مشابه خط مبنا دارند و LMCache حدود 3 تا 5 درصد سربار اضافه می‌کند.
  • ردپای متوسط کش: LMCache با استفاده‌ی مجدد از پیشوندها میان موتورهای مختلف، عملکرد را ارتقا می‌دهد.
  • فراتر رفتن حجم کش از ظرفیت HBM: هر دو روش تخلیه روی پردازنده‌ی اصلی به‌شکل توکار و LMCache نرخ پردازش را به شکل چشمگیری بالا می‌برند؛ سود LMCache به دلیل اشتراک‌گذاری بین موتورها بیشتر است.

چه زمانی LMCache تعیین‌کننده است؟

  • سرویس‌دهی چندمستاجری (Multi-tenant) که پرامپت‌های سیستمی بین کاربران مشترک است.
  • خطوط لوله‌ی RAG که تکه‌های اسناد در کوئری‌های متعدد تکرار می‌شوند.
  • نسخه‌های فاین‌تیون‌شده‌ی سبک (LoRA) روی یک مدل پایه، که بازاستفاده از کش مدل پایه بارهای محاسباتی تکراری را حذف می‌کند.
  • بارهای کاری با پیش‌دستی بالا: بازیابی کش از CPU بسیار ارزان‌تر از پیش‌پرکنی دوباره تمام می‌شود.

چه زمانی نباید آن را فعال کرد؟

  • فشار پایین روی HBM — فقط سربار اضافه می‌کنید بدون اینکه سودی ببرید.
  • زمینه‌های متنی کوتاه (کمتر از 1K توکن) — زمان انتقال از زمان پیش‌پرکنی دوباره بیشتر می‌شود.
  • بارهای کاری تک‌مستاجری با یک پرامپت ثابت — هیچ بازاستفاده‌ای برای بهره‌برداری وجود ندارد.

هماهنگی با سرویس‌دهی تفکیک‌شده

ترکیب سرویس‌دهی تفکیک‌شده (فاز 17 · 17) با LMCache اثر هم‌افزایی دارد: انتقال‌های کش از استخر پیش‌پرکنی به استخر رمزگشایی (Decode) در صورت عدم استفاده در LMCache می‌نشینند؛ کوئری‌های بعدی مستقیماً از LMCache خوانده می‌شوند. مسیریاب آگاه از کش در فاز 17 · 11 هم می‌تواند ترافیک را به موتوری بفرستد که کش آن در حافظه‌ی محلی یا در حافظه‌ی مشترک LMCache تطابق دارد.

اعدادی که باید به خاطر بسپارید

  • نسخه‌ی vLLM 0.9.0: ارائه‌ی رسمی API اتصال‌دهنده.
  • نسخه‌ی vLLM 0.11.0 (ژانویه‌ی 2026): ارائه‌ی مسیر تخلیه‌ی ناهمگام؛ میزان اثرگذاری بر تاخیر سرتاسری به الگوی بار کاری، نرخ اصابت کش و فشار سیستم بستگی دارد (نه یک تضمین قطعی).
  • بنچمارک 16 کارت H100: اثر مثبت LMCache زمانی آشکار می‌شود که حجم کش از ظرفیت HBM عبور کند.
  • در فشارهای پایین HBM: ایجاد 3 تا 5 درصد سربار بدون هیچ دستاورد ملموس.
بخش‌بندی ZeROانتخاب مرحله‌ی ZeRO
موازی‌سازی ساده داده، وضعیت کامل بهینه‌ساز، گرادیان‌ها و پارامترها را روی هر GPU کپی می‌کند. رویکرد ZeRO این افزونگی را در مراحلی حذف می‌کند: مرحله‌ی 1 وضعیت‌های سنگین بهینه‌ساز Adam را بخش‌بندی می‌کند، مرحله‌ی 2 گرادیان‌ها را اضافه می‌کند و مرحله‌ی 3 خود پارامترها را بخش‌بندی می‌کند. هر مرحله حافظه‌ی مورد نیاز هر GPU را بیشتر کاهش می‌دهد و در ازای کمی ارتباط، امکان آموزش مدل‌های بسیار بزرگ‌تر را فراهم می‌سازد.

پیاده‌سازی و آزمایش

اسکریپت code/main.py یک بار کاری پر از پیش‌دستی را در دو حالتِ با و بدون LMCache شبیه‌سازی می‌کند. این کد تعداد پیش‌پرکنی‌های حذف‌شده، افزایش نرخ پردازش و نقطه‌ی سربه‌سر مصرف HBM را گزارش می‌دهد.

خروجی این درس

خروجی این درس سند outputs/skill-vllm-stack-decider.md است. این راهنما با دریافت مشخصات بار کاری و معماری دپلویمنت vLLM، بین گزینه‌های تخلیه روی پردازنده‌ی اصلی به‌شکل توکار، LMCache یا هیچ‌کدام تصمیم‌گیری می‌کند.

تمرین‌ها

  1. اسکریپت code/main.py را اجرا کنید. LMCache در چه درصدی از مصرف HBM ارزش سرمایه‌گذاری پیدا می‌کند؟
  2. یک مستاجر، پرامپت سیستمی 6K توکنی خود را در 200 کوئری در ساعت به اشتراک می‌گذارد. میزان صرفه‌جویی مورد انتظار با LMCache را به ازای هر مستاجر محاسبه کنید.
  3. سرور LMCache یک نقطه‌ی تکی شکست (SPOF) به حساب می‌آید. استراتژی پایداری و دسترس‌پذیری بالا (HA) را برای آن طراحی کنید (استفاده از رپلیکاها، طرح پشتیبان به تخلیه‌ی توکار).
  4. فرض کنید LMCache داده‌ها را روی دیسک‌های مکانیکی Ceph ذخیره می‌کند. برای یک کش 4K توکنی در مدل 70B با فرمت FP8 (حدود 500 مگابایت)، زمان خواندن چقدر است و چه نسبتی با زمان پیش‌پرکنی دوباره دارد؟
  5. تحلیل کنید که آیا مسیر ناهمگام در vLLM 0.11.0 واقعاً «بدون هزینه» است یا خیر — این سربار کجا پنهان می‌شود؟

اصطلاحات کلیدی

اصطلاح در گفت‌وگوها معنای دقیق فنی
استک عملیاتی (Production-stack) «دپلویمنت مرجع» چارت Helm کوبرنتیز به همراه Operator در vLLM
API اتصال‌دهنده (Connector API) «رابط بک‌اند کش» رابط یکپارچه‌ی بک‌اندهای ذخیره‌سازی ماژولار کش کلید-مقدار در نسخه v0.9.0+ vLLM
تخلیه روی پردازنده‌ی اصلی به‌شکل توکار (Native CPU offload) «سرریز به رم سرور» ذخیره‌ی کش کلید-مقدار در رم میزبان همان موتور
LMCache «کش کلاستری» سرور مشترک نگهداری کش کلید-مقدار میان چندین موتور روی رم CPU و دیسک
مسیر ناهمگام 0.11.0 «تخلیه‌ی غیرمسدودکننده» پنهان‌سازی عملیات تخلیه پشت استریم پردازش موتور
پیش‌دستی (Preemption) «خالی کردن جا» جابه‌جایی و بازچینی کش کلید-مقدار هنگام پر شدن HBM
استفاده‌ی مجدد از پیشوند (Prefix reuse) «پرامپت سیستمی یکسان» اشتراک بخش ابتدایی ورودی در چند کوئری؛ اصابت به کش
لایه‌ی Ceph «لایه‌ی دیسک» لایه‌ی ذخیره‌سازی پایدار زیر لایه‌ی DRAM در سلسله‌مراتب کش

برای مطالعه‌ی بیشتر

خودآزمایی

به سؤال‌ها جواب بدهید تا ببینید چقدر از درس در ذهنتان مانده است.

  1. پیش از درسابزار LMCache اساساً چه مشکلی را در استقرار vLLM حل می‌کند؟
  2. حین درسکدام API در vLLM امکان استفاده از بک‌اندهای مختلف کش کلید-مقدار را فراهم کرد؟
  3. حین درسانتشار نسخه‌ی vLLM 0.11.0 (ژانویه 2026) چه قابلیتی را به مسیر تخلیه کش کلید-مقدار (KV offload) افزود؟
  4. حین درسچه زمانی باید LMCache را به‌جای تخلیه بومی روی پردازنده‌ی اصلی (CPU offload) انتخاب کرد؟
  5. پس از درساگر حجم کش کلید-مقدار بسیار کمتر از ظرفیت HBM باقی بماند، مزیت LMCache چگونه خواهد بود؟
  6. پس از درسچرا LMCache با معماری سرویس‌دهی تفکیک‌شده (مرحله‌ی 17 · 17) ترکیب‌پذیر است؟

سؤالات متداول

چه تفاوتی میان Native CPU Offload و LMCache در vLLM وجود دارد؟

تخلیه توکار (Native) داده‌های کش را فقط در رم محلی میزبان همان موتور ذخیره می‌کند و شبکه درگیر نمی‌شود، اما LMCache کش را در سطح کلاستر ذخیره کرده و امکان اشتراک‌گذاری پیشوندها را میان تمام موتورهای vLLM فراهم می‌سازد.

استفاده از LMCache در چه سناریوهایی توصیه نمی‌شود؟

در مواردی که فشار روی حافظه HBM پایین باشد، طول زمینه‌ها زیر 1000 توکن باشد یا بارهای کاری تک‌مستاجری بدون پیشوند مشترک اجرا شوند، انتقال داده‌ها 3 تا 5 درصد سربار بیهوده ایجاد می‌کند.

مسیر ناهمگام در vLLM 0.11.0 چه مزیتی در تخلیه کش ایجاد می‌کند؟

این قابلیت اجازه می‌دهد عملیات انتقال بلوک‌های کش به رم یا حافظه ثانویه در پس‌زمینه انجام شود تا جریان محاسبات اصلی کارت گرافیک برای انتقال داده‌ها مسدود (Block) نشود.

ما رو توی گوگل بیشتر ببین

با افزودن نکست ادمین به «منابع ترجیحی» گوگل، درس‌ها و مطالب ما را در بخش اخبار برتر جستجو بیشتر می‌بینید.