AI и DIY,  Майнинг,  Статьи

Отключение 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 инференсе и увеличивает стабильность работы компьютера.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *