Зачем нужен контекст в миллион токенов? (Спойлер: для всего)
Представьте, что ваша нейросеть забывает начало разговора через 4 страницы текста. Примерно так работают модели с контекстом 4-8k. С 32k уже можно говорить о статьях, с 128k - о небольших книгах. Но миллион? Это полное собрание сочинений Толстого, техническая документация на целый проект или год переписки в Slack.
Что у нас в руках: железо против математики
RTX 3090 - 24 ГБ GDDR6X. Nemo 30B в 4-битной квантизации занимает около 16 ГБ. Казалось бы, остаётся 8 ГБ на контекст. Но математика памяти работает иначе.
Каждый токен в контексте требует хранения внимания (attention) - квадратичная сложность O(n²). Для 1M токенов это примерно 4 ТБ операций. На практике память под внимание растет как:
# Упрощенный расчет памяти для внимания
memory_per_token = (n_layers * d_head * 2) # примерно 30 МБ на слой
context_memory = memory_per_token * n_tokens² # вот где собака зарытаБез оптимизаций 1M токенов сожрут всю видеопамять, оперативку и ваше терпение. Но есть трюки.
CPU offloading: когда видеокарта говорит "хватит"
llama.cpp (версия b3856 на 07.02.2026) научилась умному распределению нагрузки. Суть в том, что слои модели живут в VRAM, а кэш внимания (KV cache) - частично в RAM.
1Скачиваем и готовим модель
Не берите первую попавшуюся квантизацию. Для длинного контекста нужны специальные версии:
# Качаем Nemo 30B с поддержкой 1M контекста
huggingface-cli download NousResearch/Nemo-30B-Instruct-1M-GGUF \
--local-dir ./models \
--include "*Q4_K_M*" # Этот формат баланс скорость/качествоПочему Q4_K_M? Q2 слишком теряет качество, Q8 не влезет. Q4_K_M - золотая середина для 30B моделей в 2026 году.
2Собираем llama.cpp с нужными флагами
Стандартная сборка не подойдет. Нужны флаги для длинного контекста:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
# Критически важные флаги:
make LLAMA_CUBLAS=1 LLAMA_CPU_OFFLOAD=1 \
LLAMA_CUDA_F16=1 LLAMA_FLASH_ATTN=1 \
-j$(nproc)LLAMA_CPU_OFFLOAD=1 - это магия. Без неё даже 128k токенов не запустить на одной карте. Флаг появился в версии b3782 и постоянно улучшается.
3Запускаем с правильными параметрами
Вот команда, которая работает на RTX 3090 с 64 ГБ RAM:
./main -m ./models/Nemo-30B-Instruct-1M-Q4_K_M.gguf \
-n 512 \
-c 1000000 \
--ctx-size 1000000 \
--rope-scaling 8.0 \
--rope-freq-base 1000000 \
-ngl 40 \
-b 512 \
-t 12 \
--mlock \
--no-mmap \
--cpu-offload 32Разберем по косточкам:
-ngl 40- 40 слоев на GPU. Остальные 8 (в Nemo 30B 48 слоев) автоматически уйдут на CPU--cpu-offload 32- резервируем 32 ГБ RAM под KV cache--rope-scaling 8.0и--rope-freq-base 1000000- магия позиционного кодирования для длинного контекста-b 512- размер батча. Меньше - стабильнее, больше - быстрее
Что получаем на выходе? Цифры и боль
| Контекст | Загрузка VRAM | Загрузка RAM | Скорость генерации |
|---|---|---|---|
| 32k токенов | 18.5 ГБ | 4 ГБ | 18 токенов/с |
| 128k токенов | 20.1 ГБ | 12 ГБ | 9 токенов/с |
| 512k токенов | 21.8 ГБ | 28 ГБ | 3 токенов/с |
| 1M токенов | 22.4 ГБ | 48 ГБ | 0.8 токенов/с |
Видите последнюю строчку? 0.8 токенов в секунду. Это примерно 50 слов в минуту. Медленнее, чем вы печатаете. Но! Это работает. Модель действительно обрабатывает миллион токенов контекста на одной потребительской видеокарте.
Сравнение с Seed OSS 36b: почему Nemo выигрывает
Seed OSS 36b - другой кандидат на длинный контекст. Но есть нюансы:
- Seed требует специальных оптимизаций для контекста >128k
- Nemo из коробки поддерживает 1M через RoPE scaling
- У Seed лучше перфоманс на коротких контекстах, но на 512k+ Nemo стабильнее
- Nemo 30B в GGUF формате лучше дружит с llama.cpp
Ошибки, которые сломают всё (проверено на себе)
1. Недостаточно оперативной памяти. Для 1M токенов нужно минимум 64 ГБ RAM. С 32 ГБ система начнет свопиться на диск, и скорость упадет до 0.01 токенов/с.
2. Неправильный rope-scaling. Если поставить --rope-scaling 1.0, модель "потеряет" контекст после 32k. Значение 8.0 проверено для Nemo 30B.
3. Попытка загрузить все слои на GPU. Даже с -ngl 48 (все слои) модель загрузится, но при генерации с длинным контекстом упадет с ошибкой CUDA out of memory.
4. Забыть про --mlock. Без этого флага система может выгружать часть модели в своп, что убивает производительность.
Альтернативы: когда одной RTX 3090 мало
Если 0.8 токенов/с - это слишком медленно, есть варианты:
- Две RTX 3090 через NVLink. В теории удваивает память. На практике NVLink для LLM работает неидеально, но помогает.
- Три видеокарты. Конфигурация 3x GPU даёт больше гибкости.
- Сборка с большей VRAM. Кастомные сборки с 68+ ГБ VRAM решают проблему радикально.
Практическое применение: что делать с 1M контекстом
1. Анализ кодовой базы. Можете загрузить весь репозиторий на 500к строк и спрашивать о любом модуле.
2. Юридические документы. Договор на 200 страниц со всеми приложениями - модель не потеряет ни одного пункта.
3. Исследовательские работы. Загрузите 50 научных статей по теме и попросите сделать обзор.
4. Длинные переписки. Год работы в Slack или почте - теперь можно анализировать целиком.
Важно: качество ответов на длинном контексте страдает. Модель может "потерять" важные детали из середины текста. Всегда проверяйте ключевые факты.
Будущее: что ждет длинный контекст в 2026
На 07.02.2026 уже есть модели с 10M контекстом (да, десять миллионов). Но запустить их локально - задача для серьезных многокарточных сборок.
Тренды:
- Flash Attention 3 в llama.cpp (ожидается в b3900+) ускорит обработку длинного контекста в 2-3 раза
- Новые форматы квантизации (Q3_K_XL) обещают лучшее качество при том же размере
- Аппаратная поддержка длинного контекста в новых GPU (RTX 5000 серия)
Мой прогноз: к концу 2026 запуск 1M контекста на одной карте станет рядовой задачей. Скорость вырастет до 5-10 токенов/с. А сегодня - пользуйтесь тем, что есть. Медленно, но работает.
P.S. Если собираете серьезную рабочую станцию, посмотрите гайд по оптимизации AI-станций. Там есть нюансы, о которых не пишут в мануалах.