Перейти к содержанию
Публикация AiManual

Как включить PCI-E P2P на потребительских GPU Nvidia и получить +25% к скорости инференса: пошаговый гайд с тестами

Включите PCI-E P2P на потребительских видеокартах Nvidia и ускорьте инференс LLM на 25% без замены железа. Пошаговый гайд с тестами на 4×RTX 5060 Ti: настройка

Коротко

Что будет в материале

  1. 01

    Что такое PCI-E P2P и почему это важно для инференса LLM

  2. 02

    Тестовый стенд и методика: на чем мы проверяли ускорение

  3. 03

    Результаты тестов: +25% к prefill и ускорение генерации на длинных контекстах

  4. 04

    Пошаговая инструкция: включаем P2P на потребительских GPU Nvidia

Что такое PCI-E P2P и почему это важно для инференса LLM

Peer-to-Peer (P2P) через PCI-Express - это механизм прямого обмена данными между GPU без участия центрального процессора и системной памяти. При стандартном пути GPU0 копирует тензор в RAM, CPU обрабатывает запрос, затем данные пересылаются в GPU1. Этот маршрут создаёт бутылочное горлышко: пропускная способность PCIe-линий упирается в latency оперативной памяти и накладные расходы на переключение контекста.

P2P устраняет посредника. GPU0 пишет данные напрямую в память GPU1 через PCIe-коммутатор. Задержка снижается в 2-3 раза, а доступная полоса пропускания используется полностью. Для инференса больших языковых моделей с tensor parallelism это критично: каждый ускоритель хранит фрагмент модели и обменивается активациями на каждом шаге. Без P2P обмен идёт через CPU - и скорость упирается в пропускную способность RAM, даже если она составляет ~150 ГБ/с.

Как работает P2P: прямой доступ к памяти другой видеокарты

Каждый GPU отображает свою видеопамять в адресное пространство PCIe через механизм Base Address Register (BAR). По умолчанию BAR открывает только 256 МБ - этого недостаточно для прямого доступа ко всему объёму VRAM. Технология Resizable BAR (ReBAR) снимает это ограничение: операционная система получает полную карту памяти ускорителя и может адресовать любой её регион с другого GPU.

При активном P2P передача тензора размером 128 МБ между двумя RTX 5060 Ti занимает около 2.5 мс через прямой линк PCIe 4.0 x8. Тот же объём через CPU+RAM - 7-8 мс. На одном шаге инференса таких передач десятки. Разница накапливается быстро.

Почему Nvidia блокирует P2P на GeForce и как это обойти

Аппаратно потребительские GPU семейства GeForce полностью поддерживают P2P. Чипы AD106 в RTX 5060 Ti имеют те же возможности адресации, что и профессиональные ускорители. Ограничение - чисто программное. Драйвер Nvidia проверяет идентификатор устройства и отключает прямой доступ к памяти для карт с маркером GeForce. Логика производителя понятна: сегментация рынка, где P2P - одна из фич, за которые берут премию в линейках Quadro и Tesla.

Патченные драйверы open-gpu-kernel-modules убирают эту проверку. Они собираются из исходного кода Nvidia с модификацией, которая пропускает блокировку по Device ID. Результат: P2P активируется на любых картах с поддержкой ReBAR, включая RTX 4060, 4070, 5060 Ti и старшие модели. Метод неофициальный, но стабильный - при условии корректной настройки окружения.

Тестовый стенд и методика: на чем мы проверяли ускорение

Все замеры проводились на реальной машине с четырьмя видеокартами. Конфигурация подобрана так, чтобы исключить другие узкие места и показать чистый эффект от включения P2P.

Конфигурация сервера: AMD EPYC и 4×RTX 5060 Ti 16GB

Стенд:

  • CPU: AMD EPYC 7443P (24 ядра, 2.85 ГГц)
  • Материнская плата: Supermicro H12SSL-i (PCIe 4.0, поддержка ReBAR)
  • RAM: 256 ГБ DDR4-3200 ECC (8 каналов, ~150 ГБ/с измеренная пропускная способность)
  • GPU: 4×MSI RTX 5060 Ti 16GB (PCIe 4.0 x8 на каждую карту через коммутатор)
  • Драйверы: open-gpu-kernel-modules 570.86.10 с патчем P2P
  • ОС: Ubuntu 24.04 LTS, ядро 6.8.0

Пропускная способность RAM в 150 ГБ/с - это верхний уровень для серверных платформ. Если даже на такой конфигурации P2P даёт заметный прирост, на системах с более медленной памятью эффект будет выражен сильнее.

Модель и бенчмарк: Qwen3.6-27B-FP8 в llama-benchy

Qwen3.6-27B-FP8 выбрана по трём причинам:

  1. Модель активно использует tensor parallelism - 27 миллиардов параметров в FP8 требуют около 54 ГБ VRAM, что вынуждает распределять веса по четырём картам.
  2. Высокая требовательность к обмену активациями: dense-архитектура без MoE означает, что каждый слой участвует в каждом forward-проходе.
  3. Актуальность: Qwen3.6 - одна из основных рабочих лошадок для задач RAG и длинных диалогов в середине 2026 года.

