Своя модель

Модель не влезает в память: шесть вариантов по убыванию боли

Решения выстроены по цене для качества: сначала бесплатные — контекст и квантизация кэша, потом дешёвые, и только в конце смена модели. С оценкой потери на каждой ступени.

«CUDA error: out of memory», «model requires more memory than is available», или просто вылет без объяснений на середине загрузки. Симптом один: модель, которую вы хотите запустить, не помещается в имеющуюся память.

Первый инстинкт — взять модель поменьше. Это правильное решение, но оно должно быть последним, а не первым: между ним и вашей текущей ситуацией есть пять ступеней, каждая из которых стоит меньше по качеству.

#Быстрая проверка

Прежде чем что-либо менять, выясните, чего именно и насколько не хватает.

nvidia-smi --query-gpu=memory.used,memory.total --format=csv

Часто оказывается, что полтора гигабайта видеопамяти заняты браузером, а модели не хватало восьмисот мегабайт. Тогда решение — закрыть браузер, а не менять модель.

Вторая команда показывает, что уже загружено движком:

ollama ps

Модель, оставшаяся в памяти с прошлого сеанса, — типичная причина того, что вторая модель не запускается.

#Лестница из шести ступеней

Ступени идут по возрастанию потери качества. Спускаться по ней нужно сверху вниз и останавливаться на первой, которая решила проблему.

#Ступень 1: освободить занятое. Потеря качества — нулевая

Закройте браузер, выгрузите ранее загруженную модель, проверьте, не осталось ли процессов после аварийного завершения. На Windows видеопамять расходуется рабочим столом и аппаратным ускорением в приложениях: пара браузерных окон с видео легко съедает гигабайт.

Выигрыш: от 0,5 до 2 ГБ. Стоимость: закрытые вкладки.

#Ступень 2: сократить контекст. Потеря — длина памяти диалога

Самый недооценённый ход. Память под контекст растёт линейно, и для модели класса 8B каждые восемь тысяч токенов стоят примерно гигабайт. Переход с 32k на 8k освобождает три гигабайта.

./build/bin/llama-cli -m model.gguf -ngl 99 -c 8192

Выигрыш: до нескольких гигабайт. Стоимость: модель будет помнить более короткий отрезок разговора. Механику разбирает материал о том, почему большой контекст съедает видеопамять.

#Ступень 3: Flash Attention и квантизация KV-кэша. Потеря — почти нулевая

Восьмибитное хранение кэша вдвое сокращает расход на контекст при разнице в качестве, которую в обычной работе не видно.

./build/bin/llama-cli -m model.gguf -ngl 99 -c 32768 -fa -ctk q8_0 -ctv q8_0

В Ollama то же самое включается переменными окружения службы. Выигрыш: половина того, что занимал контекст, — на длинном контексте это 2–4 ГБ. Стоимость: минимальная. Подробности и расчёт — в материале о Flash Attention и квантизации KV-кэша.

Первые три ступени — «бесплатные». Если после них модель влезла, дальше идти не нужно.

#Ступень 4: более жёсткая квантизация весов. Потеря — заметная, но ограниченная

Переход с Q6_K на Q5_K_M или с Q5_K_M на Q4_K_M экономит примерно гигабайт на каждые восемь миллиардов параметров.

Важное ограничение: ниже Q4_K_M спускаться почти всегда невыгодно. Экономия становится небольшой, а деградация ускоряется. Модель класса 7B в честном Q4 обычно полезнее модели 14B в Q2 того же размера на диске. Разбор уровней и точки перелома — в материале о квантизации LLM.

Выигрыш: 1–3 ГБ. Стоимость: заметная на сложных задачах, особенно на русском языке.

#Ступень 5: выгрузить часть слоёв на процессор. Потеря — в скорости, не в качестве

Качество ответов не меняется вовсе. Меняется скорость, и сильнее, чем ожидается: уже десятая часть слоёв на процессоре стоит около трети скорости.

./build/bin/llama-cli -m model.gguf -ngl 24 -c 8192

