Phase 17: Infrastructure & Production

پیشگویی-Cache خدمت Radix توجه و KV استفاده مجدد

به عنوان یک منبع قابل استفاده مجدد درجه اول که در یک درخت رادیکس ذخیره شده است، KV cache را در نظر بگیرید و تغییر برنامه ریزی با آن انجام دهید: به جای FCFS (اولین نفر، اولین نفر خدمت شده) به عنوان برنامه های vLLM، یک برنامه نویس آگاه از کیش درخواست هایی را با پیشگام های مشترک طولانی تر اولویت می دهد. SGLang موتوره که در این ایده ساخته شده است. در Llama 3.1 8B با پیام های 1K مانند ShareGPT، SGLang به ~ 16,200 توک / ثانیه به ~ 12,500 vLLM، یک ~ 29٪ برتری می رساند. در مواردی که با فشار های سنگین RAG کار می کنند، این مزیت به 6.4x می رسد. در موارد کلانگ صوتی، میزان ضربه های حافظه ی پیشگیری 86 درصد پاک شد. در سال 2026 در 400،000+ GPU در xAI، LinkedIn، Cursor، Oracle، GCP، Azure، AWS استفاده می شود. مسئله این است که عدد 6.4x با عدم مطابقت سفارش پیش فرض بخار می شود

Type: Learn

Languages: Python (stdlib, toy radix-tree cache + cache-aware scheduler)

Prerequisites: Phase 17 · 04 (Serving Engine Internals), Phase 14 (Agentic RAG)

Time: ~75 minutes

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

  • نمودار Radix توجه: چگونه پیشگویی ها در یک درخت رادیکس ذخیره می شوند و چگونه بلوک های KV در میان دنباله های ریشه ای در همان شاخه به اشتراک گذاشته می شوند.
  • برنامه ریزی آگاه از کیش و اینکه چرا FCFS برای ترافیک سنگین پیش فرض اشتباه است را توضیح دهید.
  • سرعت انتظار می رود را برای یک بار کاری محاسبه کنید با توجه به نرخ ضربه پیش فرض-کاش و توزیع طول فوری.
  • رشته سفارش سریع را نام بده که باعث می شود تعداد 6.4x واقعی به مقابل یک مثبت از دست رفته باشد.

مشکل

در سرویس کلاسیک هر درخواست را به عنوان نامشفق می شناسد. حتی اگر 5000 درخواست RAG با همان 2,000 توکن سیستم و همچنین همان پیش فرض بازیافت شروع شود، vLLM پیش از 5000 بار پیش از 2000 توکن را پر می کند. GPU کار مشابه را بارها و بارها انجام می دهد.

مشاهده: پیام های در بار کاری agentic و RAG تقریبا همیشه پیش نویس های طولانی را به اشتراک می گذارند. پیام های سیستم، طرح های ابزار، نمونه های چند عکس، سرپرستی بازیافت، تاریخچه مکالمه همه در میان درخواست ها تکرار می شوند. اگر شما یک بار پیش نویس KV را برای آن پیش نویس ذخیره کرده و دوباره استفاده می کنید، دوباره آن را پر نمی کنید.

RadixAttention دقیقاً این کار را انجام می دهد. توکن ها در یک درخت رادیکس شاخص می شوند؛ هر گره مالک بلوک های KV برای ردیابی توکن در مسیر خود از ریشه است. یک درخواست جدید در درخت راه می رود: هر گره ای که توکن آن را مطابقت می دهد دوباره از بلوک های KV گره استفاده می کند. هزینه پر کردن پیش از آن متناسب با ضمیمه "نوی" می شود، نه پرامپت کامل.

چالش برنامه ریزی است. اگر دو درخواست یک پیشگویی 2000 توکن را به اشتراک بگذارند و یک سوم فقط 200 توکن از همان پیشگویی را به اشتراک بگذارند، شما می خواهید دو درخواست طولانی به اشتراک گذاشته شده را به طور مشترک به اشتراک بگذارید تا پیشگویی طولانی در HBM باقی بماند. FCFS برعکس را انجام می دهد آن را به هر کسی که اول آمد خدمت می کند، به طور بالقوه شاخه داغ را قبل از اینکه درخواست بعدی پیشگویی طولانی به وقوع برسد، اخراج می کند.

