Подключение NVIDIA Tesla A2 к виртуальной машине Proxmox
Роман Лихачев |
28 декабря 2022
5347

Подключение NVIDIA Tesla A2 к виртуальной машине Proxmox

Буквально недавно мы с коллегами выполняли подключение NVIDIA Tesla A2 к виртуальной машине на сервере Proxmox. И, как показала практика, далеко не все шаги такие очевидные и документированные. По крайней мере в нашем окружении - с нашим сервером HP и нашей версией Proxmox. В ходе диагностики проблем с подключением мы получили интересный опыт и решили поделиться этим опытом с вами.

Зачем нужна такая карточка? Думаю, если вы нашли эту статью, то вы знаете зачем. Для остальных читателей приведу краткий ответ - эта графическая карта используется при расчетах, например, в машинном обучении (ML). Карточка содержит тензорные ядра, которые значительно ускоряют процесс расчета математических моделей.

Описание окружения

Вначале мы приведем описание нашего окружения. Вполне возможно, что в вашем окружении (например, при использовании более свежего поколения сервера) часть шагов уже будет не актуальна. Однако, в целом последовательность шагов будет практически идентичная.

Вот то окружение, которое мы использовали.

Компонент

Описание

Графический адаптер NVIDIA Tesla A2 (Vbios 94.07.5B.00.55)
Драйвер графического адаптера NVIDIA 525.60.13
Физический сервер HP DL360 G8 (2 x Intel Xeon E5-2670 v2)
Гипервизор Proxmox Virtual Environment 7.3-3 (ядро 5.15.74)
Гостевая операционная система Ubuntu Desktop 22.04.1 LTS

Краткая последовательность шагов

Итак, нужно будет выполнить следующее:

1. Подготовить физический сервер - установить графический адаптер и внести некоторые изменения в параметрах BIOS.

2. Подготовить сервер Proxmox.

3. Создать виртуальную машину с нужными параметрами. В частности, с настроенным пробросом PCI устройства.

4. Выполнить подготовку гостевой операционной системы. Например, нужно будет установить драйвера NVIDIA для Tesla A2.

1. Подготовка на физическом сервере

Пожалуй, это был самый сложный шаг. Потому что много приходилось подбирать вручную. Практически все проблемы, с которыми мы столкнулись в процессе настройки, в итоге были вызваны тем, что BIOS сервера не был включен тот или иной параметр.

Но обо всем по порядку.

1.1 Установка видеокарты

Самый первый шаг - установка графического адаптера на сервер. Сервер HP DL360 G8 поддерживает установку до двух PCI-E устройств через райзер плату.

Демонтируем райзер плату с сервера. Выбираем любой свободный PCI-E слот.


И подключаем карточку.


Подключаем райзер плату вместе с графическим адаптером обратно на материнскую плату сервера.


Убедимся, что сервер Proxmox видит нашу карточку:

lspci | grep -i nvidia
lspci | grep -i nvidia
04:00.0 3D controller: NVIDIA Corporation Device 25b6 (rev a1)
 

1.2 Настройка BIOS

Теперь нужно перейти в настройки BIOS самого сервера. Нужно включить две опции:

  1. SR-IOV.
  2. PCI Express 64-bit BAR Support.

Если вы не включите SR-IOV, то при старте виртуальной машины Proxmox с проброшенным PCI устройством будет генерироваться ошибка "kvm: -device vfio-pci,host=0000:04:00.0,id=hostpci0,bus=ich9-pcie-port-1,addr=0x0: vfio 0000:04:00.0: hardware reports invalid configuration, MSIX PBA outside of specified BAR TASK ERROR: start failed: QEMU exited with code 1".

Если вы не включите PCI Express 64-bit BAR Support, то в гостевой операционной системе в журналах ядра (dmesg) будет генерироваться ошибка "This PCI I/O region assigned to your NVIDIA device is invalid". А при запросе устройств NVIDIA будет генерироваться ошибка "NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver".

Что нужно сделать:

1. Зайти в настройки BIOS сервера.

2. Перейти в раздел "Advanced Options" > "SR-IOV". Включить опцию SR-IOV.

3. Вернуться на начальный экран настроек BIOS. Нажать Ctrl + A для активации сервисных опций.

4. Перейти в раздел "Service Options" > "PCI Express 64-bit BAR Support". Включить опцию PCI Express 64-bit BAR Support.

5. Убедиться, что внесенные изменения сохранены и перезагрузить сервер.

2. Настройка сервера Proxmox

