Когда больше — не значит быстрее
Вы купили вторую 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 слои могут быть разной вычислительной сложности. И если вы случайно положили все тяжелые слои на первую карту, а легкие — на вторую, первая будет задыхаться, а вторая — зевать.
Диагностика: с чего начать
Прежде чем что-то менять, нужно понять, что происходит прямо сейчас. Откройте терминал и запустите:
# Мониторим нагрузку 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.
Шаг 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, которые убивают производительность:
- NVLink — не панацея. Люди думают: "Куплю NVLink мост, и все заработает быстрее". Нет. NVLink ускоряет обмен данными между картами, но не заставляет фреймворк использовать обе карты равномерно. Сначала настройте распределение слоев, потом думайте о NVLink. Кстати, у меня есть подробная статья про NVLink для двух RTX 3090, где разобраны все нюансы.
- PCIe x4 — убийца скорости. Если ваша вторая карта стоит в слоте PCIe x4 (особенно PCIe 3.0), обмен данными между GPU будет бутылочным горлышком. При tensor parallelism карты постоянно обмениваются промежуточными результатами. Если шина медленная, они будут ждать. Всегда ставьте карты в слоты x8 или x16. Подробнее в статье про PCIe-шину как узкое горлышко.
- Автоопределение слоев — лотерея. Никогда не оставляйте "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%. Что тогда?
- Проверьте драйверы. На 08.02.2026 актуальная версия — 560.xx. Устаревшие драйверы могут плохо работать с multi-GPU.
- Попробуйте другую модель. Некоторые модели (особенно старые или нестандартной архитектуры) плохо работают с tensor parallelism. Попробуйте Mistral или Llama — они обычно хорошо оптимизированы.
- Снизьте квантование. Если используете Q4_K_M, попробуйте Q3_K_S. Модель станет менее точной, но может лучше распределиться по GPU.
- Используйте специализированные сборки. Например, llama.cpp с tensor parallelism может работать там, где не работает LM Studio.
Последний совет: если у вас действительно экзотическая конфигурация (разные производители, разная архитектура), посмотрите мою статью про mixed-vendor кластер. Там разобраны кейсы, когда NVIDIA работает вместе с AMD через RPC — это следующий уровень сложности.
Итог: простой чеклист
Если лень читать всю статью, вот краткий план действий:
- Запустите
nvidia-smi -l 1, посмотрите нагрузку GPU. - Если одна карта загружена сильно, а вторая слабо — проблема в распределении слоев.
- В LM Studio: замените "auto" на конкретные числа в GPU Layers (например, 48,32).
- Для максимальной скорости: установите vLLM 0.5.2, запустите с
--tensor-parallel-size 2. - Для смешанных GPU используйте
--worker-gpu-memoryилиtensor_split. - Никогда не оставляйте настройки по умолчанию для 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% вторую карту и чешут голову.