Обучение большой языковой модели на одной видеокарте невозможно: модели с сотнями миллиардов параметров просто не помещаются в 80 ГБ памяти одного GPU. Нужно как-то объединить десятки видеокарт так, чтобы они работали не как набор отдельных устройств, пересылающих данные через узкие PCIe-шины, а как единый вычислительный ресурс с общей высокоскоростной памятью. Именно эту задачу решают NVLink и NVSwitch, и разрыв в производительности между правильно соединёнными GPU и теми, что висят на PCIe, составляет не проценты, а порядки.

Проблема с PCIe и почему стандартной шины недостаточно

Когда восемь видеокарт вставлены в сервер через PCIe, каждая из них имеет выделенный канал к CPU. GPU-to-GPU коммуникация идёт через хост: данные поднимаются от GPU к CPU через PCIe, перемещаются в памяти CPU и спускаются обратно к другому GPU. Пропускная способность PCIe Gen5 x16 составляет около 128 ГБ/с в обе стороны. Это уже немало для периферийного устройства, но катастрофически мало для задач, где восемь GPU должны синхронизировать градиенты в процессе обучения нейросети на каждом шаге.

Представьте коллективную операцию All-Reduce, базовую примитив синхронизации в распределённом обучении: каждый GPU должен отправить свои градиенты всем остальным и получить агрегированный результат. Через PCIe это узкое место оказывается настолько болезненным, что GPU простаивают в ожидании данных большую часть времени. Вычислительные мощности простаивают, пока шина передаёт данные.

NVLink решает эту проблему принципиально иначе: прямое высокоскоростное соединение между GPU без участия CPU и PCIe. Первое поколение NVLink в Pascal P100 давало 160 ГБ/с в обе стороны, что уже в пять раз превышало PCIe 3.0. NVLink 4.0 в H100 обеспечивает 900 ГБ/с. NVLink 5.0 в Blackwell удваивает это до 1,8 ТБ/с на GPU.

Как устроен NVLink на физическом уровне

Каждый NVLink-канал состоит из множества высокоскоростных дифференциальных пар. В NVLink 4.0 каждый сублинк объединяет четыре пары 112G SerDes, каждая пара работает на 100 Гбит/с, что даёт 50 ГБ/с на сублинк. У H100 таких сублинков 18, что в сумме и даёт 900 ГБ/с.

В NVLink 5.0 для Blackwell скорость каждой пары удвоилась, при тех же 18 сублинках итоговая пропускная способность составляет 1,8 ТБ/с на GPU.

Проверить топологию NVLink на сервере с несколькими GPU можно так:

nvidia-smi topo -m

Вывод показывает матрицу связности GPU. Обозначения читаются так: NV4 означает соединение через 4 NVLink-ссылки, NV12 означает 12 ссылок, PIX означает соединение через PCIe без NVLink, SYS означает соединение через NUMA-границу. На сервере с DGX H100 вывод покажет NV18 в большинстве ячеек матрицы, то есть все GPU соединены через все 18 NVLink-портов через NVSwitch.

Узнать детальную информацию о NVLink-соединениях конкретного GPU:

nvidia-smi nvlink --status -i 0
nvidia-smi nvlink --capabilities -i 0

# счётчики трафика через NVLink
nvidia-smi nvlink --setcontrol 0bz -i 0   # сброс счётчиков
nvidia-smi nvlink --getcounters -i 0       # чтение счётчиков

NVSwitch как коммутатор внутри сервера

Прямое соединение каждого GPU с каждым работает только при небольшом числе GPU. При восьми картах прямая топология потребовала бы 28 связей, при 16 GPU уже 120 связей, и физически это нереализуемо. Именно здесь на сцену выходит NVSwitch: выделенный коммутатор, реализующий any-to-any топологию.