Настройку проброса PCI устройства будем выполнять в соответствии с официальным руководством.

Приступаем. Все дальнейшие команды из этого раздела выполняются в консоли сервера Proxmox:

1. Включаем IOMMU:

nano /etc/default/grub

Поскольку на нашем сервер процессор Intel, то в параметры загрузки ядра необходимо передать опцию intel_iommu=on. Дополнительно в процессе отладки мы выяснили, что нужно передавать еще ряд опций:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt"

В некоторых случая может потребоваться редактирование конфигурационного файла  nano /etc/kernel/cmdline для включения дополнительных параметров. Например, с этим мы столкнули при настройке карточек на HP Z8 G4. В таком случае дополнительно необходимо выполнить следующее:

a. Отредактировать файл с параметрами ядра:

nano /etc/kernel/cmdline

b. Добавляем следующие параметры:


c. Обновляем параметры загрузки:

proxmox-boot-tool refresh

2. Обновляем конфигурацию GRUB:

update-grub
3. Перезагружаем сервер и смотрим журнал ядра:
dmesg | grep -e DMAR -e IOMMU
Если опция IOMMU работает корректно, то вы должны увидеть сообщение вида "DMAR: IOMMU enabled".
dmesg | grep -e DMAR -e IOMMU
[    0.000000] Warning: PCIe ACS overrides enabled; This may allow non-IOMMU protected peer-to-peer DMA
[    0.017765] ACPI: DMAR 0x00000000BDDAD200 0004E0 (v01 HP     ProLiant 00000001 \xd2?   0000162E)
[    0.017919] ACPI: Reserving DMAR table memory at [mem 0xbddad200-0xbddad6df]
[    0.867585] DMAR: IOMMU enabled
[    2.124108] DMAR: Host address width 46
[    2.124110] DMAR: DRHD base: 0x000000fbefe000 flags: 0x0
[    2.124123] DMAR: dmar0: reg_base_addr fbefe000 ver 1:0 cap d2078c106f0466 ecap f020de
[    2.124129] DMAR: DRHD base: 0x000000f3ffe000 flags: 0x1
[    2.124136] DMAR: dmar1: reg_base_addr f3ffe000 ver 1:0 cap d2078c106f0466 ecap f020de
[    2.124140] DMAR: RMRR base: 0x000000bdffd000 end: 0x000000bdffffff
[    2.124147] DMAR: RMRR base: 0x000000bdff6000 end: 0x000000bdffcfff
[    2.124150] DMAR: RMRR base: 0x000000bdf83000 end: 0x000000bdf84fff
[    2.124153] DMAR: RMRR base: 0x000000bdf7f000 end: 0x000000bdf82fff
[    2.124156] DMAR: RMRR base: 0x000000bdf6f000 end: 0x000000bdf7efff
[    2.124158] DMAR: RMRR base: 0x000000bdf6e000 end: 0x000000bdf6efff
[    2.124161] DMAR: RMRR base: 0x000000000f4000 end: 0x000000000f4fff
[    2.124165] DMAR: RMRR base: 0x000000000e8000 end: 0x000000000e8fff
[    2.124168] DMAR: [Firmware Bug]: No firmware reserved region can cover this RMRR [0x00000000000e8000-0x00000000000e8fff], contact BIOS vendor for fixes
[    2.124249] DMAR: [Firmware Bug]: Your BIOS is broken; bad RMRR [0x00000000000e8000-0x00000000000e8fff]
[    2.124254] DMAR: RMRR base: 0x000000bddde000 end: 0x000000bdddefff
[    2.124256] DMAR: ATSR flags: 0x0
[    2.124262] DMAR-IR: IOAPIC id 10 under DRHD base  0xfbefe000 IOMMU 0
[    2.124267] DMAR-IR: IOAPIC id 8 under DRHD base  0xf3ffe000 IOMMU 1
[    2.124270] DMAR-IR: IOAPIC id 0 under DRHD base  0xf3ffe000 IOMMU 1
[    2.124273] DMAR-IR: HPET id 0 under DRHD base 0xf3ffe000
[    2.124276] DMAR-IR: x2apic is disabled because BIOS sets x2apic opt out bit.
[    2.124277] DMAR-IR: Use 'intremap=no_x2apic_optout' to override the BIOS setting.
[    2.125602] DMAR-IR: Enabled IRQ remapping in xapic mode
[    2.805725] DMAR: No SATC found
[    2.805732] DMAR: dmar0: Using Queued invalidation
[    2.805751] DMAR: dmar1: Using Queued invalidation
[    2.817163] DMAR: Intel(R) Virtualization Technology for Directed I/O
[    5.810883] DMAR: DRHD: handling fault status reg 2
[    5.810966] DMAR: [INTR-REMAP] Request device [01:00.0] fault index 0x60 [fault reason 0x26] Blocked an interrupt request due to source-id verification failure

