چیت‌شیت

بهینه‌سازی استنتاج: کش کلید-مقدار، کوانتیزه‌سازی، دسته‌بندی

Inference Optimization: KV Cache, Quantization, Batching

کش کلید-مقدار، کوانتیزه‌سازی، دسته‌بندی و پیش‌بینی حدسی. فرمول‌ها، اعداد اسکژولر و خطاهایی که باعث افزایش تاخیر می‌شوند.

  • ۱۰ بخش
  • ۷ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. پایپ‌لاین استنتاج
  2. یک گام رمزگشایی
  3. به‌روزرسانی هسته سافت‌مکس
  4. مرجع وظایف
  5. پیش‌فرض‌ها
  6. فرمول‌ها
  7. عیب‌یابی
  8. واژه‌نامه
  9. پرسش‌ها
  10. نکات

پایپ‌لاین استنتاج

معماری
وروداستفاده مجدد از پیشوندبلوک‌های آزاداتمام پرامپتالحاقخواندندرخواستصف و ورودPrefixCacheتارنمای (trie) پرامپت مشترکپذیرشبلوک‌های آزاد کش کلید-مقدارKVCacheK و V به ازای هر توکنپیش‌پرکنیپرامپت تکه‌تکه‌شدهرمزگشایییک توکن در هر گام

یک گام رمزگشایی

گام‌به‌گام
  1. نوشتنمتد kv_cache.update مقادیر جدید K و V را برای هر لایه ذخیره می‌کند.
  2. خواندنکش، برش‌ها را تا طول فعلی برمی‌گرداند.
  3. اتنشنتابع scaled_dot_product_attention روی پیشوند کش‌شده اجرا می‌شود.
  4. پیشرویدر رمزگشایی یک‌توکنی، 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_speculative5توکن‌های پیش‌نویس در هر دور
`acceptance_rate` in `DraftModel`0.8نرخ پذیرش شبیه‌سازی‌شده
CHUNK_SIZE512توکن‌های پیش‌پرکنی در هر برش
KV_BLOCK_SIZE16توکن‌ها به ازای هر بلوک کش کلید-مقدار
KV_BLOCKS_AVAILABLE1800بودجه بلوک‌های آزمایشی

فرمول‌ها

مفهوم‌ها
بایت‌های کش کلید-مقدار
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) و تعداد بلوک‌ها را از ثابت‌های اسکژولر به دست آورید.
  • پیشوند پرامپت مشترک را در تمام درخواست‌ها کاملاً یکسان نگه دارید.
  • حافظه کش کلید-مقدار را قبل از افزایش اندازه دسته با بودجه حافظه مقایسه کنید.