
Отключение USB‑контроллеров и аудио-устройств видеокарт для освобождения ресурсов шины PCI-E в Linux
Для ускорения инференса в multiGPU-системе критически важно обеспечить максимальную пропускную способность обмена между видеокартами по шине PCI-E. Для этого можно отключить все неиспользуемые устройства, подключенные к ней, например, аудио, а также обычно неиспользуемые VirtualLink USB-контроллеры видеокарт (работают через DisplayPort на VR-устройствах).
Снижение нагрузки на шину PCI-E, уменьшение потребления ресурсов, отключение ненужных драйверов улучшит стабильность и производительность системы, что особенно важно в мульти-GPU конфигурациях.
Изучить информацию о подключении видеокарт Nvidia к шине PCI-E можно по команде:
lspci | grep -E "USB|Audio" | grep -i nvidia
01:00.1 Audio device: NVIDIA Corporation TU116 High Definition Audio Controller (rev a1)
01:00.2 USB controller: NVIDIA Corporation TU116 USB 3.1 Host Controller (rev a1)
01:00.3 Serial bus controller: NVIDIA Corporation TU116 USB Type-C UCSI Controller (rev a1)
02:00.1 Audio device: NVIDIA Corporation TU116 High Definition Audio Controller (rev a1)
02:00.2 USB controller: NVIDIA Corporation TU116 USB 3.1 Host Controller (rev a1)
02:00.3 Serial bus controller: NVIDIA Corporation TU116 USB Type-C UCSI Controller (rev a1)
05:00.1 Audio device: NVIDIA Corporation TU116 High Definition Audio Controller (rev a1)
05:00.2 USB controller: NVIDIA Corporation TU116 USB 3.1 Host Controller (rev a1)
05:00.3 Serial bus controller: NVIDIA Corporation TU116 USB Type-C UCSI Controller (rev a1)
06:00.1 Audio device: NVIDIA Corporation TU116 High Definition Audio Controller (rev a1)
06:00.2 USB controller: NVIDIA Corporation TU116 USB 3.1 Host Controller (rev a1)
06:00.3 Serial bus controller: NVIDIA Corporation TU116 USB Type-C UCSI Controller (rev a1)

Информацию обо всех PCI-E устройствах nvidia можно командой:
lspci -nn | grep -i nvidia

На компьютере с четырьмя видеокартами Nvidia из ресурса PCI-E на USB и аудио расходуется 12 (!) дополнительных функций. Это значительно снижает итак невысокую скорость обмена данными, важную для инференса.
В связи с этим вызывает интерес отключение USB‑контроллеров и аудиоподдержки на видеокартах. Это можно сделать, запретив загрузку драйвера аудио Nvidia, и, отключив модули xhci_pci и xhci_hcd видеокарт.
Отключение аудио и USB-модулей видеокарт Nvidia в linux
Операционная система Gentoo позволяет гибко настроить систему через конфигурацию ядра, модули и udev-правила. Самый надёжный и универсальный способ для multi-GPU — использование udev-правил, которые автоматически удаляют ненужные PCI-функции видеокарт при их обнаружении.
Чтобы их использовать, создаем файл 80-nvidia-remove.rules:
sudo nano /etc/udev/rules.d/80-nvidia-remove.rules
Вносим в него команды отключения USB-устройств, а также аудиовыходов для всех GPU (универсальный вариант, который отключает USB и аудио на всех картах, кроме 01:00.1):
# USB xHCI Host Controller (VirtualLink)
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{power/control}="auto", ATTR{remove}="1"
# USB Type-C UCSI Controller
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{power/control}="auto", ATTR{remove}="1"
# HDMI/DP Audio (кроме основной карты с монитором)
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", KERNEL!="0000:01:00.1", ATTR{power/control}="auto", ATTR{remove}="1"
#или отключение всех nvidia аудио (раскомментировать здесь и закомментировать включение для GPU в строке выше):
#ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x040300", ATTR{power/control}="auto", ATTR{remove}="1"
Можно задать команды отключения аудио отдельно по видеокартам, используя их PCI-адреса из команды:
lspci | grep -E "Audio|High Definition|HDMI"| grep -i nvidia
01:00.1 Audio device: NVIDIA Corporation TU116 High Definition Audio Controller (rev a1)
02:00.1 Audio device: NVIDIA Corporation TU116 High Definition Audio Controller (rev a1)
05:00.1 Audio device: NVIDIA Corporation TU116 High Definition Audio Controller (rev a1)
06:00.1 Audio device: NVIDIA Corporation TU116 High Definition Audio Controller (rev a1)

В этом случае файл /etc/udev/rules.d/80-nvidia-remove.rules будет таким:
# USB xHCI (VirtualLink)
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c0330", ATTR{power/control}="auto", ATTR{remove}="1"
# USB Type-C UCSI
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x10de", ATTR{class}=="0x0c8000", ATTR{power/control}="auto", ATTR{remove}="1"
# Отключение Audio device (HDMI/DP audio) для видеокарт, не подключенных к монитору
ACTION=="add", KERNEL=="0000:02:00.1", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:02:00.1/remove'"
ACTION=="add", KERNEL=="0000:05:00.1", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:05:00.1/remove'"
ACTION=="add", KERNEL=="0000:06:00.1", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:06:00.1/remove'"

Можно вообще задать по отдельности отключение неиспользуемых PCI-E устройств, задав их точные адреса, например, так:
ACTION=="add", KERNEL=="0000:01:00.2", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:01:00.2/remove'"
ACTION=="add", KERNEL=="0000:01:00.3", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:01:00.3/remove'"
ACTION=="add", KERNEL=="0000:02:00.1", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:02:00.1/remove'"
ACTION=="add", KERNEL=="0000:02:00.2", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:02:00.2/remove'"
ACTION=="add", KERNEL=="0000:02:00.3", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:02:00.3/remove'"
ACTION=="add", KERNEL=="0000:05:00.1", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:05:00.1/remove'"
ACTION=="add", KERNEL=="0000:05:00.2", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:05:00.2/remove'"
ACTION=="add", KERNEL=="0000:05:00.3", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:05:00.3/remove'"
ACTION=="add", KERNEL=="0000:06:00.1", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:06:00.1/remove'"
ACTION=="add", KERNEL=="0000:06:00.2", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:06:00.2/remove'"
ACTION=="add", KERNEL=="0000:06:00.3", SUBSYSTEM=="pci", RUN+="/bin/sh -c 'echo 1 > /sys/bus/pci/devices/0000:06:00.3/remove'"
Перезагружаем udev и систему (для gentoo):
sudo udevadm control --reload-rules && sudo udevadm trigger
sudo genkernel --install initramfs # или dracut -f
sudo grub-mkconfig -o /boot/grub/grub.cfg
sudo reboot
Проверяем применение заданных установок командами
lspci | grep -E "USB|Audio" | grep -i nvidia
lsmod | grep -E "xhci|snd_hda"
dmesg | grep -E "remove|NVIDIA"

Благодаря этим действиям освобождаются ресурсы шины PCI-E (до 11–12 дополнительных функций), что положительно сказывается на пропускной способности при обмене данными между GPU в multi-GPU инференсе и увеличивает стабильность работы компьютера.