4. Теперь убедимся, что нужные модули будут загружены:

nano /etc/modules

В списке должны быть следующие модули:

vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

Если каких-то модулей нет, то добавьте их.

5. Удостоверимся, что IOMMU Interrupt Remapping работает корректно.

dmesg | grep 'remapping'
В случае корректно работы OMMU Interrupt Remapping должна присутствовать строка "DMAR-IR: Enabled IRQ remapping in xapic mode".
dmesg | grep 'remapping'
[    2.125602] DMAR-IR: Enabled IRQ remapping in xapic mode
[    2.125606] x2apic: IRQ remapping doesn't support X2APIC mode

6. Для того, чтобы проброс PCI устройства в виртуальную машину работал корректно необходимо, чтобы для пробрасываемого устройства была создана отдельная IOMMU группа. С вашей стороны для этого ничего не требуется, но вот ядро ОС должно поддерживать такую возможность. Проверим есть ли такая поддержка (номер группы PCI при фильтрации через grep можете подсмотреть через lspci):

find /sys/kernel/iommu_groups/ -type l | grep 04:00.0
lspci | grep -i nvidia
04:00.0 3D controller: NVIDIA Corporation Device 25b6 (rev a1)
find /sys/kernel/iommu_groups/ -type l | grep 04:00.0
/sys/kernel/iommu_groups/32/devices/0000:04:00.0

На этом настройка непосредственно сервера Proxmox завершена.

3. Настройка виртуальной машины Proxmox

После того как мы завершили настройки гипервизора Proxmox можем перейти к созданию виртуальной машины.

Для работы с ML нами был выбран дистрибутив Ubuntu Desktop 22.04.1 LTS.

Касательно параметров виртуальной машины нет каких-то особых секретов. Штатная процедура создания виртуальной машины в Proxmox не должна вызывать у вас какич-то сложностей. Однако, есть пара моментов касательно конфигурации виртуальной машины, которые я приведу в таблице ниже.

Параметр

Значение
BIOS SeaBIOS
Machine q35
PCI Device Type PCI-Express

Скриншот конфигурации нашей виртуальной машины.


Также обратите внимание на параметры конфигурации добавленного PCI устройства.


Как найти номер PCI устройства - я уже приводил пример выше через утилиту lspci и grep.

4. Настройка гостевой операционной системы

В самой гостевой операционной системе нам необходимо установить соответствующий драйвер NVIDIA. Именно для видеокарты Tesla A2.

Устанавливаем драйвер:

apt install nvidia-driver-525
Устанавливаем утилиты NVIDIA:
apt install nvidia-utils-525
Проверим версию драйвера:
nvidia-settings -q NvidiaDriverVersion

5. Проверка работы

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

Есть специальная утилита - nvidia-smi. Вызвав эту утилиту без параметров, можно определить всю необходимую нам информацию:

nvidia-smi

Как видно из скриншота выше адаптер доступен для операционной системы. Также на скриншоте отображается информация о версии драйвера графического адаптера и версии CUDA.

Если вы видите подобную информацию, то значит и у вас все получилось. Подключение NVIDIA Tesla A2 к виртуальной машине на сервере Proxmox завершено.

Заключение

Почему мы с коллегами вообще решили вынести этот материал в отдельную публикацию? Потому что на пути настройки проброса адаптера в виртуальную машину пришлось собрать много граблей... По большей части эти грабли были связаны с настройками BIOS физического сервера. Скорее всего в силу его не первой свежести. Возможно, на более свежих поколениях серверов адаптер получится подключить и без доп. настроек BIOS.

Вторая причина, по которой мы публикуем эту статью - собрать в одном месте все шаги. Чтобы была некая шпаргалка на случай, если мы будем подключать еще одну карточку.

Ну, и последняя причина - мы привыкли делиться опытом. Типовых публикация вида "как установить Ubuntu" на просторах сети интернет много. И особого смысла публиковать подобный материал нет. Но вот по пробросу NVIDIA Tesla информации оказалось крайне мало.

Надеемся, что наш опыт будет для вас полезен. Если у вас остались какие вопросы - пишите в комментарии. Постараемся вам помочь.

Возврат к списку


Комментировать