مدلهای زبانی بزرگ (مثل GPT) بر پایهی معماری Transformer ساخته شدهاند. قلب این معماری یک مفهوم کلیدی است: Attention.
برای اینکه inference این مدلها سریع و عملی شود، از تکنیکی به نام KV-Cache استفاده میشود.
در این مطلب، این مفاهیم را ساده، مرحلهبهمرحله و دقیق مرور میکنیم.
در زمان inference برای هر توکن، مدل باید تصمیم بگیرد:
«این کلمه باید به کدام کلمات قبلی بیشتر توجه کند؟»
برای این کار، هر توکن به سه بردار تبدیل میشود:
بردارهای Q, K, V
برای هر توکن:
* Q (Query) → بردار سوال، “من دنبال چه چیزی هستم؟”
* K (Key) → بردار برچسب، “من چه ویژگیهایی دارم؟”
* V (Value) → بردار جواب، “محتوای واقعی من چیست؟”
این سه بردار از ضرب embedding توکن در سه ماتریس یادگرفتهشده ساخته میشوند. پس به یاد داشته باشید که خود این بردار ها نیز از توکن ورودی ساخته شده اند.
محاسبه attention به شکل زیر است:
Attention = softmax(QK^T) V
این فرمول چه میگوید؟
1. شباهت Q با همه Kها محاسبه میشود
2. این شباهتها به احتمال (softmax) تبدیل میشوند
3. این وزنها در V ضرب میشوند
4. نتیجه = ترکیب هوشمند اطلاعات توکنهای قبلی
به عبارتی هر بردار سوال هر توکن با این معنا که من دنبال چی هستم و باید به چی بیشتر توجه کنم در بردار های برچسب توکن های دیگر (و خودش) ضرب داخلی میشه، هرچی این مقدار ضرب داخلی بزرگتر باشه یعنی شباهت بردار سوال توکن حاضر و بردار برچسب توکن دیگر بیشتر است، حاصل آن وارد تابع softmax میشه زیرا مقادیر خروجی ضرب داخلی تنها امتیازهایی بدون تفسیر هستند که softmax آنها را به وزن و مقادیر احتمالی قابل تفسیر تبدیل می کنه، سپس این وزن ها در بردار های V ضرب میشن تا جواب هایی که مرتبط تر هستند وزن بیشتری گیرند.
در زمان آموزش (training) همه توکنها همزمان پردازش میشوند، یعنی مکانیزم attention به تمام توکن های ورودی همزمان نگاه می کند و مقادیر را تولید می کند.
ولی در زمان تست (inference) مدل یک توکن در هر مرحله تولید میکند و تنها مقدار attention توکن ورودی مهم است زیرا برای توکن های قبلی در گذشته محاسبه شده است.
این است که هر بار که توکن جدید وارد می شود باید بردار های گفته شده دوباره محاسبه شوند که کاری کند و غیر بهینه است.
KV-cache یک بهینهسازی مهم در inference است. همان طور که گفتیم در زمان inference تنها محاسبه attention برای توکن ورودی مهم است.
برای اینکار نیاز است که برای توکن ورودی بردار های K, V, Q درست شوند.
ولی نیاز نیست که برای توکن های قبلی هم اینکار انجام شود، زیرا اولا که نیازی به برداری Q آنها نداریم زیرا نمی خواهیم attention را برای آنها حساب کنیم (قبلا محاسبه کرده ایم) دوما تنها بردار های K, V آنها را نیاز داریم.
💡 ایده اصلی:
> K و V توکنهای قبلی را یکبار محاسبه کن و ذخیره کن. دوباره نسازشان.
در هر مرحله تولید:
برای توکن جدید:
Q جدید ساخته میشود
K جدید ساخته میشود
V جدید ساخته میشود
برای توکنهای قبلی:
❌ دوباره K/V ساخته نمیشوند
✔ از حافظه (cache) خوانده میشوند
در هر step decode:
Attention = softmax(Q_{new} K_{cached}^T) V_{cached}]
یعنی:
فقط Q مربوط به توکن جدید ساخته میشود
K و V قبلی reuse میشوند
خروجی با ترکیب همه اطلاعات قبلی ساخته میشود
در inference:
attention هر توکن همان لحظه تولید آن توکن حساب شده
بعد از آن فقط بخشی از context میشود
KV-cache باعث میشود:
سرعت inference به شدت افزایش یابد
پیچیدگی محاسبات از حالت سنگین به سبکتر تبدیل شود
مدل بتواند متنهای طولانی تولید کند.
با تشکر
احمدرضا سزاوار