Значение подбирается сверху вниз до того, при котором модель загружается. Выигрыш: любой нужный объём. Стоимость: скорость, и нелинейно — подробности в материале о выгрузке слоёв в оперативную память.

#Ступень 6: взять модель классом ниже. Потеря — качество, но предсказуемо

Последняя ступень, и она честнее пятой. Модель класса 8B, работающая целиком на видеокарте с комфортной скоростью, в повседневной работе почти всегда полезнее модели 14B, половина которой считается процессором и которая отвечает по слову в секунду.

Выигрыш: гарантированный. Стоимость: модель будет слабее в рассуждениях. Подборка рабочих вариантов для ограниченной памяти — в таблице моделей для слабого железа.

#Таблица: симптом, причина, проверка

Симптом Вероятная причина Проверка
Ошибка сразу при запуске не хватает на веса плюс контекст nvidia-smi до и после запуска
Ошибка через несколько сообщений кэш контекста растёт по мере диалога уменьшить -c и повторить
Ошибка при достаточной свободной памяти память занята другим процессом nvidia-smi со списком процессов
Загрузилось, но всё резко замедлилось вытеснение данных в системную память занятость памяти близка к 100%
Упоминание system memory в тексте ошибки не хватает оперативной, а не видеопамяти free -g
На карте с 8 ГБ не идёт модель на 6 ГБ контекст и накладные расходы посчитать по формуле

Что здесь смотреть: вторая и четвёртая строки. Ошибка не при запуске, а посреди работы почти всегда означает контекст, а не веса. А отсутствие ошибки при внезапном падении скорости — признак того, что вы заняли память под завязку, и драйвер начал вытеснять данные: это хуже честной ошибки, потому что не выглядит как сбой.

#Если ничего не помогло

Посчитайте требуемый объём по формуле, вместо того чтобы подбирать. Вес модели плюс KV-кэш плюс примерно гигабайт накладных расходов — методика в материале о том, сколько нужно VRAM для локальной LLM. Расхождение расчёта с реальностью само по себе диагностично: если по расчёту должно влезать, а не влезает, ищите постороннего потребителя памяти.

Проверьте, не резервирует ли движок память под несколько параллельных слотов: при нескольких слотах заявленный контекст делится между ними, а память резервируется на все.

И отдельно: убедитесь, что вы вообще пытаетесь загрузить то, что думаете. Тег модели в каталоге может указывать не на тот уровень квантизации, который вы ожидали, а разница между Q4 и Q8 — двукратная.

#Частые вопросы

#Что делать в первую очередь при ошибке нехватки памяти?

Посмотреть, чем занята память, командой nvidia-smi. В заметной доле случаев проблема не в модели, а в браузере или в модели, оставшейся загруженной с прошлого раза.

#Что сокращать первым — контекст или квантизацию?

Контекст, а перед ним — включить квантизацию KV-кэша. Эти два действия почти не стоят качества ответов, тогда как более жёсткая квантизация весов стоит.

#Почему модель на 6 ГБ не влезает в карту на 8 ГБ?

Потому что кроме весов нужны память под контекст и накладные расходы, а часть видеопамяти занята выводом изображения. Практическое правило: планируйте исходя из объёма карты минус полтора гигабайта.

#Можно ли использовать оперативную память вместо видеопамяти?

Можно, выгрузив часть слоёв на процессор. Качество не пострадает, скорость — заметно, причём сильнее всего от первых же выгруженных слоёв.

#Стоит ли брать сильно квантованную большую модель вместо маленькой?

До уровня Q4 — обычно да, большая модель в Q4 лучше маленькой в Q8. Ниже Q4 — обычно нет: деградация становится непредсказуемой, а на русском языке проявляется раньше, чем на английском.

#Модель загрузилась, но система стала тормозить целиком

Вы заняли почти всю видеопамять, и системе не хватает её для интерфейса. Освободите гигабайт-полтора: работать с заполненной под завязку памятью и медленно, и нестабильно.

Хотите ИИ, который помнит вас?

Persona держит контекст между чатами и работает на вашем железе — если развернуть её у себя и подключить локальную модель.

Создать аккаунт