Кластер из разных видеокарт для LLM: запуск Qwen3-Coder-30B на RTX 5080, 3060, 1660 Super | AiManual
AiManual Logo Ai / Manual.
17 Фев 2026 Гайд

Как собрать кластер из разных видеокарт для запуска больших LLM: практический гайд на примере Qwen3-Coder-30B

Пошаговый гайд по сборке кластера из разнородных видеокарт для запуска 30B-моделей. Настройка llama.cpp RPC, квантование Q4_K_S, конфигурация для RTX 5080, 3060

Зачем это вообще кому-то нужно?

У вас в углу валяется 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
💡
Q4_K_S против Q4_K_M: для инференса разница в качестве почти незаметна, но Q4_K_S экономит 10-15% памяти. В нашем случае каждый гигабайт на счету.

Шаг 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)
💡
1660 Super греется сильнее всех - это нормально. Старые карты менее эффективны. Если температура превышает 85°C, добавьте дополнительное охлаждение или уменьшите количество слоев на этой карте.

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 неидеальна.

А что если добавить еще карт?

Теоретически можно добавить четвертую, пятую карту. Практически - упираетесь в лимиты:

  1. Линии PCIe. На X299 максимум 4 карты в x8/x8/x8/x8. Пятая будет через чипсет в x4.
  2. Питание. 5 карт + процессор = 1000+ ватт. Нужен БП 1600W.
  3. Охлаждение. 5 карт в одном корпусе - это печка.
  4. Драйверы. Добавьте в микс карту 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 модели, вы вспомните эту сборку из трех разнородных карт и улыбнетесь. Потому что теперь вы знаете, как это работает изнутри. А это дороже любых токенов в секунду.

💡
Самый ценный навык 2026 года - умение заставить работать то, что по идее работать не должно. Разнородные кластеры, устаревшее железо, самописные решения. Пока все бегут за новыми RTX 6090, умные ребята запускают 70B модели на трех 4090, купленных по цене одной.