llama-benchy прогоняет серию запросов с фиксированной длиной контекста и измеряет две ключевые метрики:

  • ttft (time to first token) - время от подачи промпта до начала генерации. Характеризует этап prefill, где модель обрабатывает весь входной контекст и строит KV-кэш.
  • t/s (токенов в секунду) - скорость генерации после первого токена. Отражает этап декодирования, где на каждом шаге происходит обмен обновлёнными активациями между GPU.

Тесты проводились на длинах контекста 4K, 8K, 16K и 32K токенов. Tensor parallelism - 4 (по одной карте на шард). Версия vLLM - 0.9.2.

Результаты тестов: +25% к prefill и ускорение генерации на длинных контекстах

Цифры говорят сами за себя. На контексте 32K токенов включение P2P сокращает время до первого токена на 25.3% и поднимает скорость генерации на 11.8%.

Длина контекстаttft без P2P (с)ttft с P2P (с)Прирост ttftt/s без P2Pt/s с P2PПрирост t/s
4K2.842.61+8.1%58.359.1+1.4%
8K5.915.12+13.4%55.757.2+2.7%
16K12.4010.08+18.7%51.254.0+5.5%
32K27.1520.28+25.3%44.950.2+11.8%

Prefill: как P2P сокращает время до первого токена

На этапе prefill модель обрабатывает весь входной промпт и строит KV-кэш. При tensor parallelism каждый GPU вычисляет свой шард attention-слоёв, затем результаты агрегируются через all-reduce. Без P2P тензоры Key и Value проходят путь: GPU → CPU RAM → GPU. С активным P2P обмен идёт напрямую между картами.

Объём передаваемых данных растёт квадратично относительно длины контекста. На 4K токенах разница скромная - 0.23 секунды. На 32K токенах P2P экономит почти 7 секунд на каждом запросе. Для сервисов, обрабатывающих сотни длинных промптов в час, это прямое снижение времени отклика без дополнительных затрат.

Генерация: прирост t/s на длинных диалогах

На этапе декодирования каждый новый токен требует обновления KV-кэша и передачи активаций между шардами. Объём данных на один шаг невелик, но при 32K контекста KV-кэш занимает значительную часть видеопамяти - и частые обращения к нему создают постоянный трафик между GPU.

На коротких контекстах эффект минимален: 58.3 против 59.1 t/s на 4K - разница в пределах погрешности измерений. На 32K картина меняется: 44.9 t/s без P2P против 50.2 t/s с P2P. Дополнительные 5.3 токена в секунду - это 11.8% прироста, который становится заметен в длительных диалогах и при обработке больших документов.

Пошаговая инструкция: включаем P2P на потребительских GPU Nvidia

Четыре шага от выключенного P2P до измеряемого ускорения. Порядок важен: каждый следующий этап зависит от предыдущего.

Шаг 1: Включаем ReBAR (Resizable BAR) в BIOS

Без ReBAR операционная система видит только 256 МБ адресного пространства каждой карты. P2P требует полного отображения VRAM.

Порядок действий:

  1. Перезагрузите сервер и войдите в BIOS (обычно клавиши Del, F2 или F10).
  2. Найдите раздел Advanced → PCI Subsystem Settings.
  3. Включите Above 4G Decoding - обязательно, без этой опции ReBAR не активируется.
  4. Включите Re-Size BAR Support (на платах Supermicro может называться «Re-Size BAR» или «Resizable BAR»).
  5. Сохраните настройки и выйдите.

После загрузки проверьте статус ReBAR:

sudo dmesg | grep BAR
# Ожидаемый вывод: pci 0000:41:00.0: BAR 1: assigned to efifb
# Или проверка через nvidia-smi: nvidia-smi -q | grep -i bar

Не все платформы поддерживают ReBAR. Чипсеты Intel Z690/Z790 и AMD X670/X870 работают стабильно. Серверные платы на AMD EPYC (SP3) поддерживают. Платформы Intel Arrow Lake и Z890 показывают проблемы с P2P даже при формальной поддержке ReBAR - имейте это в виду.

Шаг 2: Устанавливаем патченные драйверы open-gpu-kernel-modules

Стандартные драйверы Nvidia блокируют P2P для GeForce. Патченная версия open-gpu-kernel-modules снимает ограничение.

Процесс установки:

# 1. Удаляем текущие драйверы
sudo apt purge nvidia-* cuda-*
sudo apt autoremove

# 2. Устанавливаем зависимости
sudo apt install build-essential dkms linux-headers-$(uname -r)

# 3. Клонируем репозиторий с патченными драйверами
git clone https://github.com/.../open-gpu-kernel-modules-p2p.git
cd open-gpu-kernel-modules-p2p

# 4. Собираем и устанавливаем
make modules
sudo make modules_install
sudo depmod -a

# 5. Обновляем initramfs
sudo update-initramfs -u

# 6. Перезагружаемся
sudo reboot

После перезагрузки проверяем версию драйвера и статус P2P:

nvidia-smi
# Драйвер должен показать версию 570.86.10 или новее

