چیتشیت
متریکهای استنتاج و آزمون بار
Inference Metrics and Load Testing
چرا نتایج آزمون بار فریبنده است؟ TTFT، TPOT، نرخ پردازش موثر، P99، پرامپتهای واقعی، طوفانهای تلاش مجدد و خواندنهای پوششی (hedged reads).
فهرست مطالب
نشانهها، علتها، راهحلها
عیبیابیتست روی 500 کاربر دوام آورد، پروداکشن روی 200 شکست خورد
- علت
- پرامپتهای یکسان به کش پیشوند (prefix cache) برخورد کردند
- راهحل
--mean-input-tokensبه همراه--stddev-input-tokens
مقدار ITL در Locust بالا است، سرور مشکلی ندارد
- علت
- تله قفل سراسری مفسر: انباشت توکنسازی در کلاینت
- راهحل
- LLM-Locust یا یک بستر آزمایشی کامپایلشده
مقدار TPOT در GenAI-Perf برابر 6 میلیثانیه، در LLMPerf برابر 11 میلیثانیه
- علت
- ابزار GenAI-Perf مقدار TTFT را از ITL حذف میکند
- راهحل
- نام ابزار و تعریف دقیق آن را مشخص کنید
نرخ پردازش بالا، خروج کاربران
- علت
- نرخ پردازش موثر پایین، دم توزیع SLO را نقض میکند
- راهحل
- اعمال گیتهای کنترلی برای دیپلوی بر اساس نرخ پردازش موثر
میانگین TPOT برابر 9 میلیثانیه، نارضایتی کاربران
- علت
- دم توزیع با چولگی به راست، مقدار P99 TPOT برابر 65 میلیثانیه
- راهحل
- گزارش P50، P90، P99
جهش لحظهای TPOT به 50 میلیثانیه
- علت
- پیشپرکنی طولانی در توالی همسایه
- راهحل
- پیشپرکنی تکهای
تلاش مجدد همزمان تمام کلاینتها
- علت
- زمانهای انتظار نمایی همگامشده
- راهحل
--jitter=trueو یک--budgetمشترک
پوشش درخواستها به ظاهر بدون هزینه است
- علت
- لغو درخواست کار سرور را متوقف نمیکند
- راهحل
- محاسبه کار مجموعهدادهی نمونه در کنار تاخیر
فرمولهای متریک
کدtext
TTFT = queue_time + network_request + prefill_time # پیش از آغاز استریمینگ
TPOT = (decode_forward_time + scheduler_overhead) / tokens_produced # مشابه ITL
E2E = TTFT + TPOT * output_tokens + network_response # غلبه TPOT در بالای 500 توکن
throughput = total_output_tokens / elapsed_time # صرفاً کارایی ناوگان سرور
goodput = fraction of requests meeting (TTFT <= a) AND (TPOT <= b) AND (E2E <= c)
پروفایلهای SLO در main.py
مقایسه| فاکتور | آسانگیر (loose) | هدف (target) | سختگیر (tight) |
|---|---|---|---|
| TTFT به میلیثانیه | 800 | 500 | 300 |
| TPOT به میلیثانیه | 25 | 15 | 10 |
| E2E به میلیثانیه | 3000 | 2000 | 1500 |
| حکم ارزیابی | SHIPPABLE در 99٪ | DEGRADED در 95٪ | FAILING پایینتر از آن |
چهار الگوی بارگذاری
مقایسه| فاکتور | حالت پایدار (Steady-state) | شیب صعودی (Ramp) | جهش لحظهای (Spike) | آزمون استقامت (Soak) |
|---|---|---|---|---|
| شکل الگو | RPS ثابت | از 0 تا RPS هدف | افزایش ناگهانی 3 تا 10 برابری RPS و بازگشت | حالت پایدار |
| مدت زمان | 30 تا 60 دقیقه | 15 دقیقه | 2 دقیقه | 4 تا 8 ساعت |
| موارد شناسایی | پسرفتهای خط مبنا | نقطه شکست ظرفیت، ناهنجاریهای راهاندازی اولیه (warm-up) | تاخیر مقیاسپذیری خودکار، اشباع صف، شروع سرد | نشت حافظه، دریفت مخزن اتصالات (connection-pool) |
موارد کاربرد هر ابزار
مفهومها- LLMPerf
- اجرای بنچمارک. توکنسازی مبتنی بر Rust، پرامپتهای دارای میانگین/انحراف معیار.
- GenAI-Perf
- نیاز به مرجع NVIDIA. مقدار ITL شامل TTFT نمیشود.
- LLM-Locust
- تیم شما از Locust استفاده میکند. تله قفل سراسری مفسر را رفع میکند.
- guidellm
- بنچمارک ترکیبی و مصنوعی در مقیاس بالا.
- k6 v2026.1.0
- گیتهای کنترلی CI/CD و آزمونهای SLA. سازگار با استریمینگ، بدون GIL.
- k6 Operator
- آزمونهای توزیعشده با CRDهای TestRun / PrivateLoadZone.
- Vegeta
- اشباع یک درگاه (gateway) یا محدودیت نرخ درخواست با نرخ ثابت.
- نسخه پیشفرض Locust 2.43.3
- هرگز به تنهایی برای LLMها استفاده نشود. دچار تله قفل سراسری مفسر است.
اجرای آزمایشها
کدbash
python3 scripts/project_test.py retry-storm-lab --init /tmp/retry-storm-lab-work
python3 scripts/project_test.py retry-storm-lab --all --solution --strict
cd projects/retry-storm-lab/solution
go run . --clients 20 --budget 60 --jitter=false --out /tmp/synchronized.json # انتظارهای همگامشده
go run . --clients 20 --budget 60 --jitter=true --seed 7 --out /tmp/jittered.json # پراکندگی بر اساس seed
go run . --local-http --clients 20 --budget 12 --out /tmp/retry-wire.json # درخواست HTTP لوپبک واقعی
node --experimental-strip-types cli.ts /tmp/retry-wire.json # اعتبارسنجی شمارندهها
cd projects/hedged-request-lab/solution
go run . --samples 3 --delay-ms 10 --out /tmp/hedge-report.json # درخواست اولیه 80 میلیثانیه، ثانویه 5 میلیثانیه
مقادیر پیشفرض فلگهای آزمایش
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
--clients | 20 | کلاینتهای همروند |
--budget | 12 | تلاشهای مجدد اشتراکی |
--base-ms | 10 | عقبگرد اولیه |
--max-ms | 80 | حداکثر زمان انتظار تلاش مجدد |
--attempts | 4 | حداکثر دفعات تلاش به ازای هر کلاینت |
--capacity | 5 | ظرفیت شبیهسازیشده به ازای هر میلیثانیه دقیق |
--delay-ms | 10 | تاخیر درخواست پوششی (hedge delay) |
--samples | 3 | نمونهها به ازای هر سیاست |
رشتههای خطای آزمایش
دستورها| دستور | عملکرد |
|---|---|
invalid bounded policy | پایه کمتر از 1، سقف کمتر از پایه، یا دفعات تلاش بیشتر از 10 |
non-retryable HTTP status | وضعیت مغایر با 429، 502، 503 یا 504 است |
server delay exceeds policy cap | مقدار Retry-After بیش از سقف سیاست است |
retry attempts or shared budget exhausted | هیچ تلاش یا بودجهای باقی نمانده است |
winner requires HTTP 200 | یک خطای سریع نمیتواند برنده درخواست پوششی شود |
body exceeds 64 KiB | حجم بدنه پاسخ بیش از حد مجاز خواندن است |
no valid response | هر دو تلاش پوششی شکست خوردند |
samples must be 1..100 | تعداد نمونه خارج از محدوده است |
یک خواندن پوششی (hedged read)
گامبهگام- Clientدرخواست GET اولیه و زمانسنج تاخیر را شروع میکند.
- Clientپاسخ معتبر اولیه قبل از اتمام زمانسنج، مانع ارسال درخواست پوششی میشود.
- Clientدر غیر این صورت حداکثر یک درخواست ثانویه ارسال میکند. تاخیر بین 0 تا 1 ثانیه است.
- Validatorفقط وضعیت HTTP 200 با مقدار JSON غیرخالی برنده است.
- Clientدرخواست بازنده را لغو کرده و حداکثر 100ms آن را زیر نظر میگیرد.
- Receiptتلاشهای دیرهنگام، رصدنشده و تاخیر برنده را ثبت میکند.
- Fixtureکار سرور را که پس از لغو ادامه دارد محاسبه میکند.
محاسبات عددی نمونه
پرسش و پاسخ- مقدار TTFT برابر 500 میلیثانیه، رمزگشایی 100 توکن در 700 میلیثانیه؟
- در GenAI-Perf مقدار
ITL = 700/99 = 7.07 ms. در LLMPerf مقدارITL = 1200/100 = 12.00 ms. - 20 کلاینت، 4 تلاش، بودجه 12؟
- حداکثر 32 فراخوانی در کل.
- پایه 10، سقف 25، بدون نوسان تصادفی؟
- زمانهای انتظار 10,20,25,25.
- سه نمونه خط مبنا و سه نمونه پوششی؟
- 3 فراخوانی در برابر 6 فراخوانی. مجموعهدادهی نمونه 9 مورد را ثبت میکند.
- نمونههای [2,4,10,20,80]؟
- P50=10، P95=80، حداکثر=80.
- درخواست اولیه HTTP 500 در 1ms، درخواست ثانویه معتبر در 15ms؟
- درخواست ثانویه برنده میشود. خطای سریع برنده نخواهد بود.
اعداد مرجع و گیتهای کنترلی
نکتهها- مدل Llama-3.1-8B-Instruct روی TRT-LLM: میانگین TTFT برابر 162 ms، میانگین TPOT برابر 7.33 ms.
- معیار SLO برای مدل 70B کاربران عادی: TTFT P99 <= 800 ms، TPOT P99 <= 25 ms، نرخ پردازش موثر >= 99%.
- اجرا با 2 برابر حداکثر همروندی. تکرار بین 30 تا 50 بار.
- استفاده از
--mean-input-tokens 800 --stddev-input-tokens 300 --mean-output-tokens 150. - گیت CI: تاخیر P50/P95 TTFT، خطای 5xx کمتر از 5٪، TPOT زیر آستانه. شکست بیلد در صورت نقض.
- انتشار نام ابزار، نسخه ابزار، مدل، سختافزار، همروندی و توزیع پرامپت.