چیت‌شیت

سرویس‌دهی LLM با SGLang

LLM Serving with SGLang

راه‌اندازی، تعیین اندازه، سنجش و رفع اشکال سرور SGLang. نگارش SGLang 0.5.22.

  • ۱۲ بخش
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. راه‌اندازی سرور
  2. سه فرایند
  3. درخواست‌ها و بررسی‌ها
  4. بنچمارک سرور شما
  5. پیش‌فرض‌های مهم
  6. رفع این خطاها
  7. ترتیب بهینه‌سازی
  8. اعداد مهم برای پایش
  9. رخدادهای ثبت‌شده
  10. واژه‌نامه
  11. پرسش‌ها
  12. نکات

راه‌اندازی سرور

کد
bash
export HF_HUB_OFFLINE=1                                                                                                            # عدم ارتباط با Hub پس از کش شدن مدل‌ها
sglang serve --model-path <model> --host 127.0.0.1 --port 30000 --enable-cache-report --enable-metrics --mem-fraction-static 0.85  # فلگ‌های L4
curl http://127.0.0.1:30000/ready                                                                                                  # کد 200 هنگام پذیرش درخواست‌ها توسط سرور

سه فرایند

معماری
HTTPZMQدستهجایگاه‌هاشناسه‌هامتنClientPOST /generateTokenizerManagerمتن به شناسه‌های توکنSchedulerدسته‌ها و استخر KVDetokenizerشناسه‌ها به متنمدل روی GPUگذر رو به جلواستخر KVجایگاه‌ها به ازای هر توکن

درخواست‌ها و بررسی‌ها

کار و کد
وظیفهکد
ارسال یک درخواست بومیPOST /generate
پرسش در قالب چت OpenAIPOST /v1/chat/completions
خواندن اصابت‌های کش یک درخواست`meta_info` field `cached_tokens`
آزمون ارزیابی آمادگی/ready
تثبیت پراکندگی طول در بنچمارک--random-range-ratio 1.0
پیمایش یک سقف همزمانی--max-concurrency 8
ارسال با نرخ ورود ثابت--request-rate <rate>
آزمون پایداری خروجیpython3 -m sglang.test.test_deterministic --n-trials 50 --test-mode single

بنچمارک سرور شما

دستورها
دستورعملکرد
python -m sglang.benchmark.serving --backend sglang --port 30000 --dataset-name random --num-prompts 32 --max-concurrency 8 --seed 7ارسال 32 پرامپت تصادفی با حداکثر 8 درخواست همزمان، سپس چاپ گزارش
--random-input-len 512 --random-output-len 128تنظیم طول پرامپت و پاسخ
--random-range-ratio 1.0ثابت نگه‌داشتن طول تمام پرامپت‌ها بر اساس مقدار درخواستی. پیش‌فرض 0.0 میانگین را تقریباً نصف می‌کند
--request-rate <rate>ارسال زمان‌بندی‌شده‌ی درخواست‌ها، تا سرور مانند ترافیک واقعی بتواند عقب بیفتد

پیش‌فرض‌های مهم

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
--schedule-policyfcfslpm ترتیب مقاله است، نه پیش‌فرض
--schedule-conservativeness1.0وقتی لاگ عقب‌نشینی‌ها را نشان داد، آن را افزایش دهید
--radix-eviction-policylruتنها پس از اندازه‌گیری نرخ اصابت تغییر دهید
--kv-cache-dtypeautoنوع داده‌ی مدل را حفظ می‌کند
--stream-interval1استریم پس از هر گام
--tp-size1یک GPU، مگر اینکه وزن‌ها به مقدار بیشتری نیاز داشته باشند
--cache-threshold0.3نرخ تطابق Gateway برای پیوستگی پیشوند

رفع این خطاها

عیب‌یابی
  • RuntimeError: [METAL] Command buffer execution failed در 32 درخواست

    علت
    اندازه‌ی استخر روی 87 درصد حافظه‌ی آزاد تنظیم شده
    راه‌حل
    فلگ --mem-fraction-static 0.4 را ارسال و ری‌استارت کنید
  • میانه TTFT نزدیک به 28 ثانیه با وجود حافظه‌ی آزاد GPU

    علت
    پذیرش درخواست‌ها را به دلیل پر بودن استخر به صف می‌کند
    راه‌حل
    --schedule-conservativeness را افزایش یا --max-running-requests را کاهش دهید
  • حلقه‌ی خطای KV cache pool is full. Retract requests.

    علت
    پیش‌بینی بیش از حد جسورانه است
    راه‌حل
    --schedule-conservativeness را افزایش داده و مقدار واقع‌بینانه‌ی max_new_tokens بفرستید
  • RuntimeError: The memory capacity is unbalanced

    علت
    یک کارت TP حافظه را با پادهای دیگر به اشتراک می‌گذارد
    راه‌حل
    کارت دیگر را آزاد کرده و ری‌استارت کنید. هیچ فلگی این بررسی را غیرفعال نمی‌کند
  • cuda graph: False در سطرهای رمزگشایی زیر بار

    علت
    دسته‌ی رمزگشایی بالاتر از حد مجاز گراف است
    راه‌حل
    --cuda-graph-max-bs-decode را روی اوج همزمانی تنظیم کنید
  • ambiguous option: --cuda-graph-max-bs

    علت
    این فلگ در v0.5.22 تفکیک شد
    راه‌حل
    از --cuda-graph-max-bs-decode یا --cuda-graph-max-bs-prefill استفاده کنید
  • #cached-token: 0 در هر تکرار

    علت
    شناسه‌ی تصادفی در ابتدای پرامپت سیستم
    راه‌حل
    شناسه را به انتها منتقل کرده یا حذفش کنید

