چیت‌شیت

مقایسه‌ی موتورهای سروینگ

Serving Engines Compared

مقایسه‌ی رو در روی vLLM، SGLang، TRT-LLM و llama.cpp؛ زمان‌بندها، استفاده مجدد از KV، دقت، تخلیه و انتخاب بهینه.

  • ۱۰ بخش
  • ۵ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. موتورها در یک نگاه
  2. چه زمانی از کدام موتور استفاده کنیم؟
  3. حلقه‌ی زمان‌بند vLLM
  4. یک درخواست در درخت مبنا (Radix Tree)
  5. استک عملیاتی
  6. دقت و اقتصاد استک در main.py
  7. اجرای شبیه‌سازها
  8. عیب‌یابی
  9. پرسش و پاسخ
  10. واژه‌نامه

موتورها در یک نگاه

مقایسه
فاکتورvLLMSGLangTRT-LLMllama.cpp
ایده‌ی اصلیPagedAttention، دسته‌بندی پیوسته، پیش‌پرکنی تکه‌ایتوجه رادیکس، زمان‌بند آگاه از کشوزن‌های NVFP4، کش FP8 KV، و MTPسریع‌ترین روی پردازنده‌ی اصلی، بیشترین پشتیبانی از مدل‌ها
اسکژولینگزمان‌بند V1، الگوریتم FCFSاعزام اول-عمق، LRU در سطح branchپیش‌پرکنی/رمزگشایی تفکیک‌شدهکنترل کامل روی ریسه‌بندی (threading)
سخت‌افزارNVIDIA و AMD ROCmNVIDIA و AMDفقط NVIDIA، پردازنده‌های Blackwellپردازنده‌ی اصلی، Apple Silicon Metal
شاخص‌ترین رقم2,200 تا 2,400 توکن بر ثانیه، 70B FP8 روی H100حدود 16,200 در برابر 12,500 توکن بر ثانیه روی مدل 8B0.012 دلار به ازای هر 1 میلیون توکن روی GB200 NVL72نرم‌افزار Ollama بین 15 تا 30 درصد کندتر است
فرمت وزن‌هاHF safetensorsHF safetensorsکامپایل‌شده اختصاصی برای هر مدل GPUGGUF
نقطه‌ضعفترافیک سنگین مبتنی بر پیشوندپرامپت‌های غیرتکراری، افت کارایی تا سطح vLLMعدم پشتیبانی از AMD، Intel و ARMنامناسب برای مراحل عملیاتیِ پایپ‌لاین

چه زمانی از کدام موتور استفاده کنیم؟

مفهوم‌ها
vLLM
گفت‌وگوهای عمومی، بیش از 100 کاربر، پردازنده‌های گرافیکی AMD یا سخت‌افزار ترکیبی.
SGLang
ایجنت‌ها، سیستم‌های RAG و گفت‌وگوهایی با پیشوندهای مشترک طولانی.
TRT-LLM
زیرساخت‌های صرفاً NVIDIA و کارهای با اولویت هزینه روی Blackwell.
llama.cpp
پردازنده‌ی اصلی، سیستم‌های لبه (edge) یا Apple Silicon.
Ollama
کار تک‌کاربره روی لپ‌تاپ توسعه؛ نه برای محیط اشتراکی عملیاتی.
TGI
فقط استقرارهای پیشین؛ در وضعیت نگهداری از 11 دسامبر 2025.
Native CPU offload
زمانی که یک موتور دچار کمبود حافظه‌ی HBM باشد.
LMCache
پیشوندهای مشترک بین چند موتور، یا پیش‌دستی‌های پرتکرار.

حلقه‌ی زمان‌بند vLLM

