Проблема: 12 ГБ VRAM и три голодных приложения
RTX 4070 Super - отличная карта. Быстрая, эффективная, относительно доступная. Пока не попробуешь запустить на ней три AI-сервиса одновременно. Тогда начинается цирк: Whisper падает при загрузке модели, Ollama вылетает с ошибкой CUDA out of memory, а Open WebUI вообще отказывается стартовать.
Типичная ошибка новичка: установить всё в одну систему и надеяться на лучшее. Результат предсказуем - постоянные падения, перезагрузки сервисов и нервные срывы.
Не делайте так: docker run --gpus all ollama/ollama && docker run --gpus all whisper-api && docker run --gpus all open-webui. Все три контейнера будут драться за одну видеопамять и упадут через 10 минут.
Решение: Разделяй и властвуй
Ключ к стабильности - жёсткое ограничение ресурсов для каждого сервиса. Не надейтесь на «умное» распределение - его нет. Каждое приложение считает, что видеокарта принадлежит только ему.
Мы пойдём двумя путями одновременно:
- Виртуализация через Proxmox с PCIe passthrough
- Контейнеризация с явным указанием лимитов VRAM
Первый способ даёт максимальную изоляцию, второй - проще в настройке. Выбирайте по ситуации.
1Подготовка: Чистая система и правильные драйверы
Начинаем с Ubuntu Server 22.04 LTS. Не Desktop, не 24.04 - именно 22.04 LTS. Проверено на крови.
# Обновляем всё до последних версий
sudo apt update && sudo apt upgrade -y
# Устанавливаем драйверы NVIDIA
sudo apt install nvidia-driver-545 -y
# Проверяем, что карта видна
nvidia-smi2Мониторинг VRAM: Видеть всё
Прежде чем что-то ограничивать, нужно понимать, что происходит. nvidia-smi хорош, но показывает только общую картину.
Устанавливаем nvitop - терминальный монитор ресурсов NVIDIA:
pip install nvitop
# Запускаем в режиме мониторинга
nvitop -mТеперь видим не просто общую загрузку VRAM, а какие процессы сколько едят. Критически важно для диагностики.
Способ 1: Жёсткая изоляция через Proxmox
Если у вас отдельный сервер или мощная рабочая станция, Proxmox даст максимальную стабильность. Разделяем RTX 4070 на три виртуальные машины.
Сначала устанавливаем Proxmox VE 8.1. Подробный гайд есть в нашей статье про вырывание телеметрии NVIDIA.
| Виртуальная машина | Назначение VRAM | ОС |
|---|---|---|
| VM1 - Транскрипция | 4 ГБ | Ubuntu Server 22.04 |
| VM2 - LLM (Ollama) | 6 ГБ | Ubuntu Server 22.04 |
| VM3 - Open WebUI | 2 ГБ (только для интерфейса) | Ubuntu Server 22.04 |
Важный момент: PCIe passthrough всей карты не подойдёт. Нужно использовать vGPU (виртуальный GPU) или MIG (Multi-Instance GPU). Но у RTX 4070 нет MIG. Выход - использовать разные драйверы в разных VM.
Внимание: vGPU на потребительских картах NVIDIA требует специальной лицензии. Без неё можно использовать только один инстанс. Альтернатива - контейнеризация.
Способ 2: Контейнеры с жёсткими лимитами (рекомендуется)
Проще, быстрее, почти так же стабильно. Используем Docker с явным указанием лимитов VRAM через переменные окружения.
3Шаг 1: Настраиваем Ollama с лимитом 6 ГБ
Ollama жадный. Без ограничений он займёт всю доступную память. Особенно если используете большие модели вроде тех, что описаны в обзоре моделей для RTX 5080.
# Создаём docker-compose.yml для Ollama
cat > docker-compose-ollama.yml << EOF
version: '3.8'
services:
ollama:
image: ollama/ollama:latest
container_name: ollama_server
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
environment:
- OLLAMA_NUM_PARALLEL=1
- OLLAMA_MAX_LOADED_MODELS=2
- CUDA_VISIBLE_DEVICES=0
volumes:
- ./ollama_data:/root/.ollama
ports:
- "11434:11434"
restart: unless-stopped
EOFНо этого недостаточно. Нужно явно указать лимит памяти для модели. Создаём файл Modelfile:
# Для модели ~7B параметров с квантованием Q4_K_M
cat > Modelfile << EOF
FROM llama3.2:latest
PARAMETER num_gpu 40 # 40% от доступной VRAM
PARAMETER num_ctx 4096
EOF
# Запускаем с этим Modelfile
ollama create my-llama -f Modelfile4Шаг 2: Whisper API с фиксированным лимитом
Whisper-large-v3 требует около 3 ГБ VRAM. Но он тоже пытается занять всё. Фиксируем лимит через переменные PyTorch.
# Docker Compose для Whisper
cat > docker-compose-whisper.yml << EOF
version: '3.8'
services:
whisper:
image: onerahmet/openai-whisper-asr-webservice:latest-gpu
container_name: whisper_server
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
environment:
- ASR_MODEL=large-v3
- ASR_ENGINE=openai_whisper
- DEVICE=cuda
- CUDA_VISIBLE_DEVICES=0
- PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128
- MAX_LOADED_MODELS=1
volumes:
- ./whisper_cache:/root/.cache/whisper
ports:
- "9000:9000"
restart: unless-stopped
EOFPYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128 - магическая строка. Она заставляет PyTorch выделять память меньшими блоками, что предотвращает фрагментацию.
5Шаг 3: Open WebUI без GPU (почти)
Open WebUI сам по себе не жрёт много VRAM. Проблема в том, что он запускает Ollama, который уже работает. Решение - заставить WebUI использовать наш уже запущенный Ollama сервер.
cat > docker-compose-webui.yml << EOF
version: '3.8'
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open_webui
ports:
- "3000:8080"
volumes:
- ./webui_data:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://host.docker.internal:11434
- WEBUI_NAME="RTX 4070 AI Server"
- ENABLE_SIGNUP=false
extra_hosts:
- "host.docker.internal:host-gateway"
restart: unless-stopped
EOFКлючевая настройка: OLLAMA_BASE_URL указывает на основной Ollama сервер. WebUI становится тонким клиентом.
Запуск и проверка
Запускаем сервисы в правильном порядке:
# 1. Ollama с лимитами
docker-compose -f docker-compose-ollama.yml up -d
sleep 30 # Ждём загрузки модели
# 2. Whisper
docker-compose -f docker-compose-whisper.yml up -d
sleep 10
# 3. Open WebUI
docker-compose -f docker-compose-webui.yml up -d
# Проверяем, что всё работает
curl http://localhost:11434/api/tags # Ollama
curl http://localhost:9000/healthz # Whisper
curl http://localhost:3000/api/v1/health # WebUIАвтоматическое восстановление при падении
Даже с лимитами что-то может упасть. Настраиваем systemd для каждого сервиса:
# Создаём сервис для Ollama
sudo nano /etc/systemd/system/ollama.service
[Unit]
Description=Ollama LLM Service
After=docker.service
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/ai_server/ollama
ExecStart=/usr/local/bin/docker-compose -f docker-compose-ollama.yml up -d
ExecStop=/usr/local/bin/docker-compose -f docker-compose-ollama.yml down
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.targetТо же самое для Whisper и WebUI. Теперь systemd будет перезапускать упавшие сервисы автоматически.
RAG поверх всего этого
Вы думали, что на этом можно остановиться? Как бы не так. Нужен ещё RAG (Retrieval-Augmented Generation) для работы с документами.
Но добавлять отдельный векторную базу и эмбеддинг-модель - это уже перебор для 12 ГБ. Решение - использовать ту же LLM для эмбеддингов.
Настраиваем приватный RAG через приватный API Ollama:
# minimal_rag.py
import requests
import json
from sentence_transformers import SentenceTransformer
import numpy as np
# Используем маленькую модель для эмбеддингов
# Всего 100 МБ VRAM
embedding_model = SentenceTransformer('all-MiniLM-L6-v2')
def get_ollama_embedding(text):
"""Получаем эмбеддинг от Ollama"""
response = requests.post(
'http://localhost:11434/api/embeddings',
json={
'model': 'llama3.2:latest',
'prompt': text
}
)
return response.json()['embedding']
def rag_query(question, context):
"""RAG запрос к Ollama"""
prompt = f"""Context: {context}
Question: {question}
Answer based only on the context above:"""
response = requests.post(
'http://localhost:11434/api/generate',
json={
'model': 'llama3.2:latest',
'prompt': prompt,
'stream': False,
'options': {
'num_predict': 256,
'temperature': 0.1
}
}
)
return response.json()['response']Этот подход экономит VRAM - используем уже загруженную модель для всего.
Типичные ошибки и как их избежать
| Ошибка | Причина | Решение |
|---|---|---|
| CUDA out of memory | Все сервисы пытаются занять всю память | Жёсткие лимиты через переменные окружения |
| Whisper падает при длинных файлах | Нехватка памяти для контекста | batch_size=1, chunk_length=30 в настройках Whisper |
| Ollama медленно отвечает | Контекст переключается между сервисами | Закрепить ядра CPU за контейнером (cpuset) |
| WebUI не видит Ollama | Сетевые проблемы в Docker | Использовать host.docker.internal или сеть Docker |
Оптимизация под налоговый бизнес (реальный кейс)
Изначальная задача: обрабатывать аудиозаписи встреч с клиентами (Whisper), искать в них упоминания налоговых льгот (RAG), генерировать ответы клиентам (LLM). Всё на одной карте.
Специфичные настройки:
# Для Whisper - приоритет точности над скоростью
ENV WHISPER_MODEL=large-v3
ENV WHISPER_BATCH_SIZE=1
ENV WHISPER_COMPUTE_TYPE=float16
# Для Ollama - специализированная модель
# Используем налоговую fine-tuned версию
FROM tax-llama:latest
PARAMETER temperature 0.1 # Меньше креатива, больше точности
PARAMETER top_k 40
PARAMETER top_p 0.9Распределение времени обработки: ночью - пакетная транскрипция накопленных записей, днём - интерактивная работа с LLM через WebUI.
Что делать, когда 12 ГБ всё-таки мало
Бывает. Клиентов стало больше, документы длиннее, требования выше. Варианты:
- Квантование моделей: Q3_K вместо Q4_K. Вы потеряете 5% качества, но сэкономите 25% памяти. Подробнее в статье про квантование MiniMax M2.1.
- Оффлоад на CPU: Часть слоёв модели на GPU, часть на CPU. Медленнее, но работает. OLLAMA_GPU_LAYERS=20 вместо 40.
- Ротация моделей: Не держать все модели в памяти одновременно. Выгружать неиспользуемые.
Самый радикальный, но эффективный вариант - докупить вторую карту. Но не RTX 4070, а что-то вроде RTX 4060 Ti 16GB для эмбеддингов и Whisper. Тогда основная 4070 останется для LLM.
Итог: Стабильность требует жертв
Мультизадачный AI-сервер на одной видеокарте - это не магия, а инженерная задача. Ключевые моменты:
- Никогда не доверяйте автоматическому распределению памяти
- Каждому сервису - явные лимиты через переменные окружения
- Мониторинг через nvitop, а не nvidia-smi
- Автоматический перезапуск через systemd
- Используйте уже загруженные модели для нескольких задач (LLM для генерации и эмбеддингов)
12 ГБ VRAM хватает на три сервиса, если правильно их упаковать. Главное - понимать, что каждый мегабайт на счету. И да, иногда проще купить вторую карту, чем месяц бороться с оптимизациями.
Если всё сделано правильно, сервер будет работать неделями без перезагрузок. Проверено на реальном налоговом бизнесе с 50+ клиентами в день.