Локальные большие языковые модели поначалу кажутся молниеносными. Вы загружаете модель на 7 млрд или 13 млрд параметров, отправляете короткий промпт, и токены бегут по экрану с комфортной скоростью. Затем вы вставляете длинный блок кода или история чата разрастается до десятка реплик, и модель начинает ползти. Замедление редко бывает постепенным. Это обрыв. В один момент GPU выдает токены один за другим, а в следующий — системный монитор показывает рост нагрузки на память, и генерация превращается в прерывистое заикание. Это невозможно предсказать с помощью четкой формулы. Ваш единственный надежный ориентир — само железо.
Скрытая цена контекста
Каждый сгенерированный токен добавляет состояние в KV-кэш. Этот кэш хранит ключи и значения, вычисленные на этапах prefill и генерации, и он занимает место в памяти наряду с весами модели, буферами внимания и накладными расходами среды выполнения. На типичной потребительской видеокарте с 12 ГБ или 16 ГБ VRAM KV-кэш в конечном итоге начинает конкурировать за место со всем остальным. Когда выделенная видеопамять заполняется, операционная система не выдает ошибку и не останавливается. Она тихо переносит излишки в общую память, перекачивая данные между GPU и системной оперативной памятью через шину PCIe. Эта шина быстра для передачи файлов, но она работает черепашьими темпами по сравнению с пропускной способностью памяти внутри видеокарты. Результатом является не небольшое падение производительности, а полный крах.
Три признака того, что вы достигли обрыва
Следите за показателями мониторинга оборудования во время работы модели. Как только вы наткнетесь на этот «обрыв», вы увидите три четких сигнала.
- Рост Shared VRAM. Это память, которую драйвер GPU вытеснил из выделенной видеопамяти в пул, управляемый операционной системой. Как только этот показатель превысит ноль, вы перешли черту.
- Рост использования системной RAM. Излишкам нужно куда-то деться, и это место — ваша основная память. Если потребление RAM растет во время генерации токенов, значит, данные выгружаются из GPU.
- Скорость оценки (eval speed) падает вдвое или более. Замедление на 10% может означать троттлинг из-за перегрева или работу фоновых процессов. Падение на 50% или более означает, что узким местом стали не тензорные ядра, а пропускная способность памяти и задержки PCIe. Если скорость генерации падает с двузначных чисел до однозначных, вы уже сорвались с обрыва.
Почему ваш быстрый бенчмарк, скорее всего, лжет
Короткая проверка («smoke test») даст вам ложную уверенность. Если вы протестируете модель с промптом в сто токенов, увидите хорошую пропускную способность и решите, что этого достаточно, вы измерили лишь «медовый месяц». KV-кэш почти пуст. Слои еще не испытали нагрузки от длинного prefill. Реальный объем памяти проявляется только после того, как модель обработает существенный промпт и кэш заполнится до своего реального рабочего размера. Вы должны тестировать с глубоким prefill и длительными циклами генерации. Дайте контексту накопиться. Только тогда нагрузка на память стабилизируется и покажет вам истинный предел.
Поиск предела с помощью llama.cpp
Если вы запускаете модели через llama.cpp, вы можете определить свой «предел» с помощью простой арифметики и терпеливого тестирования.
1. Измерьте использование общей памяти.
Зафиксируйте базовый уровень выделенной VRAM при минимальном промпте, затем запустите задачу с длинным контекстом и отметьте пиковое значение. Вычтите базовый уровень из пикового. Разница — это то, что вытекло из вашего GPU в общую системную память.
2. Рассчитайте дельту RAM.
Проделайте то же вычитание для системной RAM. Вычтите базовое значение RAM из пикового значения во время длительного прогона. Это число точно скажет вам, какой объем данных был перекачан с видеокарты в основную память. Оно количественно определяет «утечку» через шину.
3. Засеките время падения скорости оценки.
Сравните базовую скорость (токенов в секунду) со скоростью после того, как модель «пережует» длинный документ. Вы можете наблюдать, как модель выдает семнадцать токенов в секунду, когда контекст еще свежий, а затем — всего два токена в секунду, когда кэш раздулся. Это падение на пятнадцать токенов — ваша «канарейка в угольной шахте».
Триангуляция точки перелома
To map the curve accurately, do not settle for one lonely data point. Run three distinct trials at 16,000 tokens, 32,000 tokens, and 65,000 tokens. Two points might suggest a line, but two dots are just a guess. The third point proves whether you are looking at measurement noise or a real memory wall. Subtract the results between runs to calculate how much extra memory each additional thousand tokens consumes on your specific combination of model, quantization layer, and GPU.
Once you have that slope, you can project forward. Take your per-token cost, multiply it by the target context length, divide by 1024 to move between units, and add the result to your base model VRAM load. The equation looks like this:
Model VRAM load + (tokens × memory per token ÷ 1024) = Theoretical VRAM usage
This projection is not prophecy. It is a guidepost derived from actual behavior. Use it to estimate your ceiling before you commit to a full production run.
Why Paper Formulas Fail, and What Quantization Can Fix
Textbook formulas ignore the messy reality of local inference. Different architectures allocate attention buffers differently. Your operating system reserves VRAM for the display driver, compositor, and CUDA context. Driver versions change how aggressively they use shared memory. A theoretical equation cannot know how much VRAM is actually free on your machine at 2:00 PM with a browser full of tabs open. You have to run the model on your specific hardware and watch the meters.
Quantization offers partial relief. Moving the KV cache from f16 to q8_0 halves its memory footprint while keeping precision high enough for nearly all practical tasks. That change buys you headroom. It does not grant immunity. The cache still grows linearly with every token you feed in. Eventually, even the reduced size overwhelms your available dedicated memory and the spillover to system RAM begins. The pressure only stops when the context window is capped or the data stops moving.
The Real Takeaway
Do not trust marketing slides, parameter counts, or back-of-the-envelope math. Load the model. Open your system monitor. Run a 65,000-token thread, watch the RAM climb, and count the tokens per second. The numbers that appear on your specific screen, on your specific GPU, are the only numbers that matter. Context always wins. Your job is to know exactly when it wins on your machine.
