Llama 3 на своем сервере: Гайд по Ollama + Docker

Поднимаем Llama 3 в связке Ollama и Open WebUI через Docker: сколько нужно VRAM, как пробросить GPU в контейнер и чем нативный API отличается от OpenAI-совместимого.

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

TL;DR — Кратко:

  • Llama 3 8B в 4-битном кванте занимает 4.7 ГБ, 70B — 40 ГБ; в fp16 те же модели требуют 16 и 141 ГБ.
  • Без NVIDIA Container Toolkit контейнер не увидит видеокарту и уйдёт считать на процессор.
  • У Ollama два разных API: нативный на /api/generate и OpenAI-совместимый на /v1 — подставлять в SDK нужно второй.

Своя LLM на сервере решает две задачи: данные не уходят к стороннему провайдеру, и стоимость перестаёт зависеть от числа токенов. Плата за это — настройка окружения и видеопамять, которую нужно откуда-то взять.

Ниже — как поднять Llama 3 в связке Ollama (бэкенд) и Open WebUI (интерфейс) внутри Docker. Разберём три вещи: сколько памяти реально требуется, как пробросить GPU в контейнер и что проверить, если инференс оказался на процессоре.

Сколько VRAM нужно

Размер весов — нижняя граница. Сверху добавляется контекст, поэтому запас нужен всегда.

МодельКвантованиеРазмер весовМинимум VRAMПодходящая карта
Llama 3 8BQ4_0 (4-bit)4.7 ГБ6 ГБRTX 3060 / 4060
Llama 3 8Bfp1616.1 ГБ20 ГБRTX 3090 / 4090
Llama 3 70BQ4_0 (4-bit)40.0 ГБ48 ГБRTX A6000 или 2× RTX 3090
Llama 3 70Bfp16141 ГБ160 ГБ+Кластер A100 / H100

Размеры квантованных весов взяты из манифестов реестра Ollama на 18 августа 2026 года: llama3:8b — 4.66 ГБ, llama3:70b — 39.97 ГБ, обе в формате GGUF Q4_0. Значения для fp16 посчитаны из числа параметров в карточках Meta на Hugging Face: 8.03 млрд и 70.55 млрд по два байта на параметр.

Отсюда простой вывод: на одной потребительской карте реально живёт только 8B. Разница между 4-битным квантом и fp16 для восьмимиллиардной модели — 4.7 ГБ против 16.1, то есть между «влезает в RTX 3060» и «нужна 3090». Для 70B квантование обязательно в любом случае: 141 ГБ не помещается ни в одну одиночную карту.

Потери качества при 4-битном квантовании есть, но для чата и типовых задач они обычно не критичны. Колонка «Минимум VRAM» здесь рассчитана на один запрос: как посчитать KV-кеш под свой контекст и число параллельных пользователей, разобрано в справочнике по VRAM для инференса. Расход при обучении — в статье про VRAM для обучения.

Установка Docker и NVIDIA Container Toolkit

Docker сам по себе видеокарту не видит. Контейнеры изолированы, и драйверы нужно пробросить явно — за это отвечает NVIDIA Container Toolkit. Без него Ollama запустится, но будет считать на процессоре.

Предполагаем Ubuntu или Debian с установленными драйверами NVIDIA: nvidia-smi должен показывать таблицу.

Docker ставим скриптом с официального сайта:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Дальше Container Toolkit, команда из документации 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 должен вывести ту же таблицу, что и на хосте. Если вывода нет — дальше идти бессмысленно, инференс уйдёт на CPU.

Docker Compose: Ollama и Open WebUI

Оба сервиса поднимаются одним файлом. Создайте папку llm-stack и docker-compose.yml внутри:

services:
  ollama:
    image: ollama/ollama:latest
    container_name: ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    volumes:
      - ./ollama_data:/root/.ollama
    ports:
      - "11434:11434"
    restart: always

  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    volumes:
      - ./webui_data:/app/backend/data
    ports:
      - "3000:8080"
    environment:
      - OLLAMA_BASE_URL=http://ollama:11434
    depends_on:
      - ollama
    restart: always

Три детали, которые стоит отметить. Блок deploy.resources.reservations.devices — это и есть проброс GPU; без него контейнер стартует, но карты не увидит. Тома ollama_data и webui_data держат веса и историю чатов вне контейнера, поэтому пересоздание не приводит к повторной загрузке модели. Обращение идёт по имени сервиса http://ollama:11434 — это внутренняя сеть Compose, наружу порт для этого открывать не нужно.

Ключ version в файле не указан намеренно: Compose V2 его игнорирует и предупреждает об устаревании.

Запуск:

docker compose up -d

Загрузка модели и проверка GPU

Контейнеры поднялись, но весов внутри ещё нет — Ollama стартует пустой.

docker exec -it ollama ollama pull llama3

Тег llama3 соответствует версии 8B в кванте Q4_0, это 4.7 ГБ загрузки. Полный список тегов — в библиотеке Ollama.