کد
python
while True:
    finished = [s for s in RUNNING if s.is_done()]
    for s in finished: release_blocks(s); RUNNING.remove(s)  # بلوک‌های آزاد
    while WAITING and have_free_blocks_for(WAITING[0]):      # پذیرش در صورت وجود KV آزاد
        s = WAITING.pop(0)
        allocate_initial_blocks(s)
        RUNNING.append(s)
    batch = []
    for s in RUNNING:
        if s.in_prefill:
            batch.append(next_prefill_chunk(s))              # مثلاً 512 توکن
        else:
            batch.append(decode_one_token(s))                # 1 توکن
    run_forward(batch)                                       # یک فراخوانی ادغام‌شده‌ی GPU

یک درخواست در درخت مبنا (Radix Tree)

گام‌به‌گام
  1. درخواستپرامپت سیستم به همراه "Context: <doc A>" و "Question: Carol".
  2. زمان‌بندپیمایش درخت؛ تطابق پیشوند سیستم، 124 بلوک مجدداً استفاده شد.
  3. زمان‌بندتطابق شاخه‌ی doc A، استفاده‌ی مجدد از 31 بلوک.
  4. تخصیص‌دهندهتخصیص بلوک‌های جدید تنها به "Question: Carol"، معادل 4 بلوک.
  5. نتیجهپیش‌پرکنی 4 بلوک به‌جای 160 بلوک؛ حدود 40 برابر پیش‌پرکنی کمتر.
  6. تخلیه (Eviction)حذف کامل شاخه‌ها از برگ‌هایی با کمترین میزان استفاده.

استک عملیاتی

معماری
HTTPمسیریابیتخلیهذخیره‌سازیسرریزجمع‌آوری داده (scrape)کلاینتدرخواست‌هامسیریابآگاه از کش، رویدادهای KVموتورهای vLLMیکی به ازای هر GPU یا گروه TP/PPرابط برنامه‌نویسی اتصال‌دهندهنسخه‌ی 0.9.0 به بالا، ناهمگام در 0.11.0سرور LMCacheحافظه‌ی DRAM پردازنده‌ی اصلی، اشتراکیلایه‌ی Ceph/S3دیسک زیر لایه‌ی DRAMمشاهده‌پذیریPrometheus، Grafana و OTel

دقت و اقتصاد استک در main.py

مقایسه
فاکتورH100 + BF16 + vLLMH100 + FP8 + vLLMB200 + NVFP4 + FP8 + TRT-LLMGB200 NVL72 + TRT-LLM + Dyn
حافظه HBM به ازای GPU برحسب گیگابایت8080192192
پهنای باند HBM برحسب ترابایت بر ثانیه3.353.358.008.00
بیت‌های وزن16844
بیت‌های کش کلید-مقدار16888
ضریب MTP1.01.01.81.8
ضریب تفکیک (Disaggregation)1.01.01.62.5
هزینه به ازای هر ساعت کار GPU2.502.504.806.20

اجرای شبیه‌سازها

کار و کد
وظیفهکد
بچینگ ایستاsimulate_static(reqs, batch=16)
پیوسته به‌همراه تکه‌ایsimulate_continuous(reqs, chunked=True)
ترتیب رادیکس آگاه از کشsimulate(requests, "CACHE_AWARE")
ترتیب پیشوند درهم‌ریختهworkload_scrambled(n=80, docs=4)
ردپای HBM به ازای هر استکhbm_footprint_gb(params_b, active_b, seq_len, stack)
هزینه به ازای یک میلیون توکنcost_per_million_tokens(active_b, stack)
LMCache تحت فشار حافظه‌ی HBMsimulate("LMCACHE", reqs)
موتور مناسب محدودیت‌های شماpick_engine(hardware, scale, workload)

عیب‌یابی

