Когда 24 ГБ VRAM внезапно превращаются в пшик
Вы скачали квантованную Qwen 3.5 35B в формате GGUF. Запустили через llama.cpp с видом на её заявленные 256k контекста. И тут - бац. В логах появляется убийственная строка: error: model context size (XXXXX) exceeds available context size (YYYYY). RTX 3090 Ti с её 24 гигабайтами видеопамяти, которая вчера казалась монстром, сегодня выглядит как скучающий хомяк в колесе. Что пошло не так?
Почему это происходит? Разбираем по косточкам
Заявленный контекст модели - это теоретический максимум. Фактический доступный размер зависит от трёх тиранов: VRAM вашей видеокарты, степени квантования модели и версии llama.cpp. На 08.03.2026 последняя стабильная ветка llama.cpp (v0.8.0+) использует более эффективные алгоритмы распределения памяти, но магию из ничего не создаёт.
Qwen 3.5 35B в квантовании Q4_K_M весит около 20-22 ГБ. Логично, что для контекста в 256k токенов нужно ещё несколько гигабайт. Но не 4, а все 12-16! Потому что контекст хранится в нескольких представлениях: ключи (K), значения (V), и всё это умножается на количество слоёв и голов внимания.
1 Диагностика: с чего начать, когда всё горит
Не кидайтесь менять параметры наугад. Сначала поймите, где узкое место. Запустите эту команду в терминале:
# Проверяем, сколько памяти действительно доступно
nvidia-smi --query-gpu=memory.total,memory.free --format=csv
Запомните цифру memory.free. Теперь запустите llama.cpp сервер в режиме сухой прогулки (dry run) с флагом --verbose:
./server -m ./qwen3.5-35b-q4_K_M.gguf -c 11000 -ngl 99 --verbose 2>&1 | grep -E "(context|VRAM|available)"
Цифра после -c - это размер контекста в токенах. Начните с 11000 (примерно 11k), это типичное значение, при котором возникает ошибка на RTX 3090 Ti. Флаг -ngl 99 загружает все слои в VRAM. В логах ищите строки с оценкой потребления памяти.
Частая ошибка: Путаница между токенами и символами. 1 токен ≈ 0.75 слова на английском, но для китайских символов в Qwen соотношение другое. 11k токенов - это не 11 тысяч символов, а примерно 8-9 тысяч слов.
2 Решение: заставляем модель ужиматься
Вам нужно либо уменьшить аппетиты модели, либо найти дополнительную память. Начнём с первого.
Измените параметры запуска llama.cpp сервера. Ключевой флаг - -c задаёт размер контекста, но есть ещё --ctx-size (синоним) и критически важный -b или --batch-size.
# Рабочая конфигурация для RTX 3090 Ti с Qwen 3.5 35B Q4_K_M
./server -m ./qwen3.5-35b-q4_K_M.gguf \
-c 8192 \
-b 512 \
-ngl 43 \
--mlock \
--cont-batching \
--parallel 4
Что изменилось:
-c 8192: Снизили контекст до 8k токенов. Да, это далеко от 256k, но реалистично для 24 ГБ VRAM. Если нужно больше, читайте про запуск контекста >128k на нескольких видеокартах.-b 512: Размер батча. Чем меньше, тем меньше пиковое потребление памяти. 512 - безопасное значение.-ngl 43: Не загружаем все слои в VRAM, а только 43 из примерно 60. Остальные уйдут в RAM. Производительность упадёт, но модель запустится.--cont-batching: Непрерывный батчинг, новая фича llama.cpp 2025 года, которая экономит память за счёт переиспользования буферов.
| Параметр | Значение для 24 ГБ VRAM | Эффект на память |
|---|---|---|
| Контекст (-c) | 8192 - 16384 | Прямо пропорционален: +1k токенов ≈ +0.5-1 ГБ VRAM |
| Слои в VRAM (-ngl) | 40-45 | Каждый слой ≈ 300-400 МБ. 20 слоёв в RAM = экономия 6-8 ГБ VRAM |
| Размер батча (-b) | 256-512 | Меньше батч = меньше пиковая память, но ниже скорость |
3 Если не помогает: копаем глубже
Бывает, что даже с этими параметрами память переполняется. Значит, проблема в другом месте.
Проверьте квантование. Может, вы скачали не Q4_K_M, а более тяжёлую версию? Q4_K_M весит ~22 ГБ, Q8_0 - уже ~40 ГБ. Для RTX 3090 Ti с большим контекстом Q4_K_M - оптимальный выбор. Если нужна максимальная точность в ущерб контексту, попробуйте Q5_K_M. Но для 256k контекста это утопия. Подробнее о квантовании читайте в статье про ошибки контекста в Qwen Coder.
Обновите llama.cpp. На 08.03.2026 в основной ветке есть оптимизации памяти для больших контекстов, которых не было год назад. Соберите из исходников:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make clean && make -j$(nproc) server-cuda CUDA_DOCKER_ARCH=all
Флаг CUDA_DOCKER_ARCH=all собирает поддержку всех архитектур CUDA, что важно для совместимости.
4 Docker: удобство, которое может стоить памяти
Если вы используете Docker-образы (например, популярный ghcr.io/ggerganov/llama.cpp:server-cuda), помните: контейнер добавляет накладные расходы. Обычно 100-300 МБ, но иногда из-за настроек volumes или shared memory можно потерять гигабайты.
Запускайте контейнер с явным ограничением памяти и указанием GPU:
docker run --gpus all \
--shm-size 2g \
-v /path/to/models:/models \
-p 8080:8080 \
ghcr.io/ggerganov/llama.cpp:server-cuda \
--model /models/qwen3.5-35b-q4_K_M.gguf \
-c 8192 \
-ngl 43 \
-b 512
Параметр --shm-size 2g выделяет 2 ГБ общей памяти, что достаточно для большинства задач. Не ставьте слишком много, чтобы не отнимать память у VRAM. Для сложных развёртываний на нескольких картах изучите руководство по настройке Docker для llama.cpp RPC.
5 Настройка Open WebUI: последний штрих
Open WebUI по умолчанию может отправлять запросы с максимальным контекстом, что снова вызовет ошибку. Нужно ограничить настройки.
В конфигурации Open WebUI (файл config.json или настройки в UI) установите:
{
"model": "qwen3.5-35b",
"max_context_length": 8192,
"gpu_layers": 43,
"batch_size": 512
}
Важно: эти параметры должны соответствовать параметрам запуска llama.cpp сервера. Если сервер запущен с -c 8192, а Open WebUI пытается отправить 12000 токенов, ошибка повторится.
Чего нельзя делать никогда
- Не используйте
-ngl 0(все слои в RAM). Это убьёт скорость (0.5-1 токен/с). Да, ошибка исчезнет, но зачем тогда мощная видеокарта? - Не игнорируйте флаг
-b. По умолчанию llama.cpp использует батч 512, но для больших контекстов это может быть много. Явно указывайте-b 256или меньше. - Не верьте рекламе про 256k контекста на 24 ГБ VRAM. Даже с квантованием Q2_K это сложно. Реальные цифры: для Q4_K_M максимум 16-24k токенов при полной загрузке слоёв в VRAM.
А если нужно больше?
Есть три пути:
- Сменить модель. Qwen 3.5 14B или 7B вместят больший контекст в те же 24 ГБ. Но качество ответов упадёт.
- Добавить видеокарту. Две RTX 3090 Ti дадут 48 ГБ VRAM. Настройка сложная, через llama.cpp RPC или vLLM. Готовьтесь к танцам с бубном вокруг PCI-E линий и питания.
- Использовать более эффективные раннеры. vLLM или MLC-LLM иногда экономнее работают с памятью. Но они менее гибкие в настройке. Гайд по настройке vLLM для Qwen может помочь.
Последний совет, который вы не найдёте в мануалах: перед запуском сервера закройте все приложения, которые могут использовать GPU. Браузер с YouTube, игра в фоне, даже Wallpaper Engine - всё это крадёт драгоценные мегабайты VRAM. Иногда освобождает до 2 ГБ.
И помните: на 2026 год модель Qwen 3.5 35B - уже не топовая. Выходят более эффективные архитектуры, требующие меньше памяти на токен контекста. Следите за новыми моделями, возможно, ваш RTX 3090 Ti ещё покажет характер.