Медленная LLM на двух GPU: причины и решения для распределения слоев в 2026 | AiManual
AiManual Logo Ai / Manual.
08 Фев 2026 Гайд

Две карты, одна скорость: почему ваша LLM на двух GPU работает как на одной и как это исправить

Разбираем проблему неравномерной загрузки GPU в LM Studio и vLLM. Пошаговый гайд по диагностике, настройке tensor parallelism и оптимизации скорости генерации t

Когда больше — не значит быстрее

Вы купили вторую RTX 3090. Подключили. Запустили Llama 3.2 70B в LM Studio. С нетерпением смотрите на монитор нагрузки GPU. И видите классическую картину: первая карта — 95%, вторая — 15%. Скорость генерации — 8 tokens/s. Та же, что и на одной карте. Деньги на ветер, электричество греет комнату, а вы чешете затылок.

Знакомо? Я тоже через это прошел. И не один раз. В сообществе Reddit r/LocalLLaMA эту проблему обсуждают каждую неделю. Люди пишут: "Почему с двумя GPU скорость та же?" Ответ всегда один: неправильное распределение слоев. Но что это значит на практике? И главное — как это исправить?

Важно: на момент 08.02.2026 большинство пользовательских инструментов (LM Studio, Ollama, Text Generation WebUI) по умолчанию используют pipeline parallelism — самый простой, но часто самый неэффективный способ распределения нагрузки между GPU.

Почему вторая карта спит: три типа параллелизма

Прежде чем лезть в настройки, нужно понять фундаментальную вещь. Есть три способа разделить модель между картами. И только один из них работает быстро в большинстве случаев.

Тип Как работает Проблема Где используется
Pipeline Parallelism Разные слои модели на разные GPU Одна карта ждет, пока другая закончит вычисления (пузыри) LM Studio по умолчанию, Ollama
Tensor Parallelism Разные части матриц на разные GPU Много коммуникаций между картами vLLM с --tensor-parallel-size, llama.cpp
Data Parallelism Одна модель на всех GPU, разные данные Нужно много VRAM для копий модели Обучение, батчинговый инференс

Вот в чем загвоздка. Pipeline parallelism — это как конвейер на заводе. Если один рабочий (GPU) медленнее других, весь конвейер тормозит. В LLM слои могут быть разной вычислительной сложности. И если вы случайно положили все тяжелые слои на первую карту, а легкие — на вторую, первая будет задыхаться, а вторая — зевать.

💡
Совет из моего опыта: если у вас две одинаковые карты (например, две RTX 3090), tensor parallelism почти всегда даст лучшую производительность, чем pipeline parallelism. Особенно для моделей размером 70B и меньше.

Диагностика: с чего начать

Прежде чем что-то менять, нужно понять, что происходит прямо сейчас. Откройте терминал и запустите:

# Мониторим нагрузку GPU в реальном времени
nvidia-smi -l 1

# Смотрим использование памяти
watch -n 1 nvidia-smi

Теперь запустите вашу модель в LM Studio или другом инструменте. Смотрите на два ключевых показателя:

  • GPU Utilization — загрузка ядер. Если на одной карте 95%, а на второй 15-20%, у вас классическая проблема pipeline parallelism.
  • Memory Used — использование VRAM. Если на второй карте памяти почти нет (или мало), значит, на нее попало слишком мало слоев.
  • Power Draw — потребление энергии. Карта под нагрузкой будет потреблять почти максимальную мощность (для RTX 3090 — около 350W). Если вторая карта показывает 80W — она почти не работает.

Запишите скорость генерации (tokens/s). Это ваш baseline. Потом сравните с тем, что получится после оптимизации.

Шаг 1: Исправляем LM Studio

LM Studio (версия 0.3.5 на 08.02.2026) по умолчанию использует pipeline parallelism через llama.cpp. Проблема в том, что он не всегда правильно балансирует слои. Особенно если у вас карты разного объема VRAM.

1 Принудительно задаем распределение слоев

В LM Studio есть скрытая настройка. В Advanced Settings найдите "GPU Layers". По умолчанию там стоит "auto". Это и есть проблема. Система пытается угадать, сколько слоев положить на каждую карту. И обычно угадывает плохо.

Вместо "auto" нужно указать конкретные значения через запятую. Например, для Llama 3.2 70B с 80 слоями и двумя RTX 3090 (по 24GB каждая):

# Неправильно (по умолчанию):
GPU Layers: auto

# Правильно (вручную балансируем):
GPU Layers: 48,32