عیب‌یابی
  • توقف رمزگشایی در پرامپت‌های طولانی

    علت
    فریز شدن رمزگشایی ناشی از پیش‌پرکنی
    راه‌حل
    پیش‌پرکنی تکه‌ای؛ کاهش P99 ITL از حدود 50 میلی‌ثانیه به 15 میلی‌ثانیه
  • نرخ اصابت 7٪ در پرامپت‌های مشترک

    علت
    محتوای پویا در بخش پیشوند
    راه‌حل
    قرار دادن بخش‌های ثابت در ابتدا؛ ارتقای نرخ از 7٪ به 74٪
  • از دست رفتن جهش کارایی 6.4 برابری

    علت
    تغییر ترتیب قالب به ازای هر درخواست
    راه‌حل
    ثابت کردن ترتیب اجزا
  • تکمیل ظرفیت 100٪ حافظه‌ی HBM و پیش‌پرکنی مجدد پرامپت‌های یکسان

    علت
    حذف KV بر اثر پیش‌دستی
    راه‌حل
    تخلیه روی پردازنده‌ی اصلی به‌صورت محلی یا استفاده از LMCache
  • 3 تا 5 درصد کندتر با LMCache

    علت
    فشار ناچیز روی HBM
    راه‌حل
    خاموش کردن LMCache
  • افت دقت پس از اعمال NVFP4

    علت
    وزن‌های FP4 در وظایف استدلالی
    راه‌حل
    وزن‌های FP8 به همراه فعال‌سازهای FP4
  • فروپاشی اتنشن در FP4 KV

    علت
    نیاز KV به دامنه‌ی پویای بیشتر
    راه‌حل
    نگه‌داشتن کش کلید-مقدار در فرمت FP8
  • خرابی هم‌زمان قابلیت‌ها

    علت
    ترکیب تعریف‌نشده در ماتریس سازگاری
    راه‌حل
    بررسی ماتریس سازگاری نسخه‌ی فعلی

پرسش و پاسخ

پرسش و پاسخ
چرا FCFS برای ترافیک پیشوندی نامناسب است؟
شاخه‌ی داغ را برای پذیرش درخواست‌هایی با پیشوند کوتاه حذف می‌کند.
پیش‌پرکنی تکه‌ای چه چیزی را بهبود می‌دهد؟
تاخیرهای صدک بالای TTFT و ITL؛ نه میانگین نرخ پردازش را.
شکاف کارایی 7 برابری TRT-LLM ناشی از چیست؟
پهنای باند HBM، وزن‌های NVFP4، قابلیت MTP و تفکیک وظایف.
آیا LMCache برای پرامپت‌های زیر 1,000 توکن مناسب است؟
خیر؛ زمان انتقال بیش از پیش‌پرکنی مجدد طول می‌کشد.
آیا PagedAttention باید فعال شود؟
فلگی ندارد؛ تنها تخصیص‌دهنده‌ی داخلی vLLM است.
آیا vLLM پیشوندها را مجدداً استفاده می‌کند؟
بله، با فلگ --enable-prefix-caching؛ درحالی‌که SGLang ذاتا مبتنی بر رادیکس است.

واژه‌نامه

اصطلاح‌ها
ITL
تاخیر بین‌توکنی؛ زمان سپری‌شده میان دو توکن رمزگشایی.
TTFT
زمان تا اولین توکن؛ مجموع پیش‌پرکنی، صف و شبکه.
FCFS
سیستم نوبت‌دهی اولویت با ورود؛ باعث تضعیف محلی‌سازی پیشوند می‌شود.
NVFP4
فرمت میکرومقیاس‌بندی 4 بیتی انویدیا برای وزن‌ها و فعال‌سازها.
MTP
پیش‌بینی چندتوکنی؛ پیش‌نویس ادغام‌شده در TRT-LLM.
MXFP8
نسخه‌ی میکرومقیاس‌بندی FP8 روی هسته‌های تنسور Blackwell.
Connector API
رابط حافظه‌ی ماژولار KV از نسخه‌ی 0.9.0 vLLM به بعد.
Preemption
بازآرایی و جابه‌جایی کش کلید-مقدار در زمان پر شدن HBM.