Настройка мультизадачного AI-сервера на RTX 4070: Whisper, RAG, WebUI | AiManual
AiManual Logo Ai / Manual.
04 Янв 2026 Гайд

RTX 4070 Super: Как заставить транскрипцию, RAG и веб-интерфейс работать одновременно без падений

Пошаговое руководство по запуску Whisper транскрипции, RAG и Open WebUI на одной RTX 4070 Super без сбоев. Распределение VRAM, изоляция процессов, мониторинг.

Проблема: 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 минут.

Решение: Разделяй и властвуй

Ключ к стабильности - жёсткое ограничение ресурсов для каждого сервиса. Не надейтесь на «умное» распределение - его нет. Каждое приложение считает, что видеокарта принадлежит только ему.

Мы пойдём двумя путями одновременно:

  1. Виртуализация через Proxmox с PCIe passthrough
  2. Контейнеризация с явным указанием лимитов 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-smi
💡
Если nvidia-smi показывает ошибку, проверьте Secure Boot в BIOS. Он должен быть отключён. NVIDIA драйверы и Secure Boot - враги на всю жизнь.

2Мониторинг 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 WebUI2 ГБ (только для интерфейса)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 Modelfile
💡
Параметр num_gpu в процентах - грубое, но рабочее решение. Более точный контроль через OLLAMA_GPU_LAYERS, но он зависит от модели. Для llama3.2: 7B Q4_K_M ставьте OLLAMA_GPU_LAYERS=30.

4Шаг 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
EOF

PYTORCH_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.

💡
Налоговые документы часто содержат таблицы. Если ваша LLM плохо с ними справляется, попробуйте подход из статьи про медицинские записи в JSON - предварительное структурирование через шаблоны.

Что делать, когда 12 ГБ всё-таки мало

Бывает. Клиентов стало больше, документы длиннее, требования выше. Варианты:

  1. Квантование моделей: Q3_K вместо Q4_K. Вы потеряете 5% качества, но сэкономите 25% памяти. Подробнее в статье про квантование MiniMax M2.1.
  2. Оффлоад на CPU: Часть слоёв модели на GPU, часть на CPU. Медленнее, но работает. OLLAMA_GPU_LAYERS=20 вместо 40.
  3. Ротация моделей: Не держать все модели в памяти одновременно. Выгружать неиспользуемые.

Самый радикальный, но эффективный вариант - докупить вторую карту. Но не RTX 4070, а что-то вроде RTX 4060 Ti 16GB для эмбеддингов и Whisper. Тогда основная 4070 останется для LLM.

Итог: Стабильность требует жертв

Мультизадачный AI-сервер на одной видеокарте - это не магия, а инженерная задача. Ключевые моменты:

  • Никогда не доверяйте автоматическому распределению памяти
  • Каждому сервису - явные лимиты через переменные окружения
  • Мониторинг через nvitop, а не nvidia-smi
  • Автоматический перезапуск через systemd
  • Используйте уже загруженные модели для нескольких задач (LLM для генерации и эмбеддингов)

12 ГБ VRAM хватает на три сервиса, если правильно их упаковать. Главное - понимать, что каждый мегабайт на счету. И да, иногда проще купить вторую карту, чем месяц бороться с оптимизациями.

Если всё сделано правильно, сервер будет работать неделями без перезагрузок. Проверено на реальном налоговом бизнесе с 50+ клиентами в день.