بازگشت به وبلاگ

هیچ‌کس درباره RAM حرف نمی‌زند. هر پشیمانی LLM محلی، مشکل RAM است

۲۸ شهریور ۱۴۰۵

وارد هر ترد مربوط به LLM محلی که شوید، دعواها درباره GPU هاست. بنچمارک VRAM، کارت‌های 24 گیگابایتی، CUDA در مقابل ROCm، اینکه آیا 3060 هنوز کارت مردم است. در این میان عددی که واقعاً تعیین می‌کند مدل شما اجرا می‌شود یا نه، در شکاف دیگر نشسته: بدون بنچمارک، بدون بازاریابی — چقدر RAM ماشین دارد.

VRAM رویا را می‌فروشد. RAM تعیین می‌کند مدل اصلاً بالا بیاید — و وقتی بالا آمد چقدر context زنده بماند.

این را موقع نوشتن همین پست روی جعبه جلوی خودم تست کردم: دسکتاپ Ryzen با 32 گیگابایت RAM و GeForce RTX 3060 با 12 گیگابایت VRAM. llama3.1:8b را کشیدم — صفحه دانلود می‌گوید 4.9 گیگابایت. ببینید واقعاً چه رزرو کرد:

کپچر ترمینال از جعبه تست: ollama ps نشان می‌دهد llama3.1:8b با context سی‌هزار توکنی 7.0 گیگابایت در 100% GPU رزرو کرده، nvidia-smi می‌خواند 7963 MiB از 12288 MiB مصرف شده، و free -h نشان می‌دهد 31 GiB از RAM سیستم آزاد است

تمام استدلال در یک قاب است. یک «مدل 4.9 گیگابایتی» قبل از جواب دادن به یک prompt، 7.0 گیگابایت رزرو کرد — مالیات context ی 43 درصدی — و 7963 از 12288 MiB از VRAM را برای خودش نگه داشت. وزن‌ها هرگز بودجه نبودند. context بود.

آن گیگابایت‌های اضافه از کجا می‌آیند

یادداشت‌های حافظه llama.cpp همان حسابی را بازگو می‌کنند که صفحات دانلود حذفش می‌کنند: کل حافظه = وزن‌های مدل + KV cache + بافر محاسباتی. فقط جمله اول ثابت است. KV cache خطی با طول context رشد می‌کند و بافر محاسباتی با batch و شکل گراف. Ollama دور llama.cpp پیچیده شده، پس همان قانون برقرار است — برای همین ollama ps برای یک تگ 4.9 گیگابایتی در پنجره 32 هزار توکنی، 7.0 گیگابایت گزارش کرد؛ تمامش ساکن روی GPU.

مدل کوانتیزه یک مصالحه نیست. اعتراف به این است که حافظه همیشه بودجه واقعی بوده.

برای همین هم هست که نردبان کوانتیزاسیون GGUF اصلاً وجود دارد. Q4 یک آیین نیست؛ همان است که حساب حافظه را داخل سخت‌افزاری می‌نشاند که مردم دارند. و برای همین دو ست‌آپ «یکسان» 8B هیچ شباهتی در رفتار ندارند: همان مدل، طول context متفاوت، ماشین‌های کاملاً متفاوت.

جدولی که هیچ‌کس قبل از خرید اجرا نمی‌کند

همان سه کلاس مدل، هر دو نوع حافظه، یک کارت 12 گیگابایتی و 32 گیگابایت RAM — پیکربندی‌ای که هزاران توسعه‌دهنده واقعاً دارند:

کلاس مدل (Q4)دانلودبارگذاری‌شده + ctx 32kروی VRAM ی 12 گیگابایتروی RAM ی 32 گیگابایت
7–8B (llama3.1:8b)4.9 GB7.0 GB (اندازه‌گیری‌شده)100% GPU، ~8 GiB مصرفبه‌سختی به چشم می‌آید
13–14B (qwen2.5:14b)9.0 GB~12 GBoffload شروع می‌شودمشکلی نیست
27–32B (gemma3:27b)17 GB~20+ GBCPU زیر بار می‌رودتنها دلیل اجرایش

دو ردیف آخر را دوباره بخوانید. فقط با VRAM، یک مدل 14B در پنجره context واقعی از الان کار split-offload است و 27B ناممکن. روی 32 گیگابایت RAM سیستم، هر دو صرفاً کنداند. تفاوت میان ناممکن و کند، تمام تفاوت عملی RAM و VRAM است. اگر در VRAM جا شد، سریع است. اگر در RAM جا شد، کار می‌کند. اگر در هیچ‌کدام جا نشد، دارید به یک درایو NVMe swap می‌زنید و زمان معنایش را از دست می‌دهد.

