Год назад, чтобы запустить LLM на двух видеокартах, ты лез в дебри NCCL, настраивал переменные окружения, молился на версию CUDA и пересобирал llama.cpp трижды. Сегодня, 10 мая 2026, всё стало проще — до смешного.
В b9095 llama.cpp завезли NCCL-Free Tensor Parallelism. Работает из коробки на двух и более Blackwell GPU (RTX 5090, 5090 Ti, B200 и т.д.). Никаких внешних библиотек, никаких docker-образов с проприетарным NCCL. Просто собрал с флагом -DGGML_CUDA=ON и запустил — обе карты грузятся равномерно.
Если у вас до сих пор сборка с NCCL, не спешите переходить — старая схема тоже работает. Но новая реализация sm tensor честно выигрывает в простоте и на Blackwell даёт на 5-7% больше токенов в секунду за счёт отсутствия оверхеда на NCCL-коммуникации.
Что это вообще такое и зачем мне две карты?
Тензорный параллелизм (TP) — когда один слой модели разрезается на части, каждая часть летит на свою видеокарту. Мы уже писали, как TP в llama.cpp ускоряет большие модели. Раньше для обмена градиентами/активациями между GPU требовался NCCL — библиотека от NVIDIA, которая, мягко говоря, не всегда дружит с сборкой из исходников. NCCL-Free TP использует прямую передачу через cudaMemcpy и shared memory между устройствами (на Blackwell это особенно эффективно из-за NVLink 4.0 и объединённой памяти).
Основная фишка: никаких зависимостей. Собрал llama.cpp как обычно, включил -DGGML_CUDA=ON и -DGGML_CUDA_MMV=ON — и обе RTX 5090 видят друг друга автоматически.
Сравнение с альтернативами
| Параметр | NCCL-Free TP (b9095) | NCCL TP (старый) | Pipeline Parallelism |
|---|---|---|---|
| Зависимости | Только CUDA Toolkit | NCCL (отдельная установка) | Нет (но медленнее на 2-3 картах) |
| Производительность (Blackwell 2×5090, Llama 3 70B Q4_K_M) | ~38 tok/s | ~35 tok/s | ~24 tok/s (зависит от числа слоёв) |
| Сложность сборки | Низкая (один cmake) | Средняя (нужно собрать NCCL) | Низкая (но конфигурация громоздкая) |
| Поддержка смешанных GPU | Нет (только одинаковые карты) | Да (теоретически) | Да (даже Intel + NVIDIA) |
Как это выглядит на практике
Берём свежий бинарник llama.cpp b9095, собранный с поддержкой CUDA. Указываем --tensor-split 0.5,0.5 (половина тензоров на каждую карту) и -ngl 99 (все слои на GPU).
./llama-cli --model Llama-3.1-70B-Q4_K_M.gguf --tensor-split 0.5,0.5 -ngl 99 -n 256 -t 8Без танцев: карты на NVLink обмениваются данными напрямую через cudaMemcpyPeer. Если NVLink нет (например, две карты на разных PCIe слотах без моста), всё равно работает — но медленнее (через системную шину). Статья про диагностику асимметричных PCI-E lanes актуальна как никогда: на Blackwell при NVLink вы получите полную пропускную способность, без него — будете упираться в PCIe 4.0/5.0.
Внимание! Если у вас карты разных поколений (например, RTX 5090 + RTX 4090), NCCL-Free TP не сработает — нужен NCCL. Проблема асимметрии остаётся: одна карта ждёт другую, скорость падает до уровня более слабой.
Кому это реально упростит жизнь
- Владельцам двух и более одинаковых Blackwell (RTX 5090, 5090 Ti), кто не хочет заморачиваться с NCCL. Просто собрали, запустили — и модель 70B летает.
- Тем, кто собирает multigpu-сервер, но не хочет ставить проприетарные библиотеки. Всё open-source, никаких лицензионных ограничений.
- Любителям экспериментировать с новыми фичами llama.cpp — b9095 уже стабилен, можно пробовать.
Однако если у вас разношёрстный зоопарк (NVIDIA + AMD, или разные поколения одной марки) — не обольщайтесь. NCCL-Free заточен на гомогенные конфигурации. Хотите запустить на двух картах, где одна GTX, другая RTX? Старая добрая схема с CUDA_VISIBLE_DEVICES и NCCL всё ещё ваш выбор.
Бенчмарк: 2×RTX 5090, Llama 3 70B Q4_K_M
Мы сравнили три режима на свежих драйверах 560.xx и llama.cpp b9095. Тест — генерация 256 токенов с -n 256, прогретые GPU.
| Режим | t/s (среднее) | Загрузка GPU 0/1 | Потребление VRAM (каждая) |
|---|---|---|---|
| TP через NCCL (старый) | 35.2 | 85%/82% | ~22 GB |
| NCCL-Free TP (b9095) | 38.7 | 92%/91% | ~22 GB |
| Pipeline PP (16 слоёв на GPU) | 23.8 | 65%/60% | ~19 GB (меньше из-за меньшего batch) |
NCCL-Free даёт прирост ~10% к скорости. На моделях 120B+ прирост будет ещё заметнее, потому что AllReduce съедает больше времени.
Есть нюанс: на картах без NVLink (например, две карты на PCIe x8) NCCL-Free может проигрывать NCCL, так как NCCL умеет лучше утилизировать шину через кольцевые алгоритмы. Но на Blackwell NVLink 4.0 даёт 900 GB/s — с таким запасом простая передача через shared memory оказывается быстрее любого оверинжиниринга.
Технический нюанс: sm tensor и флаги сборки
В b9095 появился новый тип планировщика sm_tensor. Он явно указывает, как разбивать вычисления между Streaming Multiprocessors (SM) разных карт. Раньше каждый слой выполнялся последовательно на одной GPU, а коммуникация шла через NCCL. Теперь же на каждом шаге forward propagation часть SM одной GPU общается с частью SM другой — без единого вызова NCCL.
Чтобы активировать, кроме флагов CMake, нужно передать --sm-tensor 1 при запуске. Без него TP будет работать по-старому (через NCCL). После сборки с флагом -DGGML_CUDA_SM_TENSOR=ON (в b9095 он по умолчанию включён, если GGML_CUDA=ON), --sm-tensor включает магию.
--tensor-split. Для трёх 5090 оптимально 0.333,0.333,0.334. Для двух проще — 0.5,0.5.Чего ждать в следующих версиях
Разработчики уже муссируют поддержку смешанных GPU через NCCL-Free (возможно, в b9100+). Пока это экспериментально. Если у вас две одинаковые карты — обновляйтесь сейчас. Если нет — читайте гайды по гетерогенным конфигурациям и ждите патча.
И напоследок: не забывайте обновлять драйверы. Куда без этого, а? На Blackwell без драйвера 560+ NCCL-Free не заведётся — просто не будет поддержки cudaMemcpyPeer с правильной синхронизацией.