В сервере DGX H100 восемь GPU подключены к четырём чипам NVSwitch третьего поколения. Каждый GPU соединён с каждым NVSwitch-чипом в схеме 5+4+4+5 (распределение NVLink-портов по чипам). Каждый NVSwitch-чип обеспечивает суммарную пропускную способность 25,6 Тбит/с. Топология non-blocking: пропускная способность не зависит от числа одновременно общающихся GPU. Все восемь GPU могут одновременно обмениваться данными на полной скорости.

Для сравнения рассмотрим гипотетический сервер с восемью H100 без NVSwitch, где GPU соединены точка-точка. Каждый GPU вынужден делить свои 900 ГБ/с на семь выделенных соединений по 128 ГБ/с к каждому из остальных. Общая пропускная способность системы та же самая, но эффективная пропускная способность для коллективных операций падает, потому что данные не могут течь через общий коммутатор.

При демонстрации 2024 года 8 GPU H100, использующих NVSwitch, выполнили All-Reduce операцию над 20 ГБ данных за 22 мс, тогда как без NVSwitch та же операция заняла 150 мс. Ускорение в 7 раз для одной операции прямо транслируется в скорость обучения моделей.

GB200 NVL72 и масштабирование на уровень стойки

DGX H100 соединяет восемь GPU внутри одного сервера. GB200 NVL72 делает качественный шаг вперёд: система GB200 NVL72 соединяет 36 процессоров Grace и 72 GPU Blackwell в конструкции размером со стойку, позволяя всем 72 GPU работать как единый GPU.

Топология NVL72 устроена так. Стойка содержит 18 вычислительных лотков (Compute Tray), каждый с двумя модулями GB200 (то есть с четырьмя GPU Blackwell). Девять лотков NVSwitch (Switch Tray), каждый с двумя чипами NVSwitch четвёртого поколения, обеспечивают связность. Каждый GPU имеет 18 NVLink 5.0-портов. Каждый чип NVSwitch имеет 72 порта NVLink 5.0. При полном подключении каждый GPU соединён с каждым NVSwitch-чипом.

В NVL72 нет прямых GPU-to-GPU соединений внутри одного вычислительного лотка. Все 72 GPU эквивалентны с точки зрения высокоскоростной NVLink-связности: каждый GPU подключён к внешним NVSwitch через медный бэкплейн стойки.

Это принципиально отличается от архитектуры DGX H100, где коммутаторы располагались внутри сервера. В NVL72 весь fabric вынесен в отдельные Switch Tray, а медный бэкплейн обеспечивает соединения без оптики внутри стойки.

Суммарная пропускная способность NVLink-fabric в NVL72 составляет 130 ТБ/с для GPU-to-GPU коммуникации внутри стойки. Для сравнения: пропускная способность всех 72 GPU по HBM3e-памяти составляет около 14,4 ТБ/с. Межсоединение быстрее, чем собственная память GPU.

NCCL и как программный стек использует топологию

Сама по себе аппаратная топология ничего не даёт без соответствующего программного стека. NCCL (NVIDIA Collective Communications Library) является библиотекой, которая реализует примитивы коллективных коммуникаций: AllReduce, AllGather, Broadcast, ReduceScatter. Именно через неё PyTorch, JAX и другие фреймворки выполняют синхронизацию между GPU.

NCCL автоматически определяет топологию системы и выбирает оптимальный алгоритм:

import torch
import torch.distributed as dist

# инициализация процессной группы
dist.init_process_group(backend='nccl')

# создать тензор на GPU
tensor = torch.randn(1000000).cuda()

# синхронизировать суммой по всем GPU (AllReduce)
dist.all_reduce(tensor, op=dist.ReduceOp.SUM)

NCCL прозрачно использует NVLink когда он доступен. Посмотреть, что NCCL обнаружил в топологии, можно через переменную окружения:

NCCL_DEBUG=INFO python train.py 2>&1 | grep -E "NVLink|topology"

