2025 год на дворе, а доступ к мощным GPU для экспериментов с ИИ по-прежнему стоит дорого. Но что, если я скажу вам, что за 30-40% от стоимости одной новой RTX 4090 можно собрать целую ферму, способную запускать модели уровня Qwen2.5-32B? Этот гайд — результат моего эксперимента по сборке рабочей системы из шести б/у видеокарт. Я расскажу не только как это сделать, но и почему каждый шаг важен, какие подводные камни ждут и как их обойти.
Проблема: дорогой хлеб для ИИ-масла
Локальные языковые модели требуют огромных объемов видеопамяти (VRAM). Модель на 70 миллиардов параметров может "съесть" 40+ ГБ. Покупать новые карты — разорительно. Б/у карты с майнинговых ферм (часто RTX 3060 12GB, RTX 3080 10GB) продаются за копейки, но имеют две проблемы: износ и сложность управления несколькими GPU в одной системе. Главный вызов — заставить их работать вместе, а не как набор отдельных ускорителей.
Решение: распределение нагрузки и правильный софт
Мы не будем пытаться заставить одну модель работать на всех картах сразу (это сложно и поддерживается не всеми фреймворками). Вместо этого используем стратегию распределения запросов (inference routing). Несколько инстансов Ollama (или другого сервера) будут запущены на разных GPU, а балансировщик нагрузки (например, Nginx) будет распределять промпты между ними. Это дает отказоустойчивость и позволяет загружать разные модели на разные карты.
1 Выбор и подготовка железа
Моя конфигурация (бюджет ~1500$):
- Видеокарты (6 шт.): 3x RTX 3060 12GB + 3x RTX 3080 10GB. Все — б/у с майнинговых ферм. Ключевой параметр — объем VRAM.
- Материнская плата: ASUS Prime Z790-P (имеет 4 слота PCIe x16, но мы используем райзеры и сплиттеры).
- Блок питания: Be Quiet! Dark Power 13 1600W. Важно: мощность с запасом 30% и достаточное количество кабелей PCIe.
- Процессор и ОЗУ: Intel Core i5-13600K, 64 GB DDR5. CPU не критичен, но многоядерность поможет в препроцессинге.
- Охлаждение: Открытый стенд или серверная стойка с мощными вентиляторами 120-140 мм. Температура — враг №1.
Перед покупкой б/у карт обязательно протестируйте их под нагрузкой (FurMark, 20 минут). Обращайте внимание на температуру памяти (junction temperature) — она должна быть стабильной и не превышать 95-100°C. Карты с перегревом памяти долго не проживут.
2 Установка ОС и драйверов: Linux или WSL2?
Для максимальной производительности и контроля — чистый Linux (Ubuntu 24.04 LTS). Но если вы привязаны к Windows для других задач, используйте WSL2 с полной интеграцией GPU.
Команды для Ubuntu 24.04:
# Обновляем систему
sudo apt update && sudo apt upgrade -y
# Устанавливаем драйверы NVIDIA (версия 560+)
sudo apt install nvidia-driver-560 nvidia-utils-560
# Устанавливаем CUDA Toolkit (12.5)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt update
sudo apt install cuda-toolkit-12-5
# Перезагружаемся
sudo reboot
После перезагрузки проверяем, что все карты видны:
nvidia-smi
Вы должны увидеть список из 6 GPU с их температурой и загрузкой памяти. Если какой-то карты нет — проверьте физическое подключение и питание.
3 Установка и настройка Ollama с привязкой к GPU
Ollama — наш главный инструмент для запуска LLM. Устанавливаем его и настраиваем переменные окружения для управления GPU.
# Установка Ollama (Linux)
curl -fsSL https://ollama.com/install.sh | sh
# Запускаем сервис
sudo systemctl enable ollama
sudo systemctl start ollama
По умолчанию Ollama использует все доступные GPU. Нам нужно запустить несколько инстансов, каждый на своем GPU. Создаем systemd-сервисы для каждого.
# Создаем конфигурационный файл для первого инстанса (GPU 0)
sudo tee /etc/systemd/system/ollama-gpu0.service << EOF
[Service]
ExecStart=/usr/bin/ollama serve
Environment="OLLAMA_HOST=0.0.0.0:11435"
Environment="CUDA_VISIBLE_DEVICES=0"
User=ollama
Group=ollama
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# Аналогично создаем ollama-gpu1.service (CUDA_VISIBLE_DEVICES=1) и т.д. до 5.
Запускаем и проверяем инстансы:
sudo systemctl daemon-reload
sudo systemctl start ollama-gpu0
sudo systemctl start ollama-gpu1
# ... и так для всех шести
# Проверяем статус
sudo systemctl status ollama-gpu0
4 Загрузка моделей и распределение по GPU
Теперь загружаем модели, учитывая объем VRAM на каждой карте. На RTX 3060 (12 ГБ) можно запустить более тяжелые модели, чем на RTX 3080 (10 ГБ).
# Для инстанса на GPU0 (RTX 3060 12GB) загружаем Qwen2.5-14B
OLLAMA_HOST=http://localhost:11435 ollama pull qwen2.5:14b
# Для инстанса на GPU1 (RTX 3080 10GB) загружаем Qwen2.5-7B
OLLAMA_HOST=http://localhost:11436 ollama pull qwen2.5:7b
Важно: каждый инстанс слушает на своем порту (11435, 11436, ... 11440).
5 Настройка балансировщика нагрузки (Nginx)
Nginx будет распределять входящие запросы между нашими шестью инстансами Ollama. Устанавливаем и настраиваем его.
sudo apt install nginx -y
Создаем конфигурацию для балансировки:
sudo nano /etc/nginx/sites-available/ollama-cluster
Вставляем следующую конфигурацию:
upstream ollama_backend {
server 127.0.0.1:11435; # GPU0
server 127.0.0.1:11436; # GPU1
server 127.0.0.1:11437; # GPU2
server 127.0.0.1:11438; # GPU3
server 127.0.0.1:11439; # GPU4
server 127.0.0.1:11440; # GPU5
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://ollama_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
# Длинные таймауты для генерации текста
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
}
Активируем конфиг и перезапускаем Nginx:
sudo ln -s /etc/nginx/sites-available/ollama-cluster /etc/nginx/sites-enabled/
sudo nginx -t # Проверяем синтаксис
sudo systemctl restart nginx
6 Тестирование и мониторинг
Теперь наша ферма готова. Проверим ее работу, отправив запрос через балансировщик:
curl http://localhost:8080/api/generate -d '{
"model": "qwen2.5:7b",
"prompt": "Объясни, как работает квантовая запутанность",
"stream": false
}'
Для мониторинга используем комбинацию nvidia-smi, htop и можно настроить Grafana с Prometheus для сбора метрик.
Нюансы и возможные ошибки
В процессе настройки вы почти наверняка столкнетесь с этими проблемами:
| Проблема | Причина | Решение |
|---|---|---|
| Карта не определяется в системе | Недостаточное питание, плохой контакт в райзере, сбой драйвера | Проверить кабели питания, переустановить карту, перезагрузиться с параметром ядра nvidia-drm.modeset=1 |
| Ollama падает с ошибкой CUDA out of memory | Модель не помещается в VRAM конкретной карты | Использовать меньшую модель или квантованную версию (например, qwen2.5:7b-q4_K_M) |
| Низкая скорость генерации текста | Узкое место в CPU или ОЗУ при препроцессинге, перегрев GPU | Мониторить температуру, убедиться, что CPU не загружен на 100% другими задачами |
| Неравномерная загрузка карт | Балансировщик Nginx использует round-robin, но модели разного размера | Настроить веса (weight) в upstream Nginx в зависимости от мощности карты |
Что в итоге?
Мы получили рабочую ферму с общим объемом VRAM около 66 ГБ (12+12+12+10+10+10), способную параллельно обрабатывать несколько запросов к разным моделям или балансировать нагрузку на одну модель. Это решение в разы дешевле покупки нового серверного GPU и дает гибкость. Такая ферма — отличный полигон для экспериментов, разработки RAG-систем или даже небольшого приватного SaaS.
Главное — следить за температурой, правильно распределять модели по картам и иметь хорошую систему вентиляции. Удачи в сборке!
FAQ: Частые вопросы
Можно ли использовать карты AMD?
Теоретически да, но экосистема для LLM (CUDA, cuBLAS) заточена под NVIDIA. Для AMD потребуется ROCm и проверка совместимости с Ollama или другим ПО. Это сложнее и менее стабильно.
Сколько электричества будет потреблять такая ферма?
Под нагрузкой все 6 карт могут потреблять от 1200 до 1500 Вт. Добавьте 200-300 Вт на остальную систему. Итого ~1.8 кВт в час. При круглосуточной работе счета за электричество будут существенными.
Можно ли заставить одну модель работать на всех картах одновременно?
Да, но это требует использования фреймворков с поддержкой моделирования (model parallelism), таких как TensorFlow или PyTorch с DeepSpeed. Ollama в стандартной конфигурации так не умеет. Это тема для отдельного сложного гайда.