چیتشیت
بهینهسازی استنتاج: کش کلید-مقدار، کوانتیزهسازی، دستهبندی
Inference Optimization: KV Cache, Quantization, Batching
کش کلید-مقدار، کوانتیزهسازی، دستهبندی و پیشبینی حدسی. فرمولها، اعداد اسکژولر و خطاهایی که باعث افزایش تاخیر میشوند.
فهرست مطالب
پایپلاین استنتاج
معمارییک گام رمزگشایی
گامبهگام- نوشتنمتد
kv_cache.updateمقادیر جدید K و V را برای هر لایه ذخیره میکند. - خواندنکش، برشها را تا طول فعلی برمیگرداند.
- اتنشنتابع
scaled_dot_product_attentionروی پیشوند کششده اجرا میشود. - پیشرویدر رمزگشایی یکتوکنی،
kv_cache.advance(1)طول را جلو میبرد.
بهروزرسانی هسته سافتمکس
کدpython
new_m = max(m, *scores) # بیشینه متغیر (running max)
if m == float("-inf"):
exp_old = 0.0
else:
exp_old = math.exp(m - new_m) # تغییر مقیاس مجموعهای قبلی
exp_new = [math.exp(sc - new_m) for sc in scores]
s = s * exp_old + sum(exp_new) # مجموع متغیر (running sum)
مرجع وظایف
کار و کد| وظیفه | کد |
|---|---|
| شمارش بایتهای کش کلید-مقدار | kv_cache_bytes(N, n_layers, n_heads_kv, d_head, dtype=2) |
| خروجی اتنشن کاشیکاریشده (tiled) | tiled_softmax_dot(q, Ks, Vs, tile=4) |
| شبیهسازی دستهبندی | simulate_continuous_batching(requests, batch_size) |
| کش کردن پیشوند مشترک | PrefixCache(max_entries=1000) |
| تولید حدسی توکنها | speculative_decode(draft_model, target_model, context, num_speculative=5) |
| بررسی گنجایش حافظه | memory_budget(config, gpu_memory_gb) |
پیشفرضها
پیشفرضها| تنظیم | پیشفرض | یادداشت |
|---|---|---|
`dtype` in `kv_cache_bytes` | 2 | بایت به ازای هر مقدار. fp16 یا bf16 |
`tile` in `tiled_softmax_dot` | 4 | کلیدها در هر کاشی (tile) |
`max_entries` in `PrefixCache` | 1000 | محدودیت گرههای trie |
num_speculative | 5 | توکنهای پیشنویس در هر دور |
`acceptance_rate` in `DraftModel` | 0.8 | نرخ پذیرش شبیهسازیشده |
CHUNK_SIZE | 512 | توکنهای پیشپرکنی در هر برش |
KV_BLOCK_SIZE | 16 | توکنها به ازای هر بلوک کش کلید-مقدار |
KV_BLOCKS_AVAILABLE | 1800 | بودجه بلوکهای آزمایشی |
فرمولها
مفهومها- بایتهای کش کلید-مقدار
2 * N * n_layers * n_heads_kv * d_head * dtype.- کش کلید-مقدار به ازای هر توکن
- دو تنسور ضرب در تعداد لایهها، هدهای کلید-مقدار، اندازه هد و اندازه هر آیتم.
- سافتمکس بیشینه متغیر
- خروجی با سافتمکس کامل مطابقت دارد. فقط یک کاشی نگه داشته میشود.
- تعداد بلوکها
- سقف تقسیم کل توکنها بر اندازه بلوک.
- مقیاس کوانتیزهسازی
- بیشینه مقدار مطلق تقسیم بر سقف بازه عدد صحیح.
عیبیابی
عیبیابیجستجوی پیشوند 0 برمیگرداند
- علت
- توکنهای ابتدایی متفاوتاند، بنابراین پیمایش trie متوقف میشود
- راهحل
- پرامپت مشترک را از توکن اول دقیقاً یکسان نگه دارید
درج در trie متوقف میشود
- علت
- رسیدن به سقف
max_entries - راهحل
- افزایش
max_entries
جایگاههای دسته بیکار میمانند
- علت
- بچینگ ایستا منتظر طولانیترین خروجی میماند
- راهحل
- استفاده از دستهبندی پیوسته
توقف رمزگشایی روی پرامپت طولانی
- علت
- پیشپرکنی تکهتکه نشده است
- راهحل
- تنظیم
chunkedتا پیشپرکنی ازCHUNK_SIZEاستفاده کند
کندتر شدن تولید حدسی
- علت
- نرخ پذیرش پایین
- راهحل
- اندازهگیری نرخ پذیرش قبل از فعالسازی آن
مدل در حافظه جا نمیشود
- علت
- وزنها بیشتر از حافظه GPU هستند
- راهحل
- کوانتیزهسازی یا افزودن GPU
واژهنامه
اصطلاحها- کش کلید-مقدار
- کلیدها و مقادیر ذخیرهشده برای توکنهای گذشته تا دوباره محاسبه نشوند.
- پیشپرکنی
- پردازش کل پرامپت قبل از تولید اولین توکن خروجی.
- رمزگشایی
- تولید یک توکن خروجی در هر گام.
- TTFT
- زمان تا اولین توکن. با پایان پیشپرکنی تعیین میشود.
- ITL
- تاخیر بینتوکنی. زمان سپریشده بین توکنهای خروجی.
پرسشها
پرسش و پاسخ- چرا K و V ذخیره میشوند؟
- در هر گام رمزگشایی خوانده میشوند تا نیازی به محاسبه مجدد پیشوند نباشد.
- چرا بچینگ ایستا اتلاف منابع دارد؟
- هر سطر منتظر بزرگترین طول خروجی میماند.
- چرا پیشپرکنی را تکهتکه کنیم؟
- یک پرامپت طولانی مانع رمزگشایی توکنهای درخواستهای دیگر میشود.
- چرا ابزارهای بنچمارک روی TPOT اختلاف دارند؟
- یکی زمان TTFT را در نرخ محاسبه میکند و دیگری نه.
نکات
نکتهها- تاخیر P99 را گزارش کنید، نه میانگین. هر درخواست را با هر سه محدودیت بررسی کنید.
- اندازه تکهها (chunk size) و تعداد بلوکها را از ثابتهای اسکژولر به دست آورید.
- پیشوند پرامپت مشترک را در تمام درخواستها کاملاً یکسان نگه دارید.
- حافظه کش کلید-مقدار را قبل از افزایش اندازه دسته با بودجه حافظه مقایسه کنید.