مفهوم

درخت رادیکس به عنوان شاخص KV

یک درخت رادیکس (تراپی کمپیکت) تسلسل های توکن را ذخیره می کند. هر گره دارای یک دامنه توکن است و بلوک های KV برای آن محدوده محاسبه می شوند. کودکان تسلسل را یک یا چند توکن گسترش می دهند.

root
 |- "You are a helpful assistant..."  (2,000 tokens, 124 KV blocks)
      |- "Context: <doc A>..."        (500 tokens, 31 blocks)
           |- "Question: Alice..."    (80 tokens, 5 blocks)
           |- "Question: Bob..."      (95 tokens, 6 blocks)
      |- "Context: <doc B>..."        (520 tokens, 33 blocks)

یک درخواست جدید با سیستم پرامپت + "تحت: <doc A>" + "سوال: Carol" وارد می شود. برنامه نویس: مطابقت با پیشگویی سیستم (124 بلوک دوباره استفاده می شود) ، مطابقت با شاخه doc-A (31 بلوک دوباره استفاده می شود) ، سپس بلوک های تازه را فقط برای "سوال: Carol" (4 بلوک) اختصاص می دهد. هزینه پر کردن پیش: 4 بلوک از توکن های جدید. بدون درخت: 160 بلوک. ~40x صرفه جویی در پر کردن پیش.

برنامه ریزی با آگاهی از کیش

استفاده مجدد با پشتیبانی از درخت رادیکس بی فایده است اگر حافظه کش خراب شود. دو سیاست کلیدی:

  1. Depth-first dispatchوقتی درخواست بعدی را از صف انتخاب می کنید، درخواست های ریشه ای را در همان شاخه با مجموعه اجرا فعلی ترجیح دهید. این امر شاخه داغ را بسته نگه می دارد.
  2. LRU at branch level, not block level. شاخه های کامل (از کوتاه ترین برگ های مورد استفاده) را به جای بلوک های جداگانه حذف کنید، بنابراین شکل مخزن با شکل رادیکس مطابقت دارد.

FCFS هر دو را نقض می کند. درخواست به اشتراک گذاشتن 2000 توکن پشت درخواست به اشتراک گذاشتن 50 قرار دارد، سپس شاخه 2,000 توکن اخراج می شود تا 50 توکن را بپذیرد.

شماره های مرجع که باید یاد بگیرید

  • Llama 3.1 8B، H100، ShareGPT 1K: SGLang ~ 16,200 توک/س vs vLLM ~ 12,500 (~ 29٪ کناره).
  • RAG با پیش فرض سنگین (سیستم مشابه + مدارک مشابه، سوال متفاوت): تا 6.4x در SGLang.
  • بار کاری کلون صدا: 86.4٪ نرخ ضربه های پیش فرض-کاش.
  • نرخ تولید در میان مشتریان SGLang: 50-99٪ بسته به نظم سریع.
  • در سال 2026 در 400 هزار گپشو استفاده خواهد شد.

سفارش تو رو گرفت

تعداد 6.4x به ترتیب ثابت قالب های فوری متکی است. اگر مشتری شما دستورات را به عنوان [system, tools, context, history, question]در بعضی از درخواست ها و[system, context, tools, history, question]در بعضی دیگر، درخت نمی تواند پیشگویی مشترک را پیدا کند. آنچه به عنوان پیشگویی مشترک برای یک انسان به نظر می رسد دو ردیف متمایز برای درخت رادیکس است.

مهندس: قالب پرامپت شما یک کلید کیش است. ترتیب را اصلاح کنید. همه چیز را که تغییر ناپذیر است (سیستم، ابزارها، طرح ها) در اولویت قرار دهید. پس از آن زمینه بازیافت را قرار دهید. سوال کاربر را در آخر قرار دهید. محتوای پویا را در پیشگویی قرار ندهید.

مورد واقعی از تحقیقات: حرکت محتوای پویا از پیشگویی ذخیره سازی یک انتشار از 7٪ به 74٪ میزان ضربه ذخیره سازی در یک تغییر.

جایی که RadixAttention برنده و شکست خورده

