Запуск DeepSeek-R1: Гайд по Ollama, vLLM и железу
Как поднять DeepSeek-R1 на арендованном сервере: реальные размеры моделей, выбор между Ollama и vLLM, рабочие Docker-команды и параметры, от которых зависит качество ответов.
TL;DR — Кратко:
- Веса 32B в 4-битном кванте занимают 19.9 ГБ — карта на 24 ГБ подходит, но контекст придётся ограничить.
- Ollama берёт фиксированное квантование под каждый тег и не подстраивает его под вашу память.
- Температура 0.6 и запрет системного промпта — рекомендации самих авторов модели, без них R1 зацикливается.
DeepSeek выложила R1 с открытыми весами под лицензией MIT, включая цепочки рассуждений, которые OpenAI держит закрытыми в o1. Полная модель — 671 миллиард параметров, из которых на каждом токене активны 37 миллиардов, и контекст на 128K (карточка модели DeepSeek-R1). Развернуть такое на одном сервере не выйдет.
Практический интерес представляют дистиллированные версии на базе Qwen 2.5 и Llama — они запускаются на одной, максимум двух картах. Ниже — как поднять их на арендованном сервере с Ubuntu 22.04, чем Ollama отличается от vLLM и какие параметры запуска напрямую влияют на качество ответов.
Сколько VRAM нужно: реальные размеры
Размер файла модели — это нижняя граница требований к видеопамяти. Сверху добавляется KV-кеш, который растёт вместе с длиной контекста и числом параллельных запросов.
Цифры ниже взяты не на глаз: это фактические размеры блобов в реестре Ollama и файлов весов на Hugging Face.
| Модель | Тег Ollama | Квантование | Размер весов | Рекомендуемая карта |
|---|---|---|---|---|
| DeepSeek-R1-Distill-Llama-8B | deepseek-r1:8b | Q4_K_M | 5.2 ГБ | от 8 ГБ, подойдёт RTX 3060 |
| DeepSeek-R1-Distill-Qwen-32B | deepseek-r1:32b | Q4_K_M | 19.9 ГБ | RTX 3090 / 4090 (24 ГБ) |
| DeepSeek-R1-Distill-Llama-70B | deepseek-r1:70b | Q4_K_M | 42.5 ГБ | RTX A6000 / A40 (48 ГБ) или 2×24 ГБ |
Размеры получены из манифестов
registry.ollama.ai/v2/library/deepseek-r1на 18 августа 2026 года. Версия 32B в формате AWQ на Hugging Face весит сопоставимо — 19.3 ГБ.
Отсюда следуют два практических вывода.
32B на карте с 24 ГБ помещается, но без запаса. Веса занимают 19.9 ГБ, остаётся около четырёх на KV-кеш. Этого хватает на короткий контекст, поэтому при запуске придётся явно ограничивать --max-model-len. На домашней машине запас съедает ещё и рабочий стол с браузером: на сервере без графической оболочки вся память уходит модели.
Оригинальные веса в BF16 — совсем другой разговор. Модель 32B без квантования занимает около 66 ГБ, и официальный пример запуска в карточке DeepSeek использует --tensor-parallel-size 2, то есть две карты. Если у вас одна, квантование обязательно. Как посчитать KV-кеш и число одновременных запросов под свою карту, разобрано в справочнике по VRAM для инференса; из чего складывается расход при обучении — в статье про VRAM для обучения.
Ollama или vLLM: что выбрать
Короткий ответ: Ollama — чтобы проверить модель за десять минут, vLLM — чтобы держать нагрузку.
| Критерий | Ollama | vLLM |
|---|---|---|
| Установка | Одна команда | Docker-образ с флагами |
| Формат весов | GGUF, скачивается автоматически по тегу | Safetensors с HF, квантование указывается вручную |
| Параллельные запросы | Обрабатываются последовательно | PagedAttention, непрерывный батчинг |
| API | Свой формат плюс OpenAI-совместимый слой | OpenAI-совместимый из коробки |
| Несколько GPU | Ограниченно | --tensor-parallel-size |
Разница в пропускной способности заметна именно на параллельных запросах: Ollama выполняет их по очереди, vLLM собирает в батч. Для одного пользователя в чате это неважно, для сервиса с десятком клиентов — определяющий фактор.
Подготовка сервера
Предполагаем чистый Ubuntu 22.04 с установленными драйверами NVIDIA. Проверить их наличие можно через nvidia-smi.
Ставим утилиты для наблюдения за картой:
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git htop nvtop Дальше — NVIDIA Container Toolkit, без него Docker не увидит видеокарту. Команда из официальной документации NVIDIA:
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list |
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' |
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker Проверка: docker run --rm --gpus all ubuntu nvidia-smi должен показать таблицу с видеокартой. Тот же шаг подробнее разобран в гайде по Whisper, включая типичную ошибку с отсутствующими библиотеками CUDA в образе.
Запуск через Ollama
Установка одной командой, способ с сайта проекта:
curl -fsSL https://ollama.com/install.sh | sh Запуск модели:
ollama serve &
# Доступные теги: deepseek-r1:8b, deepseek-r1:32b, deepseek-r1:70b
ollama run deepseek-r1:32b Здесь есть распространённое заблуждение, которое стоит разобрать. Ollama не подбирает квантование под объём вашей видеопамяти. Каждый тег в библиотеке жёстко связан с одним файлом. deepseek-r1:32b — это всегда GGUF в кванте Q4_K_M на 19.9 ГБ, какая бы карта у вас ни стояла. Под память подстраивается другое — сколько слоёв Ollama оставит на GPU, а сколько выгрузит в оперативную. Выгрузка работает, но скорость падает в разы, потому что часть вычислений уходит на процессор.
В консоли откроется чат. Модель сначала выводит блок <think> с рассуждением, потом даёт ответ. Связка Ollama с Open WebUI подробнее разобрана в гайде по Llama 3.
API поднимается на порту 11434:
import requests
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": "deepseek-r1:32b",
"prompt": "Напиши скрипт на Python для парсинга цен с сайта.",
"stream": False,
"options": {"temperature": 0.6},
},
timeout=600,
)
print(response.json()["response"]) Запуск через vLLM
vLLM использует PagedAttention для управления KV-кешем и собирает параллельные запросы в батч. Официальный образ работает с весами напрямую с Hugging Face.
Для карты на 24 ГБ берём готовую AWQ-версию: оригинал в BF16 весит около 66 ГБ и на одну такую карту не поместится.
mkdir -p $HOME/.cache/huggingface
docker run --runtime nvidia --gpus all
-v $HOME/.cache/huggingface:/root/.cache/huggingface
-p 8000:8000
--ipc=host
vllm/vllm-openai:latest
--model casperhansen/deepseek-r1-distill-qwen-32b-awq
--quantization awq
--dtype float16
--max-model-len 8192
--gpu-memory-utilization 0.95 Что делают флаги:
--model casperhansen/deepseek-r1-distill-qwen-32b-awq— AWQ-сборка 32B на 19.3 ГБ весов. Проверьте доступность репозитория перед запуском: сборки от сообщества иногда закрывают или удаляют, и тогда контейнер упадёт на ошибке авторизации.--quantization awq— говорит vLLM, как читать веса. Подробности в документации по AWQ.--max-model-len 8192— ограничение контекста. На 24 ГБ значение по умолчанию не влезет.--gpu-memory-utilization 0.95— доля памяти карты, которую vLLM резервирует под себя.--ipc=host— нужен для разделяемой памяти между процессами загрузчика данных.
На выходе получается OpenAI-совместимый API на порту 8000: любой клиент подключается сменой base_url.
Если карт две, квантование не обязательно. Официальный пример из карточки модели запускает оригинальные веса так:
vllm serve deepseek-ai/DeepSeek-R1-Distill-Qwen-32B
--tensor-parallel-size 2
--max-model-len 32768
--enforce-eager Параметры, от которых зависит качество ответов
Этот раздел важнее, чем кажется. Авторы модели опубликовали список рекомендаций, и без них R1 ведёт себя заметно хуже — независимо от того, через Ollama вы её запускаете или через vLLM.
Температура 0.5–0.7, оптимально 0.6. При значениях выше модель начинает зацикливаться и выдавать бессвязный текст. Это прямая рекомендация из карточки модели, а не вопрос вкуса.
Системный промпт не использовать. Все инструкции нужно помещать в пользовательское сообщение. R1 обучалась без системного промпта, и его наличие сбивает формат рассуждения.
Заставляйте модель начинать ответ с <think>. Авторы отмечают, что R1 иногда пропускает этап рассуждения, выдавая пустой блок <think>\n\n</think>, и качество ответа из-за этого падает. Принудительный префикс решает проблему.
Максимальная длина генерации — 32 768 токенов. Именно это значение использовалось при замерах в карточке модели.
Все четыре пункта — из раздела Usage Recommendations в карточке DeepSeek-R1.
Веб-интерфейс Open WebUI
Open WebUI даёт интерфейс в духе ChatGPT поверх локального API. Создайте docker-compose.yml:
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
ports:
- "3000:8080"
environment:
# Для vLLM:
- OPENAI_API_BASE_URL=http://host.docker.internal:8000/v1
- OPENAI_API_KEY=sk-dummy-key
# Для Ollama раскомментируйте вместо двух строк выше:
# - OLLAMA_BASE_URL=http://host.docker.internal:11434
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- open-webui:/app/backend/data
restart: always
volumes:
open-webui: Запуск:
docker compose up -d Интерфейс открывается по адресу http://<IP-сервера>:3000, аккаунт создаётся локально. Ключ version в файле не указан намеренно: Compose V2 его игнорирует и предупреждает об устаревании.
Порт 3000 по умолчанию открыт без аутентификации на уровне сети. На публичном IP закройте его файрволом или поставьте реверс-прокси с авторизацией.
Что ломается и как чинить
CUDA out of memory
Три причины по частоте.
Контекст больше, чем помещается: уменьшите --max-model-len до 8192 или 4096. Память занята другим процессом: посмотрите через nvtop, не остался ли запущенным ollama serve — он держит веса в памяти и не даст стартовать vLLM. Квантование не применилось: на 24 ГБ версия 32B в BF16 не поместится физически, нужен AWQ, GPTQ или GGUF.
Общий разбор причин OOM и способов уложиться в имеющуюся память — в статье про VRAM.
nvidia-smi перестал видеть карту
Драйвер отключился после обновления ядра или перегрева. На арендованном сервере быстрее всего помогает перезагрузка; если не помогло, переустановите драйверы и повторите настройку Container Toolkit.
Модель зацикливается или отвечает бессвязно
Первое, что нужно проверить, — температуру. При значениях выше 0.7 R1 склонна к бесконечным повторам, и авторы модели прямо предупреждают об этом. Ставьте 0.6.
Если температура в порядке, а ответы всё равно пустые или поверхностные, проверьте, не пропускает ли модель этап рассуждения: признак — пустой блок <think>\n\n</think> в начале ответа. Лечится принудительным префиксом <think>\n.
Увеличивать лимит токенов имеет смысл только тогда, когда рассуждение обрывается на середине и до ответа дело не доходит. Само по себе зацикливание лимитом не лечится.
Лицензии, если планируете коммерческое использование
Веса DeepSeek-R1 и код репозитория распространяются под MIT и разрешают коммерческое использование и производные работы. Но дистиллированные версии наследуют лицензии базовых моделей:
- Distill-Qwen (1.5B, 7B, 14B, 32B) — Qwen 2.5 под Apache 2.0
- Distill-Llama-8B — лицензия Llama 3.1
- Distill-Llama-70B — лицензия Llama 3.3
Различие существенное: у лицензий Llama есть ограничения, которых нет у Apache 2.0 и MIT. Перед выкаткой в продакшен проверьте условия конкретной версии.
Что в итоге
Для быстрой проверки и пет-проектов подходит Ollama: одна команда установки, автоматическая загрузка весов, работающий чат через десять минут. Для сервиса с параллельными запросами нужен vLLM с готовой квантованной сборкой.
По качеству на задачах рассуждения дистиллят 32B держится уверенно. В замерах из карточки модели он набирает 72.6 на AIME 2024 против 9.3 у GPT-4o-0513. На MATH-500 разрыв меньше: 94.3 против 74.6. Рейтинг CodeForces — 1691 против 759. Оговорка обязательна: это узкие бенчмарки на математику и код, а не общая оценка модели, и меряли их сами авторы.
Ограничивает всё та же видеопамять. Версия 32B требует 24 ГБ, 70B — 48 ГБ, и покупать такую карту ради нескольких экспериментов невыгодно. Проще арендовать сервер с нужной картой, проверить конфигурацию на реальной нагрузке и выключить.
Не хватает VRAM для DeepSeek-R1?
Запустите дистиллят на 70B без выгрузки в оперативную память — сервер с RTX A6000 на 48 ГБ, драйверы и Docker уже настроены.
Запустить DeepSeek-R1