KV کش: حساب نکردن دوبارهی گذشته
جواب کوتاه
موقع ساختن متن، مدل کلمهبهکلمه جلو میره و هر قدم باید به همهی کلمههای قبلی نگاه کنه. اگه هر بار کلید و مقدار همهی کلمههای قبلی رو از نو حساب کنه، کار خیلی زیادی هدر میره. ولی به خاطر ماسک، هیچ کلمهای به بعدیها نگاه نمیکنه، پس کلید و مقدار کلمههای قبلی هیچوقت عوض نمیشن. KV کش یعنی همینها رو توی یه دفترچه نگه داریم و هر قدم فقط پرسش و کلید و مقدار کلمهی تازه رو حساب کنیم. برای نوشتن هزار کلمه، به جای ۵۰۰ هزار بار، فقط هزار بار. هزینهش حافظهست: برای هر تکه و هر لایه یه کلید و یه مقدار؛ برای یه مدل بزرگ ۲۰۲۰ و ۲۰۴۸ تکه، حدود ۱۰ گیگابایت. پس گلوگاه تازه خوندن همین دفترچه از حافظهست.
یعنی چی
برای هر کلمهی تازه، کل نامه رو از اول نمیخونی.
وقتی یه نامه مینویسید، یادتون هست تا اینجا چی نوشتید؛ لازم نیست برای هر کلمهی تازه، از اول بخونیدش. توی درس فقط رمزگشا دیدیم مدل هم کلمهبهکلمه مینویسه، و هر قدم به همهی کلمههای قبلی نگاه میکنه. KV کش یه دفترچهست که مدل توش چیزهایی که از قبل حساب کرده رو نگه میداره. K یعنی کلید و V یعنی مقدار.
یه قدم، دو جور
فرض کنید مدل چهار کلمه نوشته و داره پنجمی رو میسازه. برای توجه، پرسش کلمهی پنجم باید با کلید و مقدار هر پنج کلمه کار کنه. بی کش، مدل هر پنج تا رو از نو حساب میکنه، با اینکه چهار تاش رو قدم قبل حساب کرده بود. با کش، اون چهار تا رو از دفترچه میخونه و فقط کلید و مقدار کلمهی پنجم رو حساب میکنه و به دفترچه اضافه میکنه. یه پژوهش ۲۰۱۹ همین روش رو به عنوان روش معمول ساختن متن توضیح داده.
چرا درسته
شاید بپرسید: کلمهی تازه که اومد، کلید و مقدار کلمههای قبلی عوض نمیشه؟ نه، و دلیلش ماسکه. هر کلمه فقط به خودش و قبلیها نگاه میکنه، پس بردار کلمهی سوم توی همهی لایهها فقط از کلمهی اول تا سوم ساخته شده. کلمهی پنجم هر چی باشه، روی کلمهی سوم اثری نداره. پس کلید و مقداری که یه بار برای کلمهی سوم حساب شد، تا آخر درسته. بی ماسک، این ترفند کار نمیکرد.
چقدر صرفهجویی
یه حساب ساده. برای نوشتن هزار کلمه بی کش، قدم اول یه کلمه حساب میشه، قدم دوم دو تا، قدم سوم سه تا، و همینطور تا هزار. جمعش میشه پونصد هزار و پونصد بار حساب کلید و مقدار. با کش، هر کلمه فقط یه بار: روی هم هزار بار. یعنی تقریبا پونصد برابر کمتر. خود امتیازهای توجه هنوز باید حساب بشن، ولی بخش بزرگی از کار حذف شده.
هزینهش
هیچ چیزی مجانی نیست. دفترچه باید یه جایی توی حافظه باشه، و برای هر تکه و هر لایه، یه کلید و یه مقدار نگه میداره. برای رمزگشای مدل پایهی ۲۰۱۷، با شش لایه و بردار ۵۱۲ عددی، هزار تکه میشه حدود ۱۲ مگابایت؛ چیزی نیست. ولی برای اون مدل بزرگ ۲۰۲۰، با ۹۶ لایه و بردار ۱۲۲۸۸ عددی، هر تکه حدود ۴٫۷ مگابایت میخواد و ۲۰۴۸ تکه حدود ۹٫۷ گیگابایت؛ اون هم فقط برای یه گفتوگو. درس حساب حافظه این رو کنار حافظهی وزنها گذاشته.
با پایتون
اون «حدود ۱۰ گیگابایت» رو خودمون حساب کنیم.
برای هر تکه، توی هر لایه، یه کلید و یه مقدار نگه میداریم، هر کدوم به اندازهی بردار مدل. پس اندازهی دفترچه میشه ۲ ضرب در تعداد لایه ضرب در تعداد تکه ضرب در اندازهی بردار ضرب در بایت هر عدد. برای اون مدل ۱۷۵ میلیاردی ۲۰۲۰، با ۹۶ لایه و بردار ۱۲۲۸۸ عددی:
def kv_bytes(layers, tokens, d, nbytes=2):
return 2 * layers * tokens * d * nbytes
one = kv_bytes(96, 2048, 12288)
print(round(one / 1e9, 2), "GB")
# 9.66 GB
print(round(8 * one / 1e9, 1), "GB for 8 people")
# 77.3 GB for 8 peopleاین برای یه نفره. اگه سرور بخواد همزمان به ۸ نفر با متن به همین طول جواب بده، دفترچهها روی هم حدود ۷۷ گیگابایت میشن، جدا از خود وزنهای مدل. برای همین مدیریت این حافظه یه کار جدیه.
گلوگاه تازه
با کش، حساب کم شد؛ ولی یه مشکل تازه پیدا شد. حالا برای هر کلمهی تازه، مدل باید کل دفترچه رو از حافظه بخونه. پژوهش ۲۰۱۹ نشون داد موقع ساختن متن، بیشتر وقت صرف همین خوندن از حافظه میشه، نه خود حساب؛ کارت گرافیک بیشتر منتظر رسیدن عددهاست. برای همین، کوچیک کردن این دفترچه، مستقیم سرعت ساختن متن رو بالا میبره. درس سرعت این رو از دید کاربر دیده.
صفحهصفحه کردن دفترچه
دفترچهی هر درخواست کمکم بزرگ میشه، ولی از اول معلوم نیست تا کجا. همین، حافظه رو هدر میده.
راه ساده اینه که برای هر درخواست، از اول جای حداکثر طول ممکن رو پشت سر هم رزرو کنیم. ولی بیشتر جوابها کوتاهتر تموم میشن و بقیهی اون جا خالی میمونه. یه پژوهش ۲۰۲۳ گفت توی سیستمهای اون موقع، این حافظه با تکهتکه شدن و کپیهای تکراری حسابی هدر میرفت. راه اونا از سیستمعاملها اومد: حافظه رو به صفحههای کوچیک تقسیم کردن و هر وقت یه درخواست جای بیشتر لازم داشت، یه صفحهی تازه بهش دادن؛ صفحههای یه درخواست لازم نیست کنار هم باشن. اینطوری هدر رفتن تقریبا صفر شد، و چند درخواست حتی میتونستن صفحههای مشترک داشته باشن. نتیجه، با همون سرعت جواب، ۲ تا ۴ برابر درخواست بیشتر توی همون زمان بود.
چند نکته
- فقط موقع ساختن متن به کار میاد.
- درستیش از ماسکه.
- حساب کمتر، حافظهی بیشتر.
- گلوگاه تازه: خوندن دفترچه.
پس چطور دفترچه رو کوچیک کنیم؟ یه راهش اینه که سرها کلید و مقدار مشترک داشته باشن. درس بعد: سرهای پرسش با کلید و مقدار مشترک.
جمعبندی. آنچه از این درس با خودتان میبرید.
- کلید و مقدار گذشته عوض نمیشن.
- نگهشون دار؛ فقط تازه رو حساب کن.
- درسته، به خاطر ماسک.
- صرفهجویی بزرگ توی حساب.
- هزینه: حافظه.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.