Вывод покажет, какие кольца и деревья NCCL построил для коллективных операций, и использует ли он NVLink или PCIe. Разница заметна сразу: на NVLink-топологии NCCL строит кольца через NVSwitch, которые обеспечивают значительно большую эффективную пропускную способность.

Для NVL72 NCCL требует явной подсказки о топологии через файл конфигурации, потому что 72 GPU в одной стойке нестандартная конфигурация:

# указать файл топологии для NVL72
NCCL_TOPO_FILE=/etc/nvl72_topology.xml python train.py

# или через переменную для Slurm-окружений
#SBATCH --segment=<NVL72_rack_id>

Масштабирование за пределы одной стойки и роль InfiniBand

NVLink решает задачу Scale-Up: объединение GPU внутри одного сервера или стойки в единый fabric. Но тренировка моделей следующего поколения требует тысяч GPU, и здесь NVLink заканчивается. Для Scale-Out, то есть связности между стойками и серверами, используется InfiniBand или RoCE Ethernet.

Типичная топология InfiniBand-фабрики для кластеров GB200 реализована по схеме rail-optimized fat-tree. GPU-серверы подключаются к группе leaf-коммутаторов кратными 32, образуя Scalable Unit. Каждый NIC GPU-сервера подключён к отдельному leaf-коммутатору внутри SU, что позволяет GPU использовать NVSwitch для доступа к любому из восьми NIC сервера и общаться с GPU из того же SU через один hop.

На практике в кластере GB200 NVL576, объединяющем восемь стоек NVL72, внутри каждой стойки работает NVLink-fabric с пропускной способностью 130 ТБ/с. Между стойками трафик идёт через InfiniBand NDR400 или Quantum-2. Разница в пропускной способности между NVLink и InfiniBand составляет несколько порядков, поэтому планировщик задач должен знать о топологии и размещать рабочие нагрузки так, чтобы интенсивная коммуникация оставалась внутри NVLink-домена.

Убедиться, что задание Slurm размещено внутри одной стойки NVL72:

sbatch --segment=nvl72 \
       --nodes=1 \
       --gpus-per-node=72 \
       train_llm.sh

Unified Memory и GPUDirect как следствие высокоскоростного fabric

Высокая пропускная способность NVLink открывает возможности, которые при медленном соединении были бы непрактичны. CUDA Unified Memory позволяет приложению обращаться к памяти любого GPU в NVLink-домене напрямую по указателю, не выполняя явных cudaMemcpy. Ядро мигрирует страницы по требованию или с prefetch-подсказками.

# выделить память в Unified Memory
import cupy as cp

# данные автоматически мигрируют между GPU по требованию
with cp.cuda.Device(0):
    a = cp.cuda.alloc_pinned_memory(1024 * 1024 * 1024)

# явный prefetch на конкретный GPU
cp.cuda.runtime.memPrefetchAsync(ptr, size, device=1)

GPUDirect RDMA позволяет GPU напрямую читать и писать в память другого GPU через NVLink без участия CPU. Это устраняет лишнее копирование и снижает latency коллективных операций. Исследование 2019 года показало, что платформа POWER9 с NVLink и Volta получила до 34% прироста производительности от использования prefetching и memory advising именно потому, что NVLink сделал CPU-GPU обмен достаточно быстрым.

Разрыв между 128 ГБ/с PCIe Gen5 и 1,8 ТБ/с NVLink 5.0 выглядит как количественное различие. Но на практике это разница между системой, где GPU большую часть времени ждут данных, и системой, где вычисления и передача данных действительно перекрываются. Именно поэтому кластер из 72 Blackwell с NVLink-fabric выдаёт на задачах вывода больших моделей не в 72 раза больше производительности, чем один GPU, а в 30 раз по сравнению с предыдущим поколением, как утверждает NVIDIA. Коммуникационные накладные расходы перестают быть доминирующим ограничением, и GPU наконец занимаются тем, для чего предназначены.