Теперь проверим, что инференс действительно идёт на видеокарте. Запустите в одном окне:

docker exec -it ollama ollama run llama3 "Write a hello world python code"

А в соседнем — watch -n 0.5 nvidia-smi. Во время генерации должны вырасти и занятая память, и загрузка GPU. Если память занята, а утилизация держится около нуля — модель загрузилась в видеопамять, но считает процессор.

Два API: нативный и OpenAI-совместимый

Здесь легко ошибиться, потому что Ollama отдаёт два разных API одновременно, и они несовместимы между собой.

Нативный API Ollama живёт на /api/generate и принимает собственный формат:

curl http://localhost:11434/api/generate -d '{
  "model": "llama3",
  "prompt": "Why is the sky blue?",
  "stream": false
}'

OpenAI-совместимый слой живёт на /v1 и повторяет схему OpenAI:

curl http://localhost:11434/v1/chat/completions -d '{
  "model": "llama3",
  "messages": [{"role": "user", "content": "Why is the sky blue?"}]
}' -H "Content-Type: application/json"

Разница практическая: если вы подставляете адрес в клиент OpenAI, base_url должен указывать на http://localhost:11434/v1, а не на корень. Ключ API при этом нужен любой непустой — библиотеки требуют его формально. Детали и список поддерживаемых полей — в документации Ollama.

Веб-интерфейс Open WebUI

Интерфейс открывается по адресу http://localhost:3000. При первом входе создаётся локальный аккаунт, данные лежат в томе webui_data. Модель выбирается в выпадающем списке сверху — там появится llama3:latest.

Open WebUI умеет больше, чем чат: загрузка документов для RAG, системные промпты, переключение между моделями, подключение генерации изображений.

Одно предупреждение по безопасности. Порт 3000 открыт без сетевой аутентификации: регистрация в самом интерфейсе защищает от посторонних только после того, как вы создали первый аккаунт. На публичном IP закройте порт файрволом или поставьте перед ним реверс-прокси с авторизацией, не полагаясь на встроенную регистрацию.

Что ломается и как чинить

could not select device driver

Ошибка при docker compose up. Причина одна: NVIDIA Container Toolkit не установлен или Docker не перенастроен после установки. Вернитесь к разделу про Container Toolkit, выполните sudo nvidia-ctk runtime configure --runtime=docker и перезапустите демон.

Генерация идёт заметно медленнее ожидаемого

Скорее всего, инференс на процессоре. Проверьте логи: docker logs ollama — при работающем пробросе там будут строки об обнаруженной видеокарте. Если их нет, дело в секции deploy в docker-compose.yml или в том же Container Toolkit.

Вторая причина — модель не поместилась целиком, и часть слоёв выгружена в оперативную память. Тогда nvidia-smi покажет занятую почти под завязку видеопамять при невысокой утилизации. Лечится переходом на модель поменьше или на более агрессивный квант.

Out of memory

Модель не влезает в карту. Сверьтесь с таблицей в начале: 70B в 4-битном кванте требует 48 ГБ, и на карте с 8 ГБ она не запустится ни при каких настройках. Если памяти не хватает немного, помогает освободить карту от посторонних процессов — на рабочей машине видеопамять занимает и графическая оболочка, и браузер. На сервере без GUI этой проблемы нет.

Подробный разбор причин OOM есть в гайде по DeepSeek-R1, там же — про ограничение длины контекста.

Какую версию Llama брать в 2026 году

Гайд написан про Llama 3, и все команды выше работают с ней. Но с момента её выхода Meta выпустила несколько обновлений, и в реестре Ollama доступны более свежие теги: llama3.1:8b, llama3.2:3b, llama3.3:70b.

Схема запуска для них не меняется — достаточно подставить нужный тег в ollama pull. Если вы разворачиваете стек с нуля и вас не связывает совместимость с уже настроенными промптами, начинать имеет смысл с более новой версии.

Что в итоге

Стек из Ollama и Open WebUI поднимается одним docker compose up, а вся сложность сосредоточена в двух местах: проброс GPU через Container Toolkit и выбор модели под объём видеопамяти.

Экономика зависит от загрузки. Своя модель не бесплатна: вы платите за железо или за его аренду, и на редких запросах облачный API обходится дешевле, потому что там не нужно оплачивать простой. Смысл появляется при постоянном потоке запросов или когда данные нельзя отдавать наружу.

Если 8B перестало хватать, следующий шаг — не обязательно более крупная модель. Дообучение под свою задачу часто даёт больше, чем рост числа параметров, и требует меньше памяти. Как это делается на одной карте, показывает разбор файн-тюнинга Llama 3 на 16 ГБ VRAM.

Не хватает VRAM для Llama 3 70B?

Арендуйте сервер с RTX A6000 на 48 ГБ — драйверы, Docker и NVIDIA Container Toolkit уже настроены.

Выбрать сервер под LLM