Offload روی PCIe می‌نشیند و FAQ مربوط به Ollama درباره هزینه صریح است: لایه‌هایی که روی GPU جا نمی‌شوند روی CPU اجرا می‌شوند و throughput وقتی سهم GPU کم می‌شود سخت می‌افتد. هیچ‌کس این مبادله را آگاهانه انتخاب نمی‌کند. بی‌سروصدا اتفاق می‌افتد، لایه به لایه، و تنها نشانه‌اش این است که «مدل‌های محلی بیش از ارزششان به نظر می‌رسند».

دفتر کل صادقانه: چه چیزهایی واقعاً شکست

چیزهایی که موقع نوشتن این مطلب شکستند یا غافلگیرم کردند، به ترتیب:

  1. خودِ عدد 43 درصد. انتظار داشتم مدل 8B «حدود حجم فایلش» را بگیرد. 7.0 گیگابایت رزرو کرد در مقابل دانلود 4.9 گیگابایتی. اگر من را غافلگیر کرد، هر کسی را که به‌جای خروجی ps برگه‌های مشخصات می‌خواند غافلگیر می‌کند.
  2. جلسه اسکرین‌شات. کپچر اول پنجره اشتباه را گرفت. دومین کار کرد — همان که بالا است. رسید، یک workflow است نه یک حس — و چرخه pull → capture → ollama rm دیسک را صادق نگه می‌دارد.
  3. آنچه نشکست: GPU هرگز سرریز نکرد. 8B با context ی 32k روی 12 گیگابایت واقعاً راحت است. کارت سالم است. گفتمان دور کارت است که کالیبره نیست.

هیچ‌کدام از این‌ها یعنی GPU مهم نیست — خط 100% GPU در آن کپچر دلیل حس فوری بودن تولید است. یعنی GPU سؤال دوم است. انتخاب Ollama یا llama.cpp بعد از اینکه می‌دانید چه جا می‌شود می‌آید، نه قبلش.

قاعده سرانگشتی که ارزش نگه داشتن دارد

RAM لازم شما = فایل مدل + KV cache برای پنجره context واقعی‌تان + 4 گیگابایت برای اینکه یک کامپیوتر باشید. برای 7–8B در Q4، 16 گیگابایت راحت است. برای 14B–32B، 32 گیگابایت از لوکس بودن می‌افتد و خودِ ماجرا می‌شود. VRAM را برای سرعتی بخرید که در context ای که استفاده می‌کنید می‌خواهید؛ RAM را برای هر چیزی که روزی بارگذاری خواهید کرد.

یک بار ollama ps را چک کنید و آیینِ برگه‌ی مشخصات بی‌سروصدا تمام می‌شود.

خب، دو سؤال. وقتی دفعه بعد جعبه توسعه‌تان را تنظیم می‌کنید، VRAM را برای بنچمارک‌هایی می‌خرید که پست می‌کنید — یا RAM را برای مدل‌هایی که واقعاً اجرا می‌کنید؟ و صادقانه: از مدل‌هایی که ساعت 2 شب کشیدید، چندتایشان را قبل از صبحانه پاک کردید؟ من این کار را کردم، امشب، وسط همین پست. در کامنت‌ها بگویید تنها نیستم — و بگویید ساخت شما کدام سمت شکاف RAM/VRAM نشسته.

FAQ

برای اجرای یک LLM محلی چقدر RAM لازم است؟

حجم فایل مدل به‌علاوه context به‌علاوه دسکتاپ شما. 16 گیگابایت برای مدل‌های 7–8B در Q4 راحت است؛ 32 گیگابایت همان است که مدل‌های 14–32B را از یک دمو به ماشین روزمره تبدیل می‌کند.

برای LLM محلی VRAM مهم‌تر است یا RAM؟

وقتی همه‌چیز در VRAM جا شود، VRAM سرعت را تعیین می‌کند. RAM تعیین می‌کند اصلاً مدل اجرا شود یا نه و چقدر context زنده بماند. Offload روی PCIe بین این دو، میانه کُندی است که هیچ‌کس دلش نمی‌خواهد.

چرا مصرف حافظه مدل بعد از بارگذاری از حجم دانلودش بیشتر است؟

KV cache و بافرهای محاسباتی با طول context رشد می‌کنند. llama.cpp حساب را مستند کرده: وزن‌ها + KV cache + بافر محاسباتی — و فقط عدد اول روی صفحه دانلود هست.

— mrsaynothing

— mrsaynothing

نظرات، پیش از انتشار تست بار شده‌اند. معمولاً.

این نوشته را در dev.to بحث کنید dev.to ↗

استدلال بعدی با ایمیل

هر نوشته یک ایمیل. تأییدش کن یا ریشه‌کنش کن.

self-hosted · بدون واسطه‌های ثالث · لغو اشتراک با یک کلیک

این چیست؟

SSH با Permission denied (publickey): رفع واقعی

این نوشته‌ها را می‌پسندید؟ این همان کاری است که برای زندگی از آن درمی‌آورم. استخدامم کنید