وقتی یک مدل هوش مصنوعی را با Ollama اجرا میکنید، مقدار حافظه موردنیاز فقط به حجم فایل مدل بستگی ندارد. اندازه پنجره Context نیز میتواند مقدار قابلتوجهی از RAM یا VRAM را مصرف کند، حتی اگر در عمل از تمام ظرفیت آن استفاده نکنید. بنابراین اگر معمولاً با مکالمههای کوتاه چند هزار توکنی کار میکنید، کاهش Context میتواند یکی از سادهترین روشها برای آزاد کردن حافظه و جلوگیری از کندشدن سیستم باشد.
چرا Context بزرگ در Ollama حافظه زیادی مصرف میکند؟
Context Window حداکثر تعداد توکنهایی است که مدل میتواند در یک نوبت در اختیار داشته باشد. این مقدار فقط متن سؤال فعلی نیست و میتواند شامل پیام سیستم، تاریخچه مکالمه، ورودی فعلی و توکنهای تولیدشده نیز باشد. Ollama برای نگهداری این اطلاعات از KV Cache استفاده میکند و با بزرگتر شدن Context، حافظه موردنیاز این بخش نیز افزایش پیدا میکند.
به عنوان مثال، اگر مدلی با Context برابر ۳۲ هزار توکن اجرا شود اما مکالمه معمول شما فقط حدود ۳ هزار توکن داشته باشد، انتخاب Context بزرگ الزاماً به معنای استفاده واقعی از ۳۲ هزار توکن نیست، اما ظرفیت حافظه بیشتری برای اجرای مدل در نظر گرفته میشود.
به همین دلیل حجم فایل مدل به تنهایی معیار مناسبی برای تخمین RAM یا VRAM موردنیاز نیست. یک مدل کوانتایزشده ۵ گیگابایتی ممکن است هنگام اجرا به حافظه بیشتری برای KV Cache و بافرهای پردازشی نیاز داشته باشد.
در Ollama فعلی، مقدار پیشفرض Context با توجه به VRAM تعیین میشود: کمتر از ۲۴ گیگابایت برابر 4K، بین ۲۴ تا ۴۸ گیگابایت برابر 32K و ۴۸ گیگابایت یا بیشتر برابر 256K است. برای کارهایی مانند کدنویسی، ابزارهای عاملمحور و وظایفی که Context بسیار طولانی دارند، خود Ollama استفاده از Context بزرگتر را توصیه میکند.
چگونه Context در Ollama را کاهش دهیم؟
اگر بیشتر مکالمات شما کوتاه هستند، لازم نیست همیشه از Context بسیار بزرگ استفاده کنید. به عنوان یک نقطه شروع، برای گفتوگوهای معمول چند هزار توکنی میتوانید Context هشت هزار توکنی را امتحان کنید و سپس بر اساس نیاز واقعی آن را افزایش دهید.
در نسخه دسکتاپ Ollama میتوانید مقدار Context را از تنظیمات برنامه تغییر دهید.
Ollama > Settings > Context Length
Ollama > تنظیمات > طول زمینه
بعد از کاهش مقدار، یک مکالمه معمولی خود را آزمایش کنید. اگر مدل در مکالمههای طولانیتر اطلاعات ابتدای گفتوگو را زودتر از دست میدهد، مقدار Context را دوباره افزایش دهید.
در خط فرمان نیز Ollama امکان تعیین Context هنگام اجرای سرور را دارد. در نسخههای فعلی میتوان از متغیر محیطی OLLAMA_CONTEXT_LENGTH استفاده کرد. به عنوان مثال برای اجرای Ollama با Context برابر ۸ هزار توکن میتوانید از دستور زیر استفاده کنید:
OLLAMA_CONTEXT_LENGTH=8192 ollama serve
مقدار مناسب به نوع کار بستگی دارد. برای چتهای کوتاه ممکن است ۴K یا ۸K کافی باشد، در حالی که تحلیل اسناد بزرگ، کدنویسی طولانی یا استفاده از ابزارهای عاملمحور میتواند به Context بسیار بزرگتری نیاز داشته باشد.
تنظیم Context اختصاصی برای هر مدل با Modelfile
اگر میخواهید یک مدل همیشه با Context مشخصی اجرا شود، استفاده از Modelfile روش مناسبتری است. پارامتر num_ctx در Modelfile اندازه Context Window مدل را مشخص میکند. مستندات رسمی Ollama نیز استفاده از PARAMETER num_ctx را برای این کار توضیح دادهاند.
به عنوان مثال میتوانید یک Modelfile بسازید و چنین تنظیمی در آن قرار دهید:
FROM llama3.2
PARAMETER num_ctx 8192
سپس مدل سفارشی را ایجاد کنید:
ollama create mymodel -f Modelfile
و آن را اجرا کنید:
ollama run mymodel
این روش زمانی کاربردی است که یک مدل خاص را همیشه با Context مشخصی اجرا میکنید و نمیخواهید هر بار تنظیمات را تغییر دهید. Ollama در مستندات فعلی num_ctx را به عنوان پارامتری برای تعیین اندازه Context معرفی میکند.
برای بررسی Context واقعی مدل در حال اجرا نیز میتوانید از دستور ollama ps استفاده کنید. خروجی این دستور اطلاعاتی مانند اندازه مدل، درصد استفاده از GPU و مقدار Context را نشان میدهد.
چگونه بفهمیم چه مقدار Context واقعاً نیاز داریم؟
به جای انتخاب Context بر اساس حداکثر عددی که مدل روی کاغذ پشتیبانی میکند، بهتر است اندازه مکالمات واقعی خود را بررسی کنید. اگر بیشتر درخواستهای شما در محدوده چند هزار توکن قرار دارند، Context بسیار بزرگ ممکن است فقط حافظه بیشتری مصرف کند بدون اینکه مزیت محسوسی برای کار روزمره داشته باشد.
Ollama در پاسخهای API اطلاعاتی مانند prompt_eval_count و eval_count ارائه میکند. مقدار اول تعداد توکنهای ورودی پردازششده و مقدار دوم تعداد توکنهای تولیدشده را نشان میدهد. با بررسی چند مکالمه معمول و طولانی میتوانید تخمین بهتری از نیاز واقعی خود به Context داشته باشید.
در مدلهای دارای قابلیت Reasoning باید دقت بیشتری داشته باشید. تعداد توکنهای موردنیاز برای فرایند فکرکردن مدل میتواند جدا از پاسخ نهایی باشد، بنابراین اگر فقط تعداد توکنهای متنی که روی صفحه میبینید را ملاک قرار دهید، ممکن است نیاز واقعی مدل را کمتر از مقدار لازم برآورد کنید.
همچنین بهتر است یک مکالمه نسبتاً طولانی را بعد از کاهش Context آزمایش کنید. اگر مدل دیگر نتواند اطلاعات ابتدای گفتوگو را به خوبی در اختیار داشته باشد، Context انتخابشده برای کار شما بیش از حد کوچک است.
کاهش مصرف VRAM با کوانتایز کردن KV Cache
اگر کاهش Context برای نیاز شما کافی نیست، یکی دیگر از راههای کاهش مصرف حافظه، کوانتایز کردن KV Cache است. Ollama در نسخههای فعلی برای این کار از متغیر OLLAMA_KV_CACHE_TYPE استفاده میکند و حالت پیشفرض f16 است. برای استفاده از KV Cache کوانتایزشده نیز Flash Attention باید فعال و با مدل و سختافزار سازگار باشد.
حالت q8_0 تقریباً نصف حافظه حالت f16 را برای KV Cache مصرف میکند و طبق مستندات Ollama افت دقت آن معمولاً بسیار کم است. به همین دلیل اگر به کاهش مصرف حافظه نیاز دارید، Q8 معمولاً گزینه مناسبی برای شروع است.
حالت q4_0 میتواند مصرف حافظه KV Cache را تقریباً به یکچهارم حالت f16 برساند، اما کاهش دقت در آن بیشتر است و ممکن است در Contextهای طولانیتر روی کیفیت خروجی تأثیر بگذارد. بنابراین بهتر است ابتدا Q8 را امتحان کنید و فقط در صورت نیاز سراغ Q4 بروید.
در ویندوز میتوانید متغیر محیطی را پیش از اجرای سرور تنظیم کنید:
$env:OLLAMA_KV_CACHE_TYPE="q8_0"
ollama serve
در لینوکس و macOS نیز میتوانید متغیر مشابه را هنگام اجرای Ollama تعیین کنید:
OLLAMA_KV_CACHE_TYPE=q8_0 ollama serve
این تنظیم به صورت سراسری روی مدلهایی که Ollama اجرا میکند اثر میگذارد، بنابراین اگر چند مدل مختلف دارید، نتیجه را روی مدلهای مهم خود بررسی کنید. همچنین سازگاری Flash Attention با مدل و سختافزار اهمیت دارد و نباید صرفاً برای کاهش حافظه آن را بدون بررسی فعال کرد.
تعداد اجرای همزمان مدل را کنترل کنید
Context فقط برای یک درخواست اهمیت ندارد. اگر Ollama چند درخواست را همزمان پردازش کند، حافظه موردنیاز KV Cache نیز میتواند افزایش پیدا کند. بنابراین اگر یک رایانه شخصی دارید و معمولاً فقط خودتان با مدل کار میکنید، افزایش بیدلیل تعداد درخواستهای همزمان میتواند فشار بیشتری به حافظه وارد کند.
برای استفاده شخصی، معمولاً منطقی است ابتدا با یک درخواست همزمان شروع کنید. اگر Ollama به عنوان یک سرور محلی برای چند کاربر یا چند برنامه استفاده میشود، افزایش ظرفیت همزمان ممکن است ارزش مصرف حافظه بیشتر را داشته باشد.
این موضوع در سیستمهایی با VRAM محدود اهمیت بیشتری پیدا میکند. اگر مدل به دلیل کمبود VRAM بخشی از پردازش را به RAM منتقل کند، ممکن است سرعت تولید توکن به شکل محسوسی کاهش پیدا کند.
بنابراین هنگام بررسی مصرف حافظه، فقط اندازه فایل مدل را نگاه نکنید. Context، KV Cache، تعداد درخواستهای همزمان و میزان انتقال مدل بین GPU و CPU را نیز بررسی کنید.
بهترین تنظیم Ollama برای سیستمهای کمحافظه چیست؟
اگر RAM یا VRAM محدودی دارید، بهتر است کاهش مصرف حافظه را از Context شروع کنید. این کار معمولاً سادهترین تغییری است که میتوانید بدون تغییر مدل انجام دهید.
برای چت روزمره میتوانید ابتدا Context برابر 4K یا 8K را امتحان کنید. اگر با اسناد طولانی یا مکالمات بسیار بزرگ کار میکنید، مقدار را افزایش دهید. برای کدنویسی طولانی و ابزارهای عاملمحور، Context بسیار بزرگتر ممکن است ضروری باشد و کاهش بیش از حد آن میتواند باعث از دست رفتن اطلاعات ابتدای مکالمه شود. خود Ollama برای چنین کارهایی حداقل 64K را توصیه کرده است.
بعد از تنظیم Context، اگر هنوز حافظه کافی ندارید، Q8 برای KV Cache گزینه بعدی مناسبی است. اگر باز هم با محدودیت حافظه مواجه هستید، Q4 میتواند مصرف حافظه را بیشتر کاهش دهد، اما باید کیفیت خروجی و سازگاری مدل را بررسی کنید.
در نهایت، اگر مدل همچنان به RAM یا VRAM بیشتری از ظرفیت سیستم نیاز دارد، کاهش اندازه خود مدل از طریق کوانتایز کردن وزنها یا انتخاب یک مدل کوچکتر میتواند راهحل مؤثرتری باشد. کاهش Context به تنهایی قرار نیست مصرف حافظه مدل را به اندازه وزنهای آن کاهش دهد.
گیم پلنت