Почему 48 и 32, а не 40 и 40? Потому что первые слои обычно легче, а последние — тяжелее. Нужно дать первой карте немного больше слоев, чтобы компенсировать разницу в сложности. Это эмпирическое правило, которое работает в 80% случаев.

Предупреждение: если указать слишком много слоев на первую карту, она может не поместиться в VRAM. LM Studio тогда просто упадет без внятного сообщения об ошибке. Начинайте с равного распределения (40,40), затем корректируйте.

2 Используем контекстное меню

В LM Studio 0.3.5 появилась полезная фича: щелкните правой кнопкой на модели в списке → "Open Model Directory". Там будет файл config.json. Добавьте в него:

{
  "llama_cpp": {
    "n_gpu_layers": [48, 32],
    "main_gpu": 0,
    "tensor_split": null
  }
}

Перезапустите LM Studio. Теперь смотрите на нагрузку GPU. Должно быть примерно 70-80% на обеих картах. Если все еще видите дисбаланс, поиграйте с числами. Увеличьте слои на той карте, которая меньше загружена.

Шаг 2: Переходим на vLLM для максимальной скорости

Если в LM Studio вы выжали максимум, но хотите еще больше скорости — переходите на vLLM. Это промышленный фреймворк, который изначально проектировался для эффективного распределения вычислений. Начиная с версии 0.5.2 (актуальной на 08.02.2026), он поддерживает tensor parallelism из коробки.

Установите vLLM:

pip install vllm==0.5.2

3 Запускаем с tensor parallelism

# Для Llama 3.2 70B на двух GPU:
vllm serve meta-llama/Llama-3.2-70B-Instruct \
  --tensor-parallel-size 2 \
  --gpu-memory-utilization 0.9 \
  --max-model-len 8192 \
  --port 8000

Ключевой параметр здесь — --tensor-parallel-size 2. Он говорит vLLM: "Используй tensor parallelism на двух GPU". Система сама разделит матрицы внимания и MLP слоев между картами.

Проверьте нагрузку:

# В другом терминале:
nvidia-smi

# Должно быть примерно:
# GPU 0: 85% util, 22GB VRAM
# GPU 1: 83% util, 22GB VRAM

Теперь протестируйте скорость через API:

curl http://localhost:8000/v1/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "meta-llama/Llama-3.2-70B-Instruct",
    "prompt": "Explain quantum computing in simple terms",
    "max_tokens": 500,
    "temperature": 0.7
  }'

В ответе будет поле "usage": {"total_tokens": ..., "completion_tokens": ...}. Засеките время. Разделите completion_tokens на время в секундах. Должно получиться 12-18 tokens/s для Llama 3.2 70B на двух RTX 3090. Это в 1.5-2 раза быстрее, чем pipeline parallelism в LM Studio.

💡
Бонус: vLLM поддерживает continuous batching. Это значит, что если к вам приходят несколько запросов одновременно, система будет обрабатывать их вместе, еще больше увеличивая общую пропускную способность. В LM Studio каждый запрос обрабатывается отдельно.

Шаг 3: Тонкая настройка для конкретного железа

Не все GPU одинаковы. Даже две RTX 3090 могут отличаться (разный производитель, разная система охлаждения, разный разгон). А если у вас смешанная конфигурация (например, RTX 3090 + RTX 4090), нужно настраивать еще тщательнее.

4 Смешанные GPU: когда карты разные

Допустим, у вас RTX 3090 (24GB) и RTX 4090 (24GB). Вторая быстрее примерно на 60%. Если просто разделить слои пополам, RTX 4090 будет ждать RTX 3090. Нужно дать более быстрой карте больше работы.

В vLLM есть параметр --worker-gpu-memory:

# RTX 4090 получает 20GB, RTX 3090 — 16GB
# (хотя у обеих по 24GB, но мы резервируем память под коммуникации)
vllm serve meta-llama/Llama-3.2-70B-Instruct \
  --tensor-parallel-size 2 \
  --worker-gpu-memory "20 GiB" "16 GiB" \
  --port 8000

vLLM сам распределит вычисления с учетом разной производительности карт. Более быстрая карта получит немного большую часть матриц.

Если используете LM Studio или llama.cpp напрямую, придется настраивать вручную через tensor_split:

# Пример для llama.cpp Python binding
from llama_cpp import Llama

llm = Llama(
    model_path="./llama-3.2-70b.Q4_K_M.gguf",
    n_gpu_layers=-1,  # все слои на GPU
    n_threads=12,
    tensor_split=[0.7, 0.3],  # 70% работы на быструю карту, 30% на медленную
    verbose=True
)