برنده شدن:

  • RAG (مطابق مشابه بازیافت، سوال متفاوت)
  • عوامل (سکهای ابزار مشابه، سوال های مختلف).
  • با برنامه بلند تماس بگیرید
  • بار کاری صدا / بینایی با پیش فرض های تکراری.

از دست دادن (به سطح vLLM باز می گردد):

  • تولید یک بار با پیام های منحصر به فرد (تکامل کد، چت باز بدون پیام سیستم)
  • پیام های پویا که هر درخواست محتوای منحصر به فرد را به پیشگویی می گذارد.

چرا این یک مشکل برنامه ریزی کننده است، نه فقط یک مشکل هسته ای

شما می توانید KV را به عنوان یک ترفند هسته ای پیاده سازی کنید. بینش SGLang این است که ترفند فقط در صورتی پرداخت می شود که برنامه نویس شعبه گرم را ساکن نگه دارد. یک سیاست ساده "ترفند اگر در دسترس باشد" به زیر بار مخلوط ذخیره سازی را به شدت خراب می کند. برنامه نویس شاخص درخت رادیکس چیزی است که ترفند هسته را به یک 29٪ لبه تولید تبدیل می کند.

تعامل با vLLM

این دو سیستم رقبا سخت نیستند. در سال 2026 vLLM اضافه شده است پیشگویی ذخیره سازی (--enable-prefix-cachingدر این حالت، در حالت پیش فرض، VLLang به عنوان یک کاربری با استفاده مجدد از پیش فرض استفاده می شود. برای سرویس های عمومی بدون الگوهای پیش فرض قوی، vLLM برابر یا بهتر است.

ازش استفاده کن

code/main.pyیک کاش کای کایک با دو سیاست: FCFS و کاش آگاه را اجرا می کند. بار کاری مشابه را از طریق هر دو اجرا می کند، نرخ ضربه و دلتای تولید پیش فرض کاش را گزارش می دهد. سپس بار کاری "سکرامل آرڈر" را اجرا می کند تا سقوط 6.4x را نشان دهد.

-باده

این درس به ما کمک می کندoutputs/skill-radix-scheduler-advisor.md. با توجه به یک توضیحات بار کاری (شکل قالب فوری، الگوی بازیافت، تعداد مستاجران همزمان) ، یک نسخه سفارش فوری و یک قرار دادن یا عدم پذیرش SGLang را تولید می کند.

تمرینات

  1. فرار کنcode/main.py. مقایسه FCFS و cache-conscious در یک بار کار. دلتا از کجا می آید پس انداز پیش پر کردن، پس انداز رمزگذاری، یا تاخیر صف؟
  2. بار کار رو تغییر بده تا به طور تصادفی به سمتش برگرد[system, tools, context]دوباره اجرا کنيد، چه اتفاقي براي ضربه زدن به سرعت ميفته؟
  3. هزینه HBM را برای نگهداری یک سیستم فوری 2,000 توکن به عنوان یک شاخه رادیکس در Llama 3.1 8B محاسبه کنید. هزینه یک دسته 16 ردیف بدون استفاده مجدد از پیشگام را مقایسه کنید.
  4. مقاله SGLang RadixAttention را بخوانید. در سه جمله توضیح دهید که چرا اخراج LRU شکل درخت در زیر بار سنگین پیش فرض LRU شکل بلوک را می پیروزد.
  5. یک مشتری فقط 8% میزان ضربه های حافظه کش را گزارش می دهد. سه علت احتمالی و تشخیصی را که برای هر یک از آنها اجرا می کنید نام ببرید.

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

TermWhat people sayWhat it actually means
RadixAttention"the SGLang thing"KV cache indexed as a radix tree so shared prefixes reuse blocks
Radix tree"compact trie"Tree where each node owns a token range and its KV blocks
Cache-aware scheduler"hot-branch-first"Scheduler that prefers requests sharing the resident branch
Prefix-cache hit rate"how much of your prompt was free"Fraction of prompt tokens served from reused KV blocks
FCFS"first-come first-served"Default scheduling that breaks prefix locality
Branch-level LRU"evict the leaf"Eviction policy matched to radix shape
Prompt template ordering"the cache key"The prompt's component order determines what the tree can share
System prompt pinning"resident prefix"Keep the immutable system portion pinned to avoid eviction thrash

خواندن بیشتر

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.