سه ترفند برای دو برابر کردن سرعت مدلهای محلی با Llama.cpp
خلاصهٔ کاملتر
مشکل اصلی اجرای محلی مدلهای زبانی معمولاً قدرت پردازش نیست، پهنای باند حافظهست. هر توکنی که مدل تولید میکنه یعنی کل وزنهای مدل باید یه بار از حافظه رد بشن. یه مدل ۲۷ میلیارد پارامتری که کوانتایز شده و حدود ۱۸ گیگابایت حجم داره، یعنی برای هر کلمه باید ۱۸ گیگ داده جابهجا بشه؛ این کارو دهها بار در ثانیه تکرار کن، مخصوصاً رو GPUهای یکپارچه که حافظهشون رو با CPU شریکن، و خیلی زود به یه سقف سرعت میخوری.
دیکود گمانهزنی (speculative decoding) یعنی به جای یه مدل، از دو مدل استفاده کنی: یه مدل بزرگ اصلی و یه مدل کوچیک و سریعتر به اسم مدل پیشنویس. مدل کوچیک چند تا توکن بعدی رو حدس میزنه و مدل بزرگ همهشونو تو یه پاس بررسی میکنه؛ چون هزینه یه پاس مدل بزرگ تقریباً همونه چه یه توکن چک کنه چه چندتا، هر حدس درست عملاً سرعت مجانی اضافه میکنه. تو یه تست رو یه GPU یکپارچه، فعال کردن مدل پیشنویس سرعت تولید توکن رو از ۵ به حدود ۱۱ تا در ثانیه رسونده.
Llama.cpp یه تنظیم داره به اسم عمق حدسزنی (Nmax) که مشخص میکنه مدل کوچیک چندتا توکن جلوتر حدس بزنه. فکر میکنی هرچی بیشتر بهتره، ولی اینطور نیست؛ بعد از یه حد مشخص، مدل بزرگ باید حدسهای اشتباه رو رد کنه و این خودش وقت تلف میکنه. تو تستها، هم رو GPU یکپارچه هم رو یه GPU مجزای پنج برابر سریعتر، عمق ۳ (که پیشفرض خود Llama.cpp هم هست) بهترین نتیجه رو داده؛ عمق ۸ حتی از حالت بدون دیکود گمانهزنی هم کندتر شده.
مدلهای زبانی از دهها لایه تشکیل شدن (مثلاً حدود ۶۲ لایه تو یه مدل ۲۷ میلیاردی)، و تنظیم NGL تو Llama.cpp مشخص میکنه چندتا از این لایهها بره رو حافظه گرافیک. توصیه رایج اینه که NGL رو خیلی بالا (مثلاً ۹۹) بذاری تا همه چی رو GPU بره، ولی اگه مدل کامل جا نشه این توصیه خطرناکه. تو یه تست، مدلی که ۱.۷ گیگ از حافظه گرافیک بزرگتر بود، تا لایه ۵۶ سرعتش آروم آروم بالا رفت تا ۱۴ توکن در ثانیه، ولی تو لایه ۶۰ سرعت به زیر ۱ توکن سقوط کرد؛ یعنی با فقط ۴ لایه بیشتر، افت ۱۷ برابری.
راهحل بهتر از دستکاری دستی لایهها اینه که یه فرمت کوانتایز کوچیکتر انتخاب کنی که کامل تو حافظه گرافیک جا بشه. جابهجایی از فرمت Q4KM (حدود ۱۸ گیگ) به IQ4XS (حدود ۱۳ گیگ)، با اینکه هر دو چهار بیتی هستن ولی فشردهسازی جدیدتری دارن، باعث شده کل مدل تو ۱۶ گیگ حافظه گرافیک جا بشه و هم سرعت پردازش prompt و هم سرعت تولید توکن تقریباً دو برابر بشه؛ این نتیجه از کل تنظیم دستی لایهها بهتر بوده. تست پرپلکسیتی (perplexity) هم نشون داده این افت کیفیت محسوسی نداشته، هرچند این تست فقط رو متن ساده انگلیسیه و افت کیفیت تو کد یا استدلال طولانی رو نمیتونه نشون بده.
نکات کلیدی:
- گلوگاه اصلی اجرای محلی، پهنای باند حافظهست نه قدرت پردازش
- دیکود گمانهزنی با یه مدل پیشنویس میتونه سرعت تولید توکن رو بیش از دو برابر کنه
- عمق حدسزنی پیشفرض (۳) معمولاً بهترین نتیجه رو میده؛ زیادهروی نتیجهی برعکس داره
- سرریز چند لایه از ظرفیت VRAM میتونه سرعت رو تا ۱۷ برابر پایین بیاره
- انتخاب فرمت کوانتایزی که کامل تو VRAM جا بشه (مثلاً IQ4XS بهجای Q4KM) از تنظیم دستی لایهها موثرتره
- تست پرپلکسیتی افت کیفیت متنی رو نشون نداده، ولی برای کد و استدلال باید جدا تست کرد