Чего делать не надо: частые ошибки

За годы работы с multi-GPU setup я насмотрелся на типичные косяки. Вот топ-3, которые убивают производительность:

  1. NVLink — не панацея. Люди думают: "Куплю NVLink мост, и все заработает быстрее". Нет. NVLink ускоряет обмен данными между картами, но не заставляет фреймворк использовать обе карты равномерно. Сначала настройте распределение слоев, потом думайте о NVLink. Кстати, у меня есть подробная статья про NVLink для двух RTX 3090, где разобраны все нюансы.
  2. PCIe x4 — убийца скорости. Если ваша вторая карта стоит в слоте PCIe x4 (особенно PCIe 3.0), обмен данными между GPU будет бутылочным горлышком. При tensor parallelism карты постоянно обмениваются промежуточными результатами. Если шина медленная, они будут ждать. Всегда ставьте карты в слоты x8 или x16. Подробнее в статье про PCIe-шину как узкое горлышко.
  3. Автоопределение слоев — лотерея. Никогда не оставляйте "auto" в настройках GPU Layers. Особенно если у вас нестандартная конфигурация. Система почти всегда определяет неправильно. Указывайте конкретные числа.

Мониторинг и метрики: как понять, что все работает

После настройки нужно проверить, что улучшения реальны. Не доверяйте "ощущениям". Используйте конкретные метрики:

  • Tokens/s — главный показатель. Замеряйте на одном и том же промпте, с одинаковыми параметрами (temperature, max_tokens).
  • Time to First Token (TTFT) — как быстро модель начинает генерировать. В некоторых настройках tokens/s может быть высоким, но TTFT — огромным. Это плохо для интерактивных приложений.
  • GPU Utilization — должна быть примерно равна на всех картах (±10%).
  • Power Draw — если вторая карта все еще потребляет мало энергии, значит, она все еще недогружена.

Для продвинутого мониторинга установите:

# Мониторинг vLLM
pip install prometheus-client

# vLLM по умолчанию отдает метрики на порту 8001
curl http://localhost:8001/metrics

Там будут метрики вроде vllm:requests_processed_total, vllm:generation_tokens_total, vllm:request_latency_seconds.

Что делать, если ничего не помогает

Бывает. Вы все перепробовали, а вторая карта все равно работает на 20%. Что тогда?

  1. Проверьте драйверы. На 08.02.2026 актуальная версия — 560.xx. Устаревшие драйверы могут плохо работать с multi-GPU.
  2. Попробуйте другую модель. Некоторые модели (особенно старые или нестандартной архитектуры) плохо работают с tensor parallelism. Попробуйте Mistral или Llama — они обычно хорошо оптимизированы.
  3. Снизьте квантование. Если используете Q4_K_M, попробуйте Q3_K_S. Модель станет менее точной, но может лучше распределиться по GPU.
  4. Используйте специализированные сборки. Например, llama.cpp с tensor parallelism может работать там, где не работает LM Studio.

Последний совет: если у вас действительно экзотическая конфигурация (разные производители, разная архитектура), посмотрите мою статью про mixed-vendor кластер. Там разобраны кейсы, когда NVIDIA работает вместе с AMD через RPC — это следующий уровень сложности.

Итог: простой чеклист

Если лень читать всю статью, вот краткий план действий:

  1. Запустите nvidia-smi -l 1, посмотрите нагрузку GPU.
  2. Если одна карта загружена сильно, а вторая слабо — проблема в распределении слоев.
  3. В LM Studio: замените "auto" на конкретные числа в GPU Layers (например, 48,32).
  4. Для максимальной скорости: установите vLLM 0.5.2, запустите с --tensor-parallel-size 2.
  5. Для смешанных GPU используйте --worker-gpu-memory или tensor_split.
  6. Никогда не оставляйте настройки по умолчанию для multi-GPU.

Самая частая ошибка — думать, что multi-GPU работает "из коробки". Не работает. Особенно в 2026 году, когда инструменты становятся все сложнее, а документация — все скупее. Но если разобраться в основах (pipeline vs tensor parallelism), можно выжать из двух карт в 1.8-2.2 раза больше скорости, чем из одной. И это стоит потраченного времени.

P.S. Если после всех настроек ваша система начала генерировать текст со скоростью 20 tokens/s на Llama 3.2 70B — поздравляю. Вы вошли в топ-10% пользователей, которые заставили multi-GPU setup работать как надо. Остальные 90% все еще смотрят на загруженную на 15% вторую карту и чешут голову.