Все уже слышали про новую модель DeepSeek r1, которая обогнала по бенчмаркам openai. Компания DeepSeek выложила веса и дистилляты в открытый доступ, поэтому мы можем их запустить.

В статье поднимем дистилляты модели r1 используя llama.cpp - потребуются лишь базовые умения работы с bash, docker и python. Самостоятельный запуск проще простого.

Что имеем?

Основная модель, о которой говорят, DeepSeek r1 - 671b Mixture of Experts (37B активаций на forward). Целиком пытаться инференсить такую модель очень затратно.

Если очень хочется r1, но не полную - есть квантизации от unsloth.

Квантизации оригинальной R1 от unsloth
Квантизации оригинальной R1 от unsloth

А можно для простых смертных?

На самом деле, такие размеры тоже достаточно велики. На практике скорее будут использоваться дистилляты, благо их на вкус и цвет. И, кстати, почему-то особо никто не говорит, что DeepSeek и их тоже выложила.

Дистилляции R1 от DeepSeek
Дистилляции R1 от DeepSeek

DeepSeek-R1-Distill-Qwen-32B - чуть круче О1-mini, согласно бенчмаркам, так что где-то тут кроется хорошее value-to-quality для многих задач.
7b qwen/8b llama - превосходят по качеству gpt4-o. Для ембеддингов и семантического поиска должно быть достаточно.
* Бенчмарки опубликованы вместе с моделью в карточке на huggingface. Делайте замеры самостоятельно на ваших бенчмарках, в случае сомнений.

Для каждой из этих моделей так же есть квантизации от unsloth.

Чтобы запустить модель, можно использовать фреймворк vllm. Но мы пойдем немного по-другому, развернув полноценный сервер инференса для удобного и интерактивного теста.

Кроме того, что unsloth сделали квантизации моделей, они еще конвертировали формат хранения - huggingface safetensors в ggml gguf.
ggml - базовая библиотека для llama.cpp - одного из самых эффективных и легких в использовании фреймворка инференса для llm.

На нем дальше и запустим сервер инференса.

Качаем веса модели

Выбираем нужную модель. Например:

  1. DeepSeek-R1-GGUF [huggingface]

  2. DeepSeek-R1-Distill-Llama-8B-GGUF [huggingface]

  3. DeepSeek-R1-Distill-Qwen-7B-GGUF [huggingface]

  4. DeepSeek-R1-Distill-Qwen-1.5B-GGUF [huggingface]

  5. DeepSeek-R1-Distill-Qwen-32B-GGUF [huggingface]

Устанавливаем hf_transfer для быстрой загрузки

pip install huggingface_hub hf_transfer

Запускаем скрипт на python для скачивания весов.

import os

os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"

from huggingface_hub import snapshot_download

hf_repo = “unsloth“

model_name = “DeepSeek-R1-Distill-Llama-8B-GGUF”

snapshot_download(

repo_id = f"{hf_repo}/{model_name}",

local_dir = f"/home/jovyan/sivtsov/inference/{hf_repo}-{model_name}",

allow_patterns = ["*8B-F16*"], # качаем веса только нужной модели

)

Обратите внимание на allow_patterns. В одном репозитории может находиться несколько разных моделей (в данном случае - квантизаций одной модели). Потому стоит указывать только те веса, которые вам нужны и не забивать диск остальными.

Нужный паттерн можно определить, зайдя в секцию “Files and Versions”. Там же можно сориентироваться по названию и весу чекпоинта.

Несколько файлов в одной карте модели. Стоит выбрать нужную вариацию модели
Несколько файлов в одной карте модели. Стоит выбрать нужную вариацию модели

Дальше туториал будет с 8B моделью для простоты, но вы можете подставить model_name “unsloth/DeepSeek-R1-GGUF”, если вы тут за оригинальной моделью. Учтите, что веса занимают много места, потому лучше использовать allow_patterns.

Запускаем готовый docker

Что нужно, для запуска:

  1. Linux, видеокарта nvidia

  2. Docker и python на системе

  3. Базовые навыки владения bash и python

Можно запустить готовый докер с сервером
docker run -p 8080:8080 -v /path/to/models:/models --gpus all ghcr.io/ggerganov/llama.cpp:server-cuda -m /models/model_name.gguf --host 0.0.0.0 --port 8080 --n-gpu-layers 20

-v /path/to/models:/models - данные в контейнере, скачанные после запуска будут удалены при любом перезапуске (ручном или в случае перезагрузки сервера). Потому веса модели должны находиться непосредственно на машине (а в кластерах лучше кешировать их отдельно).

--n-gpu-layers - сколько слоев загружать на видеокарту. Если в nvidia-smi много свободной памяти - повысьте параметр. Если запуск падает по out of memory - снижайте, пока не влезет (в логах отображается, сколько памяти пытался аллоцировать движок).