ترتیب بهینه‌سازی

گام‌به‌گام
  1. سنجشاجرای sglang.benchmark.serving در سه سقف با فلگ --random-range-ratio 1.0.
  2. حافظهتنظیم --mem-fraction-static روی هر ماشین اشتراکی.
  3. پرامپت‌هاقرار دادن متن مشترک در ابتدا و دور نگه داشتن شناسه‌های درخواست از بخش آغازین.
  4. سقفتنظیم --max-running-requests در نقطه‌ی زانویی اندازه‌گیری‌شده.
  5. کرنل‌هاتغییر تنظیمات گراف و اتنشن به صورت تک‌به‌تک.
  6. موازی‌سازیافزودن --tp-size یا --dp-size تنها زمانی که یک رپلیکا اشباع شد.

اعداد مهم برای پایش

مفهوم‌ها
sglang:token_usage
نزدیک به 1.0 یعنی استخر KV پر است.
sglang:num_queue_reqs
بالاتر از 0 برای چند دقیقه یعنی سرور از نقطه‌ی زانویی خود عبور کرده است.
sglang:cache_hit_rate
یک سنجه‌ی بازه‌ای. نرخ را از sglang:prefill_effective_tokens_total محاسبه کنید.
cached_tokens
تعداد توکن‌های پرامپت بازاستفاده‌شده از کش.
نرخ پردازش موثر
درخواست‌ها در ثانیه‌ای که به طور همزمان به اهداف TTFT و TPOT می‌رسند.

رخدادهای ثبت‌شده

مفهوم‌ها
مورد #36889
یک سقف Mamba محدودیت درخواست را روی 2 گذاشت و تنها یک خط info آن را اعلام کرد.
مورد #17411
ارتقای FlashInfer سرعت رمزگشایی Hopper را هفت برابر کندتر کرد.
مورد #5274
معماری EAGLE-3 سرعت دسته-1 را دو برابر کرد و همزمانی 20 را یک‌چهارم کاهش داد.
مورد #35129
حذف هش اختصاصی هر نشست نرخ اصابت را از 66.8 به 94.4 درصد رساند.

واژه‌نامه

اصطلاح‌ها
ITL
تاخیر بین توکن‌ها (inter-token latency)، فاصله‌ی زمانی میان توکن‌ها.
MLA
اتنشن چندسر نهفته (multi-head latent attention)، ساختار فشرده‌ی KV استفاده‌شده توسط DeepSeek.
MoE
ترکیب متخصصان (mixture of experts)، که در آن هر توکن از چند متخصص استفاده می‌کند.
EPLB
توازن بار جای‌گذاری متخصصان در میان GPUها.
PD
جداسازی پیش‌پرکنی و رمزگشایی، با اجرای پیش‌پرکنی و رمزگشایی روی سرورهای مجزا.

پرسش‌ها

پرسش و پاسخ
وقتی زمان تا اولین توکن بالاست و GPU بیکار است، به کجا نگاه کنم؟
پیش از کرنل‌ها، فرایند توکنایزر را بررسی کنید.
چرا استخر بزرگ‌تر هیچ نرخ پردازشی اضافه نمی‌کند؟
در اجراهای ما استخر هرگز در 64 کاربر پر نشد.
آیا باید latest را مستقر کنم؟
خیر. یک برچسب مثل v0.5.22 را تثبیت کنید.

نکات

نکته‌ها
  • سرورها را با --enable-cache-report و --enable-metrics راه‌اندازی کنید.
  • اندازه‌ی استخر را پیش از تعیین ظرفیت کلاینت‌ها، در لاگ راه‌اندازی بخوانید.
  • سیگنال SIGTERM را فقط به فرایند اصلی ارسال کنید.
  • برای آزمون‌های ارزیابی زنده‌بودن، SGLANG_ENABLE_HEALTH_ENDPOINT_GENERATION=false را تنظیم کنید.