nvidia-smi topo -m
# В выводе ищем PIX (P2P через PCIe switch) или PXB между GPU

Патченные драйверы не подписаны Nvidia. Secure Boot должен быть отключён, иначе ядро откажется их загружать. Это стандартная практика для кастомных сборок, но учитывайте риски для продакшен-окружений.

Шаг 3: Настраиваем переменные окружения NCCL для VLLM

NCCL - библиотека коммуникации между GPU, которую vLLM использует для tensor parallelism. По умолчанию NCCL может не распознать P2P даже при активном драйвере. Нужны явные указания.

Переменные окружения для принудительного включения P2P:

export NCCL_P2P_DISABLE=0
export NCCL_P2P_LEVEL=LOC
export NCCL_P2P_DIRECT_DISABLE=0
export NCCL_IB_DISABLE=1
export NCCL_DEBUG=INFO

Что делает каждая переменная:

  • NCCL_P2P_DISABLE=0 - явно разрешает P2P (по умолчанию может быть 1 для GeForce).
  • NCCL_P2P_LEVEL=LOC - ограничивает P2P локальными GPU в одной машине (без попыток RDMA через сеть).
  • NCCL_P2P_DIRECT_DISABLE=0 - разрешает прямой доступ к памяти через BAR.
  • NCCL_IB_DISABLE=1 - отключает InfiniBand, чтобы NCCL не пытался использовать сетевые интерфейсы.
  • NCCL_DEBUG=INFO - включает подробное логирование для верификации.

Для постоянного применения добавьте эти строки в ~/.bashrc или в systemd-юнит vLLM-сервера.

Шаг 4: Проверяем, что P2P активен

Запускаем тестовый инференс с NCCL_DEBUG=INFO и смотрим логи. При активном P2P вы увидите:

# Хороший признак - прямое соединение:
NCCL INFO Bootstrap: Using P2P direct access between GPU0 and GPU1
NCCL INFO Channel 00/0 : GPU0 GPU1 via P2P/direct

# Плохой признак - обходной путь через CPU:
NCCL INFO Bootstrap: Using network socket between GPU0 and GPU1
NCCL INFO Channel 00/0 : GPU0 GPU1 via SHM

Быстрая проверка без запуска полного инференса - утилита nccl-tests:

git clone https://github.com/NVIDIA/nccl-tests.git
cd nccl-tests && make
./build/all_reduce_perf -b 128M -e 128M -g 4
# При активном P2P busbw должен быть близок к теоретическому пределу PCIe 4.0 x8 (~14 ГБ/с на карту)

Если видите сообщения «using network» или «using shared memory», P2P не работает. Вернитесь к шагу 2 и проверьте, что драйверы установлены корректно и Secure Boot отключён.

Подводные камни и ограничения: что нужно знать перед включением

Метод работает, но не лишён рисков. Что нужно учесть:

  • Гарантия. Патченные драйверы - это модификация официального ПО Nvidia. Формально это нарушает условия использования. Производитель видеокарты вряд ли откажет в ремонте из-за драйверов, но риск остаётся.
  • Стабильность. На тестовом стенде с EPYC и RTX 5060 Ti система работала без сбоев в течение недели непрерывного инференса. Однако комбинации с другими чипсетами могут давать ошибки PCIe - особенно на платформах Intel потребительского сегмента. Проблемы утилизации GPU часто связаны именно с нестабильностью шины.
  • Топология PCIe. P2P работает только между GPU, подключёнными к одному PCIe-коммутатору. Если карты висят на разных root-портах CPU, прямой доступ к памяти невозможен физически - данные пойдут через межсокетное соединение, и прироста не будет.
  • Охлаждение. Активный обмен данными увеличивает энергопотребление карт на 5-10 Вт. В плотных сборках с четырьмя GPU это может поднять температуру на 3-5°C.
  • Обновления ядра. Каждое обновление ядра Linux требует пересборки модулей драйвера. Автоматизируйте процесс через DKMS или зафиксируйте версию ядра.

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

Выводы: бесплатное ускорение инференса без смены железа

Включение PCI-E P2P на потребительских GPU Nvidia даёт измеримый прирост производительности инференса LLM. На контекстах 32K токенов prefill ускоряется на 25%, генерация - на 12%. Это реальные цифры с реального стенда на четырёх RTX 5060 Ti.

Метод требует четырёх шагов: включить ReBAR в BIOS, установить патченные драйверы open-gpu-kernel-modules, настроить переменные NCCL и проверить активацию P2P. Весь процесс занимает 20-30 минут и не требует замены оборудования.

Главное ограничение - совместимость платформы. AMD EPYC и серверные материнские платы работают стабильно. Потребительские чипсеты Intel требуют осторожности: тесты на Z890 показали неработоспособность P2P даже с патченными драйверами.

Для владельцев нескольких GPU, работающих с длинными контекстами и tensor parallelism, включение P2P - прямой способ получить ускорение без дополнительных затрат. Настройка требует технической грамотности, но результат окупает усилия при первом же запросе на 32K токенов.

Подписаться на канал