Готовый докер собран на cuda=12.6. Если у вас версия меньше, придется обновить cuda-toolkit или собрать образ самостоятельно.

Сборка докера под нужную CUDA

Для самостоятельной сборки образа под определенную cuda (для примера, 12.4.0):
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
docker build -t local/llama.cpp:server-cuda --build-arg CUDA_VERSION=12.4.0 --target server -f .devops/cuda.Dockerfile .

UI Интерфейс

Можно запускать руками скрипт llama.cpp с промптом. Для замеров памяти и времени исполнения это будет даже удобнее. Но, во-первых, руками склеивать историю общения в общий промт не очень удобно, а, во-вторых, дать попробовать модель обычным людям так сложнее.

У llama-cpp есть базовый UI-интерфес. Он как раз находиться на localhost:8080. Для тестирования моделей супер подходит. Все данные: контекст, диалоги, настройки - сохраняются в локальное хранилище браузера. Так что настройки не потеряются от постоянных тестовых перезапусков.

А как разные модели смогли помочь с различными бытовыми жизненными ситуациями, написал тут.

UI llama.cpp-server. Можно выбрать параметры генерации, устанавливать контекст, управлять диалогами
UI llama.cpp-server. Можно выбрать параметры генерации, устанавливать контекст, управлять диалогами

Итого

DeepSeek R1 крутая модель, превосходящая аналоги openai и доступная в opensource. Благодаря крутому мировому комьюнити уже сейчас имеем кучу квантизаций и дистилляций для разного применения. А с помощью llama.cpp мы можем достаточно быстро и удобно запускать модели для теста.

Комментарии (12)


  1. ENick
    03.02.2025 08:20

    "Что нужно, для запуска:

    1. Linux, видеокарта nvidia

      " а на какой карте запускали с CUDA_VERSION=12.4.0 ?


    1. svtDanny Автор
      03.02.2025 08:20

      nvidia 2080 12Gb
      llama.cpp умеет в офлоадинг на RAM, нужно подобрать значение --n-gpu-layers при запуске докера.
      Для 32b модели генерит слишком медленно, для 7-8b вполне норм


      1. ENick
        03.02.2025 08:20

        "для 7-8b вполне норм" а это примерно сколько токенов/сек?


        1. svtDanny Автор
          03.02.2025 08:20

          2080 Ti 12gb для простенького запроса. --n-gpu-layers 20
          DeepSeek-R1-Distill-Qwen-7B-F16

          prompt eval time = 232.39 ms/24 tokens (9.68 ms per token, 103.28 tokens per second)
          eval time = 143668.70 ms/1246 tokens (115.30 ms per token, 8.67 tokens per second)
          total time = 143901.08 ms/1270 tokens

          Обратите внимание, что эти цифры будут меняться от размера промпта.
          "вполне норм" - вполне норм, чтобы протестировать качество модели, имея под рукой +- любую не слишком старую видеокарту. Речь в туториале не идет об инференсе под нагрузкой


  1. AlexB17
    03.02.2025 08:20

    LM Studio и винда вполне достаточны что бы пощупать, запускал довольно большие но квантованные модели Qwen 14B Q4_K на 3060ti 8Gb и Qwen 32B Q6 на 4080 16Gb - довольно медленно но работают.


    1. svtDanny Автор
      03.02.2025 08:20

      Да, согласен, хороший вариант. Особенно, если основная рабочая машина на винде

      С llama.cpp мне нравится вариант потому, что образ можно развернуть на сервере и ребята с команды смогут с ним взаимодействовать. Хоть через UI для быстрого теста, хоть через openai-compatible api с микросервиса
      Ну и потом этот же llama.cpp в проде развернуть на железе мощнее


  1. orphaniel
    03.02.2025 08:20

    На Винде можно воспользоваться CoboldCPP - удобно, с гуём и веб-интерфейсом. Кстати, на том же huggingface есть расцензуренные дистиллы дипсика с пометкой "ablated" (например, deepseek-r1-qwen-2.5-32B-ablated-Q6_K_L), их гонять поинтереснее, чем стоковые дистиллы :)


    1. svtDanny Автор
      03.02.2025 08:20

      Да, согласен. Если нужно просто пользоваться моделью самому - приложение точно удобнее. Тем более под винду

      Про расцензуренные модели - спасибо, читателям будет полезно)
      Хотя, если модель разворачивать для компании, возможно, цензура не помешает)


  1. gfiopl8
    03.02.2025 08:20

    DeepSeek-R1-Distill-Qwen-32B - чуть круче О1-mini, согласно бенчмаркам, так что где-то тут кроется хорошее value-to-quality для многих задач. 7b qwen/8b llama - превосходят по качеству gpt4-o. Для ембеддингов и семантического поиска должно быть достаточно.

    Вообще не читаете что вам робот пишет? В какой вселенной 7b qwen/8b llama может хотя бы на километр приблизится к gpt4-o?