Зачем это вообще кому-то нужно?
У вас в углу валяется RTX 3060 от старого игрового ПК. На работе выхватили RTX 5080 по акции. А у друга завалялась 1660 Super. По отдельности каждая из этих карт для запуска Qwen3-Coder-30B - просто кусок пластика и кремния. Вместе - это 30 токенов в секунду на 30-миллиардной модели.
Вот в чем фишка: большинство гайдов рассказывают про идеальные однородные системы. 4 одинаковые RTX 4090, 8 RTX 3090. Красиво, дорого, недоступно. Реальность выглядит иначе: у людей есть то, что есть. Разномастный зоопарк из карт разных поколений, с разным объемом памяти, разной архитектурой.
Llama.cpp с RPC - единственный инструмент, который позволяет склеить это все в работающую систему. Не идеально, не максимально эффективно, но работает. И работает достаточно быстро, чтобы не сойти с ума от ожидания.
Важный нюанс: разнородный кластер никогда не будет работать так же эффективно, как однородный. Разница в скорости памяти, пропускной способности PCIe, архитектуре ядер - все это создает дисбаланс. Но 70% эффективности лучше, чем 0%.
Что у нас в итоге получится
Конфигурация, которую мы будем настраивать:
| Карта | VRAM | PCIe | Роль в кластере |
|---|---|---|---|
| RTX 5080 | 16 GB GDDR7 | PCIe 5.0 x16 | Мастер-нода, основные слои |
| RTX 3060 | 12 GB GDDR6 | PCIe 4.0 x8 | Воркер, средние слои |
| GTX 1660 Super | 6 GB GDDR6 | PCIe 3.0 x16 | Воркер, последние слои |
Общий объем VRAM: 34 GB. Qwen3-Coder-30B в формате Q4_K_S занимает около 18-20 GB. Теоретически поместится на одну RTX 5080, но скорость будет ниже из-за нехватки памяти для кэша контекста.
Шаг 1: Подготовка железа и софта
1 Собираем физический кластер
Материнская плата - критически важный компонент. Если вы читали мою статью про бюджетную 4-GPU ферму, то знаете: нужны слоты с правильным расстоянием и достаточным количеством линий PCIe.
Наша конфигурация:
- Материнская плата: ASUS Prime X299-A (б/у, 300 евро)
- Процессор: Intel Core i9-10900X (44 линии PCIe)
- Оперативная память: 64 GB DDR4 3200 MHz
- Блок питания: 1200W Gold (обязательно с отдельными кабелями для каждой карты!)
PCIe линки: RTX 5080 получает x16, RTX 3060 - x8, 1660 Super - x8. Это не идеально, но для llama.cpp RPC достаточно. Главное - избегайте режима x1 или x4 через чипсет.
2 Ставим драйверы и зависимости
Здесь начинается первая боль. Разные поколения карт - разные требования к драйверам. RTX 5080 требует драйвер 560.xx или новее, а 1660 Super поддерживается только до 550.xx.
Решение: ставим драйвер 550.xx. RTX 5080 будет работать, просто без поддержки самых новых фич. Проверяем установку:
nvidia-smi
# Должны увидеть все три карты
# Если какая-то не отображается - проблема с питанием или слотом
Устанавливаем llama.cpp с поддержкой CUDA и RPC:
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make clean
# Важно: собираем с поддержкой CUDA и всех фич
LLAMA_CUDA=1 LLAMA_CURL=1 make -j$(nproc)
Шаг 2: Подготовка модели
3 Скачиваем и квантуем Qwen3-Coder-30B
Qwen3-Coder-30B - одна из лучших кодирующих моделей на начало 2026 года. Поддерживает контекст 128K, отлично справляется с кодом на 20+ языках.
Скачиваем оригинальную модель в формате GGUF или конвертируем сами:
# Если есть исходная модель в Hugging Face формате
python3 convert.py \
--outfile qwen3-coder-30b.f16.gguf \
--outtype f16 \
/путь/к/qwen3-coder-30b
# Квантуем в Q4_K_S - оптимальный баланс
./quantize \
qwen3-coder-30b.f16.gguf \
qwen3-coder-30b.Q4_K_S.gguf \
Q4_K_S
Шаг 3: Настройка RPC кластера
4 Конфигурация сервера и воркеров
Вот где начинается магия. Один сервер (мастер) распределяет слои модели между несколькими воркерами. В нашем случае все карты в одном компьютере, но RPC работает через localhost.
Запускаем воркеров на разных картах. Открываем три терминала:
# Терминал 1: воркер на RTX 3060 (карта 1)
CUDA_VISIBLE_DEVICES=1 ./llama-server-worker \
--host 127.0.0.1 \
--port 8081 \
--gpu-layers 10 \
--ctx-size 4096
# Терминал 2: воркер на 1660 Super (карта 2)
CUDA_VISIBLE_DEVICES=2 ./llama-server-worker \
--host 127.0.0.1 \
--port 8082 \
--gpu-layers 8 \
--ctx-size 2048 # 1660 Super мало памяти, уменьшаем контекст
# Терминал 3: мастер на RTX 5080
CUDA_VISIBLE_DEVICES=0 ./llama-server \
--model qwen3-coder-30b.Q4_K_S.gguf \
--host 127.0.0.1 \
--port 8080 \
--gpu-layers 20 \
--ctx-size 8192 \
--parallel 3 \
--workers \
127.0.0.1:8081:10 \
127.0.0.1:8082:8
Что здесь происходит:
- Мастер (RTX 5080) берет первые 20 слоев
- Воркер 1 (RTX 3060) получает следующие 10 слоев
- Воркер 2 (1660 Super) получает последние 8 слоев
- Всего 38 слоев на GPU, остальные (если есть) на CPU
Критически важно: количество слоев на каждом воркере должно быть пропорционально его производительности и памяти. RTX 5080 получает больше всего, 1660 Super - меньше всего. Если дать 1660 Super слишком много слоев - он станет бутылочным горлом.
5 Оптимизация распределения слоев
Самый сложный момент - найти оптимальное распределение. Делаем тестовый прогон:
# Тестовый запрос для оценки производительности
curl http://127.0.0.1:8080/completion \
-H "Content-Type: application/json" \
-d '{
"prompt": "def fibonacci(n):",
"n_predict": 100,
"temperature": 0.1
}'
Смотрим логи каждого воркера. Если один воркер постоянно простаивает в ожидании другого - перераспределяем слои. В моем случае оптимальной оказалась конфигурация:
| Карта | Слоев | Загрузка | Память |
|---|---|---|---|
| RTX 5080 | 18 | 85-90% | 14.2/16 GB |
| RTX 3060 | 12 | 80-85% | 9.8/12 GB |
| 1660 Super | 8 | 95-100% | 5.7/6 GB |
Шаг 4: Тестирование и оптимизация
6 Замер производительности
После настройки запускаем бенчмарк:
./llama-bench \
-m qwen3-coder-30b.Q4_K_S.gguf \
-ngl 38 \
-c 4096 \
-b 512 \
-n 100 \
-t 8 \
--server \
--server-host 127.0.0.1 \
--server-port 8080
Результаты на нашей конфигурации:
- Скорость генерации: 28-32 токенов/с (в зависимости от контекста)
- Время первого токена: 450-600 мс
- Пиковое потребление памяти: 29 GB VRAM
- Температура карт: 68°C (5080), 72°C (3060), 80°C (1660 Super)
7 Оптимизация скорости
Несколько финальных настроек для выжимания максимума:
# Запускаем сервер с оптимизациями
CUDA_VISIBLE_DEVICES=0 ./llama-server \
--model qwen3-coder-30b.Q4_K_S.gguf \
--host 0.0.0.0 \
--port 8080 \
--gpu-layers 18 \
--ctx-size 8192 \
--parallel 3 \
--batch-size 512 \
--ubatch-size 256 \
--flash-attn \
--no-mmap \
--workers \
127.0.0.1:8081:12 \
127.0.0.1:8082:8 \
--cont-batching \
--n-gqa 8 # Для Qwen архитектуры
Ключевые флаги:
--flash-attn: ускоряет внимание на 20-30%--cont-batching: непрерывный батчинг, лучше использует ресурсы--no-mmap: загружает модель целиком в память, быстрее но требует больше RAM--n-gqa 8: специфично для Qwen, улучшает качество генерации
Где все ломается: частые проблемы
После настройки десятков таких систем я выделил топ-5 проблем:
1. Несовместимость драйверов. Решение: используйте самый старый драйвер, который поддерживает все карты. Для смеси 5000-й и 1600-й серии это обычно 550.xx.
2. Нехватка мощности БП. Три карты под нагрузкой могут потреблять 600+ ватт. Добавьте процессор, память, диски - получаем 850+ ватт. Берите БП с запасом 30%.
3. Перегрев нижней карты. В плотной сборке нижняя карта (обычно 1660 Super) задыхается. Решение: слоты через один, если возможно. Или добавьте боксовые вентиляторы.
4. RPC таймауты. Если воркер медленнее остальных, мастер может отвалиться по таймауту. Увеличивайте --timeout в конфигурации сервера.
5. Неравномерная загрузка. Одна карта загружена на 100%, другие на 50%. Перераспределяйте слои вручную, автоматическая балансировка в llama.cpp RPC неидеальна.
А что если добавить еще карт?
Теоретически можно добавить четвертую, пятую карту. Практически - упираетесь в лимиты:
- Линии PCIe. На X299 максимум 4 карты в x8/x8/x8/x8. Пятая будет через чипсет в x4.
- Питание. 5 карт + процессор = 1000+ ватт. Нужен БП 1600W.
- Охлаждение. 5 карт в одном корпусе - это печка.
- Драйверы. Добавьте в микс карту AMD для полного веселья.
Если серьезно хотите масштабироваться дальше, посмотрите мою статью про стратегии масштабирования. Там разобраны варианты с несколькими физическими серверами.
Стоило ли оно того?
Давайте посчитаем:
- RTX 5080: 900 евро (новая)
- RTX 3060: 250 евро (б/у)
- 1660 Super: 150 евро (б/у)
- Остальное железо: 700 евро
- Итого: 2000 евро
За эти деньги можно купить одну RTX 5090 с 24 GB. Она запустит Qwen3-Coder-30B в Q4_K_S со скоростью 40-45 токенов/с. Быстрее, проще, надежнее.
Но. У вас уже есть две старые карты. И вы хотите научиться работать с распределенными системами. И возможно, потом добавить еще карты или перейти на многосерверную конфигурацию.
Тогда да - стоит. Это не про максимальную эффективность за евро. Это про получение опыта, про использование того, что есть, про понимание как работают распределенные системы на низком уровне.
И когда через полгода вы будете настраивать кластер из 8 карт для 120B модели, вы вспомните эту сборку из трех разнородных карт и улыбнетесь. Потому что теперь вы знаете, как это работает изнутри. А это дороже любых токенов в секунду.