Запуск DeepSeek-R1: Гайд по Ollama, vLLM и железу

Как поднять DeepSeek-R1 на арендованном сервере: реальные размеры моделей, выбор между Ollama и vLLM, рабочие Docker-команды и параметры, от которых зависит качество ответов.

YouGPU Team Обновлено: 7 мин

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-8Bdeepseek-r1:8bQ4_K_M5.2 ГБот 8 ГБ, подойдёт RTX 3060
DeepSeek-R1-Distill-Qwen-32Bdeepseek-r1:32bQ4_K_M19.9 ГБRTX 3090 / 4090 (24 ГБ)
DeepSeek-R1-Distill-Llama-70Bdeepseek-r1:70bQ4_K_M42.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 — чтобы держать нагрузку.

КритерийOllamavLLM
УстановкаОдна команда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-awqAWQ-сборка 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