Ollama и Open WebUI на GPU-сервере: что вы получаете
Чтобы запустить Ollama и Open WebUI на GPU-сервере, установите Ollama официальным скриптом — он настроит её как службу systemd на 127.0.0.1:11434, — скачайте модель, затем запустите Open WebUI в Docker с подключением к этому локальному экземпляру Ollama и откройте интерфейс через SSH-туннель. Ollama загружает модели на GPU и отдаёт их через собственный API и API, совместимый с OpenAI. Open WebUI добавляет интерфейс в стиле ChatGPT с учётными записями и историей чатов: вместе они дают свой ChatGPT на собственном сервере.
| Ollama + Open WebUI | vLLM | |
|---|---|---|
| Модели | Скачиваются по тегу из библиотеки Ollama; тег по умолчанию обычно 4-битный | Чекпоинты Hugging Face в BF16, FP8 или 4-битных форматах |
| Параллельные запросы | По умолчанию один запрос на модель за раз (OLLAMA_NUM_PARALLEL) | Непрерывный батчинг входящих запросов |
| Несколько GPU | Распределяет модель по нескольким GPU, только если она не помещается на один | Тензорный и конвейерный параллелизм, параллелизм данных |
| Веб-интерфейс | Open WebUI | Встроенного нет; к нему можно подключить Open WebUI |
Ollama подходит, если нужен приватный чат-интерфейс для вас или небольшой команды и быстрое переключение между моделями; vLLM (Инференс-сервер) — если к API одновременно обращается много пользователей или приложений. Если при заказе вы выбрали Ollama с Open WebUI на шаге «ПО», оба сервиса уже установлены вместе с вашей моделью; в этом руководстве они настраиваются вручную. Зачем всё это на своём сервере — в статье приватный ChatGPT на своём GPU-сервере.
Установка Ollama на Ubuntu
Сначала установите драйвер GPU (Драйверы NVIDIA и CUDA или ROCm на MI355X): если установщик найдёт GPU NVIDIA без драйвера, он сам поставит пакет NVIDIA cuda-drivers, и драйверы окажутся из разных источников. Затем запустите скрипт со страницы Ollama о Linux:
sudo apt update && sudo apt install -y zstd # установщику нужен zstd для распаковки
curl -fsSL https://ollama.com/install.sh | sh
ollama -v # установленная версия
systemctl status ollama --no-pager # active (running)
nvidia-smi # NVIDIA: в списке все GPU
amd-smi list # AMD MI355X
Скрипт создаёт пользователя ollama (в группах render и video), устанавливает и запускает службу systemd ollama на 127.0.0.1:11434, а на хостах с AMD добавляет библиотеки ROCm от Ollama, но не драйвер ядра.
- NVIDIA: Ollama нужна Compute Capability 5.0 или выше и драйвер версии 550 или новее (страница о GPU). На этой странице нет строк для B200 и B300 (в примечаниях к выпуску 0.32.3 упоминается поддержка B200 через CUDA 12); на любом из этих GPU проверьте с помощью
ollama ps(см. ниже), что модели загружаются на GPU. - AMD: Ollama нужен драйвер ROCm v7. Страница о GPU перечисляет Instinct MI350X и целевую архитектуру gfx950, общую с MI355X, но сам MI355X по имени не называет: проверьте эту страницу, прежде чем на неё полагаться.
Настройка Ollama: OLLAMA_HOST, модели на NVMe, параметры GPU
Ollama читает переменные окружения. Задавайте их в drop-in-файле systemd, а не в ollama.service, который скрипт установки перезаписывает при каждом запуске (sudo systemctl edit ollama открывает drop-in-файл в редакторе). Модели храните на NVMe-диске для данных (Хранилище и данные), владелец — пользователь ollama:
sudo mkdir -p /data/ollama/models
sudo chown -R ollama:ollama /data/ollama
sudo mkdir -p /etc/systemd/system/ollama.service.d
sudo tee /etc/systemd/system/ollama.service.d/override.conf >/dev/null <<'EOF'
[Service]
Environment="OLLAMA_HOST=127.0.0.1:11434"
Environment="OLLAMA_MODELS=/data/ollama/models"
Environment="OLLAMA_NO_CLOUD=1"
Environment="OLLAMA_CONTEXT_LENGTH=32768"
Environment="OLLAMA_NUM_PARALLEL=4"
Environment="OLLAMA_KEEP_ALIVE=30m"
Environment="OLLAMA_KV_CACHE_TYPE=q8_0"
EOF
sudo systemctl daemon-reload
sudo systemctl restart ollama
journalctl -u ollama -b --no-pager | grep -i "cloud disabled" # Ollama cloud disabled: true
| Переменная | Действие |
|---|---|
OLLAMA_HOST | Адрес API (по умолчанию 127.0.0.1:11434). Оставьте его на localhost: Ollama не проверяет API-ключи. |
OLLAMA_MODELS | Каталог моделей (по умолчанию /usr/share/ollama/.ollama/models; уже скачанные модели остаются там). |
OLLAMA_NO_CLOUD | 1 отключает облачные модели и веб-поиск Ollama, чтобы модели работали только на ваших GPU. |
OLLAMA_CONTEXT_LENGTH | Контекстное окно в токенах; по умолчанию 4k при памяти GPU менее 24 ГиБ, 32k — от 24 до 48 ГиБ, 256k — от 48 ГиБ (длина контекста). |
OLLAMA_NUM_PARALLEL | Число запросов, которые каждая модель обрабатывает одновременно (по умолчанию 1). Память под контекст растёт пропорционально произведению этого значения на длину контекста. |
OLLAMA_KEEP_ALIVE | Сколько времени простаивающая модель остаётся загруженной (по умолчанию 5m; -1 — не выгружать). |
OLLAMA_MAX_LOADED_MODELS | Число моделей, загруженных одновременно, если они помещаются (по умолчанию 3 на GPU). |
OLLAMA_FLASH_ATTENTION | Включается автоматически там, где поддерживается; 1 включает принудительно, 0 отключает. |
OLLAMA_KV_CACHE_TYPE | Точность KV-кэша при включённом Flash Attention: f16 (по умолчанию), q8_0 (примерно половина памяти, очень небольшие потери) или q4_0 (примерно четверть). |
CUDA_VISIBLE_DEVICES, ROCR_VISIBLE_DEVICES | Ограничивают Ollama отдельными GPU; UUID из nvidia-smi -L или rocminfo надёжнее номеров. |
Несколько GPU
Ollama загружает модель на один GPU, если она там помещается, — согласно FAQ Ollama, обычно это даёт лучшую производительность (по шине PCI передаётся меньше данных), — и распределяет её по всем GPU, только если не помещается. Остальные GPU тогда занимают другие модели, вплоть до OLLAMA_MAX_LOADED_MODELS.
Скачивание и запуск моделей
ollama pull gpt-oss:20b
ollama run gpt-oss:20b "Explain a KV cache in two sentences."
ollama ls # модели на диске
ollama ps # загруженные модели: SIZE, PROCESSOR, CONTEXT, UNTIL
ollama stop gpt-oss:20b # выгрузить модель сейчас
ollama rm gpt-oss:20b # удалить модель с диска
Без промпта ollama run открывает чат. В выводе ollama ps в столбце PROCESSOR должно быть 100% GPU; разделение вроде 48%/52% CPU/GPU означает, что часть модели работает на CPU из системной памяти (см. раздел «Устранение неполадок»). CONTEXT — заданная модели длина контекста.
Теги по умолчанию обычно 4-битные (qwen3.5:9b — это Q4_K_M). В списках тегов есть и версии q8_0 и bf16: они занимают больше памяти, но ближе к исходным весам. Если они помещаются, сравните их с тегом по умолчанию на своих промптах.
Ollama держит в памяти GPU весь тег целиком плюс KV-кэш, который растёт вместе с контекстом. Правило подбора CryptGPU добавляет 20% к размеру тега и считает доступными 92% памяти GPU:
| Тег | Размер в библиотеке | Самый дешёвый подходящий GPU NVIDIA (один GPU) |
|---|---|---|
qwen3.5:9b | 6,6–7,6 ГБ | RTX 5080 (16 ГБ) |
gpt-oss:20b | 14 ГБ | RTX 4090 (24 ГБ) |
gemma4:31b | 19–20 ГБ | RTX 5090 (32 ГБ) |
gemma4:31b-it-bf16 | 63 ГБ | RTX PRO 6000 (96 ГБ) |
gpt-oss:120b | 65 ГБ | RTX PRO 6000 (96 ГБ) |
Длинным контекстам, значению OLLAMA_NUM_PARALLEL больше 1 и нескольким загруженным моделям нужно больше. Подбор GPU под модель и страницы моделей показывают, что нужно каждой модели из каталога.
Запуск Open WebUI в Docker
Сначала установите Docker (см. Контейнеры); самому Open WebUI GPU не нужен.
В руководстве по быстрому старту Open WebUI обращается к Ollama по адресу host.docker.internal — внутреннему адресу хоста в Docker, а не по адресу 127.0.0.1, на котором слушает Ollama. Решение даёт его руководство по ошибкам подключения: сеть хоста (host networking) с OLLAMA_BASE_URL=http://127.0.0.1:11434. Тогда Docker не публикует порты, а приложение слушает прямо на хосте, поэтому привяжите его к localhost с помощью HOST и PORT, которые читает скрипт запуска образа:
# один раз: постоянный секретный ключ (файл доступен только root) сохраняет вход пользователей после обновлений
sudo install -m 600 /dev/null /etc/open-webui.env
echo "WEBUI_SECRET_KEY=$(openssl rand -hex 32)" | sudo tee /etc/open-webui.env >/dev/null
sudo docker run -d --network=host \
--env-file /etc/open-webui.env \
-e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
-e HOST=127.0.0.1 -e PORT=3000 \
-v open-webui:/app/backend/data \
--name open-webui --restart always \
ghcr.io/open-webui/open-webui:main
sudo docker logs -f open-webui # дождитесь запуска, затем Ctrl-C
ss -tln | grep -E "3000|11434" # оба порта только на 127.0.0.1
В томе open-webui хранятся учётные записи, чаты и настройки. Откройте http://localhost:3000 через SSH-туннель (см. следующий раздел) и сразу создайте свою учётную запись: первая учётная запись становится администратором, и после её создания регистрация новых пользователей отключается. Чтобы добавить людей, администратор снова включает регистрацию в Settings > Admin > Authentication; новые учётные записи ждут одобрения в статусе Pending.
Не используйте другое решение из руководства по подключению — OLLAMA_HOST=0.0.0.0: Ollama не проверяет API-ключи, поэтому её API отвечал бы любому, кто доберётся до порта 11434, а защищал бы его только файрвол. Если вы всё же запускаете Open WebUI в сети bridge, публикуйте его как -p 127.0.0.1:3000:8080: правила портов Docker обходят ufw.
Удалённый доступ к Ollama и Open WebUI
Оба сервиса остаются на 127.0.0.1. Обращайтесь к ним через SSH или поставьте TLS-прокси с аутентификацией перед Open WebUI — но никогда перед Ollama.
SSH-туннель: для вас и нескольких коллег
# на вашем компьютере; gpu1 — запись хоста из руководства по SSH
ssh -N -L 3000:127.0.0.1:3000 -L 11434:127.0.0.1:11434 gpu1
Затем откройте http://localhost:3000. Второй проброс нужен для примеров с API ниже; если Ollama работает и на вашем компьютере, используйте другой локальный порт, например -L 11435:127.0.0.1:11434. Ключи и ~/.ssh/config описаны в разделе Доступ по SSH.
Caddy с TLS: для команды
Open WebUI сам не терминирует TLS, а его руководство по усилению защиты требует, чтобы при доступе из интернета перед ним был дополнительный уровень контроля доступа, например список разрешённых диапазонов IP-адресов. Направьте DNS-имя на сервер и установите Caddy из его официального репозитория; он сам получит сертификат и пропустит WebSocket-соединения и потоковую передачу без дополнительных настроек (страница Open WebUI о Caddy).
sudo tee /etc/caddy/Caddyfile >/dev/null <<'EOF'
chat.example.com {
@team remote_ip 198.51.100.7 203.0.113.0/24
handle @team {
reverse_proxy 127.0.0.1:3000
}
handle {
respond 403
}
}
EOF
sudo systemctl reload caddy
sudo ufw allow 80,443/tcp
# разрешите публичный origin для WebSocket, затем пересоздайте контейнер (см. «Обновление»)
echo "CORS_ALLOW_ORIGIN=https://chat.example.com;http://localhost:3000" | sudo tee -a /etc/open-webui.env
Укажите адреса своей команды после remote_ip; каждый человек при этом всё равно входит под своей учётной записью Open WebUI.
Держите Open WebUI на HOST=127.0.0.1 за прокси, чтобы прокси оставался единственным путём внутрь, и никогда не проксируйте и не публикуйте порт Ollama 11434.
Используйте API Ollama, совместимый с OpenAI
Ollama предоставляет API, совместимый с OpenAI, по пути /v1: chat completions, completions, models, embeddings и responses. Через туннель, описанный выше:
curl -s http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "gpt-oss:20b", "messages": [{"role": "user", "content": "Say hello in five words."}]}'
curl -s http://localhost:11434/api/tags # собственный API: модели на диске
В клиенте OpenAI укажите в base_url адрес http://localhost:11434/v1/, а в api_key — любое значение, например ollama: поле обязательно, но игнорируется.
Для людей или сервисов без доступа по SSH используйте собственный эндпоинт Open WebUI, совместимый с OpenAI, — /api/chat/completions — за прокси Caddy. Он проверяет персональный API-ключ пользователя, созданный в Settings > Account; обычным пользователям (не администраторам) нужно, чтобы администратор сначала разрешил ключи (эндпоинты API).
Обновление и устранение неполадок
Обновление
curl -fsSL https://ollama.com/install.sh | sh # обновить Ollama; drop-in-файл сохраняется
ollama -v
# Open WebUI: сделайте резервную копию тома, затем замените контейнер
sudo docker run --rm -v open-webui:/data -v /data/backups:/backup alpine \
tar czf /backup/openwebui-$(date +%Y%m%d).tar.gz /data
sudo docker rm -f open-webui
sudo docker pull ghcr.io/open-webui/open-webui:main
# затем повторите команду docker run из раздела про Open WebUI
Руководство по обновлению Open WebUI предупреждает, что миграции базы данных необратимы, — отсюда и резервная копия. Чтобы оставаться на проверенных версиях, устанавливайте Ollama командой curl -fsSL https://ollama.com/install.sh | OLLAMA_VERSION=<version> sh и замените :main на тег выпуска, :v<x.y.z>. Если срок аренды не продлён, модели и том Open WebUI стираются вместе с сервером: храните копии в другом месте.
Устранение неполадок
| Симптом | Что проверить |
|---|---|
ollama ps показывает 100% CPU | Нет доступного GPU, или его память занята. Проверьте nvidia-smi или amd-smi list, затем journalctl -u ollama --no-pager --follow --pager-end; для подробностей добавьте Environment="OLLAMA_DEBUG=1" в drop-in-файл. На AMD вывод id ollama должен содержать render и video. |
| Разделение CPU/GPU или ошибки нехватки памяти | Модель и её контекст не помещаются. Уменьшите OLLAMA_CONTEXT_LENGTH или OLLAMA_NUM_PARALLEL, задайте OLLAMA_KV_CACHE_TYPE=q8_0, выгрузите другие модели командой ollama stop, остановите другие задачи на GPU или выберите тег поменьше. |
| Open WebUI не показывает моделей | На сервере curl -s http://127.0.0.1:11434/api/tags должен их выводить. Затем проверьте URL Ollama в Settings > Admin > Connections и sudo docker logs open-webui. |
| Запросы ждут или завершаются ошибкой 503 | Каждая модель одновременно обрабатывает OLLAMA_NUM_PARALLEL запросов (по умолчанию 1). Остальные встают в очередь; сверх OLLAMA_MAX_QUEUE (по умолчанию 512) Ollama отвечает ошибкой 503. |
Другие решения, например перезагрузка модуля nvidia_uvm, — на странице Ollama об устранении неполадок.
Из блога
Нужна помощь с этим руководством?
Расскажите нам о своём GPU, командах, которые вы выполнили, и результате, который получили, через форму обратной связи.
