Почему ваша DeepSeek-V3.2 работает вполсилы
Вы скачали свежую DeepSeek-V3.2, применили наш патч для конвертации, запустили модель в llama.cpp - и увидели это в логах:
llama_model_loader: n_ctx_train = 131072, n_ctx_seq = 4096
llama_model_loader: warning: model was trained with context size 131072, but you are using 4096
Модель тренировали на контексте в 131 тысячу токенов, а вы используете жалкие 4 тысячи. Это как купить Ferrari и ездить на ней 40 км/ч. Хуже того - вы не можете просто увеличить контекст через --ctx-size, потому что получите ошибку.
Что на самом деле означает n_ctx_seq < n_ctx_train
Это не баг, а особенность архитектуры. DeepSeek-V3.2 использует смешанную стратегию внимания - часть контекста обрабатывается через sparse attention, часть через обычное. При конвертации в llama.cpp (через наш патч) sparse attention игнорируется, но метаданные о полном контексте остаются.
1 Почему нельзя просто увеличить --ctx-size
Потому что llama.cpp распределяет память под кэш внимания на основе n_ctx_seq. Если вы установите --ctx-size 131072 без дополнительных параметров, система попытается выделить память под полный контекст - и скорее всего упадет с ошибкой OOM (Out of Memory).
| Параметр | Значение по умолчанию | Что делает |
|---|---|---|
| n_ctx_train | 131072 | Контекст, на котором тренировали модель |
| n_ctx_seq | 4096 | Контекст, который использует llama.cpp после конвертации |
| --ctx-size | 512 | Размер контекста во время инференса |
Исправляем n_ctx_seq: три способа
Есть три подхода, от простого к сложному. Начнем с того, что работает прямо сейчас.
2 Способ 1: Грубая сила (работает всегда)
Переконвертируем модель с правильными параметрами. Если вы еще не конвертировали DeepSeek-V3.2, сделайте это с такими параметрами:
python convert.py \
--outfile deepseek-v3.2-gguf.Q4_K_M.gguf \
--outtype q4_k_m \
--ctx 65536 \
/путь/к/DeepSeek-V3.2
Ключевой параметр --ctx 65536. Я ставлю 65536 вместо 131072, потому что на практике даже 65 тысяч токенов - это огромный контекст, и для него нужно очень много памяти. Начинайте с этого значения.
3 Способ 2: Хак через --rope-scaling
Llama.cpp на 16.02.2026 поддерживает динамическое масштабирование позиционных эмбеддингов. Это позволяет "растянуть" контекст без переконвертации:
./main -m deepseek-v3.2.gguf \
--ctx-size 32768 \
--rope-scaling linear \
--rope-freq-base 1000000 \
--rope-freq-scale 0.25 \
-n 256
Что здесь происходит:
- --rope-scaling linear: включаем линейное масштабирование позиционных эмбеддингов
- --rope-freq-base 1000000: базовая частота для RoPE (обычно 10000, но для больших контекстов увеличиваем)
- --rope-freq-scale 0.25: коэффициент масштабирования
Этот способ работает, но качество модели может немного упасть на длинных контекстах. Проверьте на своих задачах.
4 Способ 3: Правка GGUF-файла (для продвинутых)
Если не боитесь испортить файл модели, можно отредактировать метаданные в GGUF. Для этого используйте утилиту gguf-metadata:
# Сначала устанавливаем утилиту
pip install gguf-metadata
# Смотрим текущие параметры
gguf-metadata show deepseek-v3.2.gguf | grep ctx
# Меняем n_ctx_seq
gguf-metadata set deepseek-v3.2.gguf \
--key llama.context_length \
--value 65536 \
--type i32
После этого перезапустите модель с --ctx-size 65536. Предупреждение: это экспериментальная техника, всегда делайте бэкап файла модели.
Настройка оффлоада слоев: как не сжечь видеокарту
DeepSeek-V3.2 весит около 236 миллиардов параметров в полной версии. Даже квантованная версия Q4_K_M занимает ~130 ГБ. У вас точно нет столько видеопамяти. Поэтому используем оффлоад - часть слоев на GPU, часть на CPU.
5 Расчет оптимального распределения слоев
Сначала узнаем, сколько слоев в модели и сколько видеопамяти доступно:
./main -m deepseek-v3.2.gguf --verbose 2>&1 | grep "n_layer"
Для DeepSeek-V3.2 обычно 80-120 слоев (в зависимости от конкретной версии). Предположим, у вас 24 ГБ видеопамяти на RTX 4090. Расчет:
- Полная модель Q4_K_M: ~130 ГБ
- Один слой: ~130 ГБ / 100 слоев = 1.3 ГБ на слой
- Видеопамять под слои: 24 ГБ - 4 ГБ (на кэш и системные нужды) = 20 ГБ
- Слоев на GPU: 20 ГБ / 1.3 ГБ ≈ 15 слоев
Значит, 15 слоев на GPU, остальные 85 на CPU. Но это слишком мало - инференс будет медленным. На практике лучше использовать SSD Offload для части слоев.
6 Команда запуска с оффлоадом
Вот рабочая команда для запуска DeepSeek-V3.2 с оффлоадом на февраль 2026:
./main -m deepseek-v3.2.gguf \
--ctx-size 32768 \
--rope-scaling linear \
--rope-freq-base 1000000 \
--rope-freq-scale 0.25 \
--gpu-layers 35 \
--tensor-split 24 \
--main-gpu 0 \
--threads 24 \
--threads-batch 12 \
--batch-size 512 \
--ubatch-size 512 \
--no-mmap \
--mlock \
-n 512 \
-p "Ваш промпт здесь"
Разберем ключевые параметры:
- --gpu-layers 35: 35 слоев на GPU. Начинайте с этого значения, увеличивайте если хватает памяти
- --tensor-split 24: максимальный размер тензоров на GPU в гигабайтах
- --no-mmap --mlock: отключаем memory mapping, фиксируем модель в RAM для стабильности
- --batch-size 512 --ubatch-size 512: размеры батчей для оптимизации памяти
Что пойдет не так: пять частых ошибок
| Ошибка | Причина | Решение |
|---|---|---|
| "CUDA out of memory" | Слишком много слоев на GPU | Уменьшите --gpu-layers на 5-10 |
| Медленный инференс | Слишком мало слоев на GPU, много обмена CPU-GPU | Увеличьте --gpu-layers, если есть память |
| "Illegal instruction" | Старый CPU без AVX2/AVX512 | Пересоберите llama.cpp с -DLLAMA_NATIVE=OFF |
| Падение при длинном контексте | Не хватает оперативной памяти | Уменьшите --ctx-size, используйте --flash-attn |
| Низкое качество генерации | Проблемы с RoPE scaling | Поэкспериментируйте с --rope-freq-base и --rope-freq-scale |
Совет, который вы не найдете в документации
Не гонитесь за максимальным контекстом. DeepSeek-V3.2 тренировали на 131 тысяче токенов, но на практике даже 32 тысячи - это огромный объем. Если вы анализируете код или документы, разбейте их на чанки по 8-16 тысяч токенов и обрабатывайте отдельно.
В llama.cpp на 16.02.2026 есть скрытый параметр --parallel 2, который запускает два потока инференса. Для серверного использования попробуйте:
./server -m deepseek-v3.2.gguf \
--ctx-size 16384 \
--gpu-layers 40 \
--parallel 2 \
--cont-batching \
--port 8080
--cont-batching включает непрерывный батчинг - новая функция в llama.cpp, которая появилась в конце 2025 года. Она позволяет обрабатывать несколько запросов одновременно без перезагрузки контекста.
Что будет дальше с оптимизацией DeepSeek-V3.2
К середине 2026 года ожидайте нативную поддержку sparse attention в llama.cpp. Разработчики уже работают над этим, но пока приходится использовать костыли. Когда поддержка появится, производительность вырастет в 2-3 раза на длинных контекстах.
А пока - настраивайте оффлоад, экспериментируйте с RoPE scaling и не забывайте мониторить использование памяти. DeepSeek-V3.2 - монстр, но при правильной настройке он помещается даже в относительно скромное железо.