Настройка подключения GPU и vGPU видеокарт Nvidia к виртуальной машине (zVirt 4.X)

Аннотация

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

  1. nouveau - проект по созданию свободных драйверов для видеокарт компании Nvidia с поддержкой ускорения трёхмерной графики.

  2. GPU - отдельное устройство персонального компьютера или игровой приставки, выполняющее графический рендеринг.

  3. vGPU - это технология ускорения графики, которая обеспечивает разделение ресурсов одного графического процессора между несколькими ВМ.

  4. IOMMU - блок управления памятью для операций ввода-вывода. Так же как традиционный, процессорный блок управления памятью, который переводит виртуальные адреса, видимые процессором в физические, этот блок занимается трансляцией виртуальных адресов, видимых аппаратным устройством, в физические адреса.

1. Предисловие

zVirt поддерживает технологию PCI VFIO (виртуальная функция ввода/вывода, Virtual Function I/O), для некоторых графических процессоров NVIDIA на базе PCIe в качестве не-VGA графических устройств.

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

ВМ с подключенным GPU подходят для выполнения графически интенсивных задач и для запуска программного обеспечения, которое не может работать без GPU, например, CAD.

Информацию о точном количестве хостовых GPU, которые можно передавать одной виртуальной машине, смотрите на сайте NVIDIA.

Вы можете назначить GPU виртуальной машине одним из следующих способов:

  • GPU passthrough: можно назначить GPU хоста напрямую пробросив его виртуальной машине, чтобы виртуальная машина, а не хост, использовала GPU.

  • Virtual GPU (vGPU): Вы можете разделить физическое устройство GPU на одно или несколько виртуальных устройств, называемых промежуточными устройствами. Затем эти промежуточные устройства можно назначить одной или нескольким виртуальным машинам в качестве виртуальных GPU. Эти виртуальные машины совместно используют производительность одного физического GPU. Для некоторых GPU только одно промежуточное устройство может быть назначено ВМ. Поддержка vGPU доступна только для некоторых NVIDIA GPU.

Прямой проброс GPU можно использовать вместе с NVIDIA vGPU, но с некоторыми ограничениями:

  • Физический GPU может быть разделён на vGPU или напрямую пробрасываться в ВМ, но не может выполнять обе функции одновременно.

  • Одна ВМ не может быть одновременно настроена на vGPU и прямой проброс GPU.

  • Производительность физического GPU, переданного в ВМ, можно отслеживать только из самой ВМ. Такой GPU нельзя отслеживать с помощью инструментов, работающих через гипервизор, например, nvidia-smi (см. раздел Мониторинг графических процессоров NVIDIA).

Для настройки хоста с GPU с возможностью оперативного переключения между режимами прямого проброса (GPU passthrough) и vGPU необходимо выполнить следующее:

  1. Включить IOMMU на хосте.

  2. Заблокировать драйвер Nouveau на хосте

  3. Получить и установить драйвер NVIDIA vGPU на хосте.

  4. Подключить GPU или vGPU к виртуальной машине.

  5. Установить драйверы GPU на виртуальной машине.

  6. Настроить Xorg на виртуальной машине (только для Linux).

Здесь и далее под "хостом" понимается хост с GPU.

Эти шаги подробно описаны ниже.

Предварительные требования
  • Ваше GPU-устройство поддерживает режим GPU passthrough.

  • Ваше GPU-устройство поддерживает функции виртуального графического процессора (vGPU)

  • Ваша система входит в список проверенных серверных аппаратных платформ.

  • Чипсет хоста с пробрасываемым GPU поддерживает Intel VT-d или AMD-Vi.

Более подробную информацию о поддерживаемом оборудовании и ПО смотрите в разделе Проверенные платформы в информации о выпуске NVIDIA GPU Software Release Notes.

2. Подготовка хоста

Подготовка хоста включает следующие операции:

  1. Настройка параметров ядра:

    1. Включение IOMMU.

    2. Блокировка драйвера Nouveau.

  2. Получение и установка драйвера NVIDIA vGPU на хосте.

Порядок действий:
  1. Переведите хост с GPU в режим обслуживания:

    1. На портале администрирования перейдите Ресурсы  Хосты.

    2. Выделите нужный хост и нажмите Управление > Обслуживание и нажмите OK.

  2. Настройте необходимые параметры ядра:

    1. Активируйте проброс устройств:

      Вариант 1
      1. На портале администрирования перейдите Ресурсы  Хосты.

      2. Выделите нужный хост и нажмите Изменить.

      3. Перейдите на вкладку Ядро.

      4. Активируйте опцию Passthrough устройств хоста и SR-IOV и нажмите OK.

      Убедитесь, что опция Заблокировать Nouveau неактивна и в поле Командная строка ядра отсутствует параметр rdblacklist=iommu.
      Вариант 2
      1. Подключитесь к хосту по SSH и авторизуйтесь.

      2. С помощью команды конфигурации загрузчика добавьте параметр активации IOMMU (зависит от процессора):

        • Для Intel:

          grubby --update-kernel=ALL --args="intel_iommu=on"
        • Для AMD:

          grubby --update-kernel=ALL --args="amd_iommu=on"
    2. Заблокируйте драйвер Nouveau:

      1. Подключитесь к хосту по SSH и авторизуйтесь.

      2. С помощью команды конфигурации загрузчика добавьте параметр блокировки Nouveau:

        grubby --update-kernel=ALL --args="nouveau.modeset=0"
  3. Переустановите хост:

    1. На портале администрирования перейдите Ресурсы  Хосты.

    2. Выделите нужный хост и нажмите Настройки > Переустановить

    3. По окончании процесса хост перезагрузится и должен автоматически перейти в статус Включено.

  4. Загрузите и установите драйвер NVIDIA-vGPU. Информацию о получении драйвера см. на странице драйверов vGPU на веб-сайте NVIDIA. Для загрузки драйверов необходима учетная запись Nvidia. Если он недоступен, обратитесь к поставщику оборудования.

    В zVirt Node используется релиз ядра el8 с архитектурой x86_64, поэтому наиболее подходящим будет драйвер для RHEL 8.8, например, NVIDIA-vGPU-rhel-8.8-535.54.06.x86_64.rpm.
  5. Разархивируйте скачанный с сайта Nvidia архив и скопируйте rpm-пакет драйвера (как правило лежит в каталоге Host_Drivers) на хост.

  6. Переведите хост с GPU в режим обслуживания:

    1. На портале администрирования перейдите Ресурсы  Хосты.

    2. Выделите нужный хост и нажмите Управление > Обслуживание и нажмите OK.

  7. Установите драйвер (например, NVIDIA-vGPU-rhel-8.8-535.54.06.x86_64.rpm)

    dnf install NVIDIA-vGPU-rhel-8.8-535.54.06.x86_64.rpm
  8. Перезагрузите хост:

    reboot
  9. Выведите хост из режима обслуживания.

    1. На портале администрирования перейдите Ресурсы  Хосты.

    2. Выделите нужный хост и нажмите Управление > Включить.

  10. Убедитесь, что IOMMU активирован:

    1. На портале администрирования перейдите Ресурсы  Хосты.

    2. Нажмите на имя нужного хоста для перехода в подробное представление.

    3. На вкладке Общее проверьте статус параметра Passthrough устройств. Ожидаемый статус Включено.

      iommu on
  11. Проверьте, что ядро ​​загрузило модуль nvidia_vgpu_vfio:

    lsmod | grep nvidia_vgpu_vfio
    Пример 1. Ожидаемый вывод lsmod
    # lsmod | grep nvidia_vgpu_vfio
    nvidia_vgpu_vfio       61440  0
    mdev                   24576  2 vfio_mdev,nvidia_vgpu_vfio
    kvm                   950272  2 nvidia_vgpu_vfio,kvm_intel
    vfio                   36864  4 vfio_mdev,nvidia_vgpu_vfio,vfio_iommu_type1,vfio_pci
    irqbypass              16384  3 nvidia_vgpu_vfio,vfio_pci,kvm
  12. Убедитесь, что запущена служба nvidia-vgpu-mgr.service:

    systemctl status nvidia-vgpu-mgr.service
    Пример 2. Ожидаемый статус службы
    # systemctl status nvidia-vgpu-mgr.service
    ● nvidia-vgpu-mgr.service - NVIDIA vGPU Manager Daemon
       Loaded: loaded (/usr/lib/systemd/system/nvidia-vgpu-mgr.service; enabled; vendor preset: disabled)
       Active: active (running) since Wed 2023-12-13 17:37:57 MSK; 22min ago
      Process: 4293 ExecStart=/usr/bin/nvidia-vgpu-mgr (code=exited, status=0/SUCCESS)
     Main PID: 4300 (nvidia-vgpu-mgr)
     [...]
  13. Убедитесь что на хосте для GPU используется драйвер nvidia:

    1. На портале администрирования перейдите Ресурсы  Хосты.

    2. Нажмите на имя нужного хоста для перехода в подробное представление.

    3. На вкладке Устройства хоста найдите устройство видеокарты и убедитесь, что в столбце Драйвер установлено значение nvidia.

      nvidia drv
      Также, при корректной настройке, в поле Типы Mdev отобразятся доступные типы промежуточных устройств.

3. Присоединение графического процессора к виртуальной машине

3.1. Проброс GPU в виртуальную машину

Перед включением проброса GPU убедитесь, что vGPU этого графического процессора не назначены никаким ВМ. Если такие ВМ существуют, отключите vGPU от них.
Порядок действий:
  1. Для выбранной ВМ установите параметр запуска на определённом хосте. Для этого

    1. Перейдите Ресурсы  Виртуальные машины.

    2. Выделите нужную ВМ и нажмите Изменить.

    3. Откройте вкладку Хост.

    4. Активируйте опцию Запустить на: указанном хосте и в меню выберите хост, GPU которого необходимо присоединить к ВМ.

      assigned host
    5. Нажмите OK

  2. Добавьте GPU в ВМ. Для этого:

    1. Нажмите на имя ВМ для перехода в подробное представление.

    2. Перейдите на вкладку Устройства хоста и нажмите Добавить устройство.

    3. В меню Хост выберите хост, GPU которого необходимо присоединить к ВМ.

    4. В списке Доступные устройства хоста найдите и выберите видеокарту.

    5. Нажмите add pci dev для добавления видеокарты к списку подключаемых устройств.

      pass gpu
    6. Нажмите OK.

3.2. Отключение GPU хоста от виртуальной машины

Если GPU больше не требуется для виртуальной машины, либо требуется использовать vGPU, его можно отключить.

Порядок действий:
  1. Перейдите в Ресурсы  Виртуальные машины.

  2. Выключите ВМ с прикреплённым GPU.

  3. Нажмите на имя ВМ для перехода в подробное представление.

  4. Перейдите на вкладку Устройства хоста.

  5. Выделите GPU, нажмите Удалить устройство, а затем OK.

3.3. Добавление vGPU к виртуальной машине

Перед добавлением vGPU к ВМ убедитесь, что GPU не проброшен напрямую ни в какую ВМ. Если такая ВМ существует, отключите GPU от неё.
Порядок действий:
  1. Для выбранной ВМ установите параметр запуска на определённом хосте. Для этого

    1. Перейдите Ресурсы  Виртуальные машины.

    2. Выделите нужную ВМ и нажмите Изменить.

    3. Откройте вкладку Хост.

    4. Активируйте опцию Запустить на: указанном хосте и в меню выберите хост с GPU.

      assigned host
    5. Нажмите OK

  2. Нажмите на имя виртуальной машины, чтобы перейти к подробному представлению.

  3. Откройте вкладку Устройства хоста или Устройства ВМ.

  4. Нажмите Управление vGPU. Откроется диалоговое окно Управление vGPU.

  5. Выберите тип vGPU и количество экземпляров, которые вы хотите использовать с этой виртуальной машиной.

    vgpu select

    Для изменения количества экземпляров используйте кнопки Добавить экземпляр и Удалить экземпляр.

    vgpu edit
    Не все GPU поддерживают назначение нескольких экземпляров vGPU одной ВМ.
  6. Переведите переключатель Адаптер вторичного дисплея для VNC в состояние Включен, чтобы добавить второй эмулируемый графический адаптер QXL или VGA в качестве основного графического адаптера для консоли в дополнение к vGPU.

  7. В поле Optional driver parameters можно ввести параметры драйвера, передаваемые на все экземпляры vGPU виртуальной машины. Например, для включения Nvidia Unified Memory введите enable_uvm=1.

  8. Нажмите Сохранить.

3.4. Удаление устройств NVIDIA vGPU

Чтобы изменить конфигурацию назначенных устройств с поддержкой vGPU, необходимо удалить существующие устройства из соответствующих гостевых ОС.

Порядок действий:
  1. На портале администрирования нажмите Ресурсы  Виртуальные машины.

  2. Нажмите на имя виртуальной машины, чтобы перейти к подробному представлению.

  3. Откройте вкладку Устройства хоста или Устройства ВМ.

  4. Нажмите Управление vGPU. Откроется диалоговое окно Управление vGPU.

  5. Нажмите x рядом с надписью Выбранные экземпляры типа vGPU, чтобы отсоединить vGPU от виртуальной машины.

  6. Нажмите Сохранить.

4. Установка драйвера графического процессора на виртуальной машине

Порядок действий:
  1. Запустите виртуальную машину и подключитесь к ней с помощью консоли VNC или SPICE.

  2. Загрузите драйвер на виртуальную машину. Информацию о получении драйвера см. на странице Драйверы на веб-сайте NVIDIA.

  3. Установите в гостевую ОС подходящий драйвер GPU, следуя инструкциям в разделе Установка программного графического драйвера NVIDIA vGPU в документации к программному обеспечению NVIDIA.

    Процесс установки программного графического драйвера NVIDIA vGPU зависит от используемой гостевой ОС. Но для любой ОС процесс установки драйвера одинаков как для ВМ, настроенной на vGPU, так и для ВМ, работающей с проброшенным GPU.
    Только для Linux: при установке драйвера в гостевой операционной системе Linux вам будет предложено обновить xorg.conf. Если вы не обновите xorg.conf во время установки, вам придется обновить его вручную.
  4. После завершения установки драйвера перезагрузите ВМ. Для виртуальных машин Windows полностью выключите ВМ на портале администрирования или пользовательском портале, а не из гостевой операционной системы.

    Только для Windows: выключение виртуальной машины из гостевой операционной системы Windows иногда переводит виртуальную машину в спящий режим, при этом память не очищается полностью, что может привести к последующим проблемам. Использование портала администрирования или пользовательском портале для выключения виртуальной машины приводит к полной очистке памяти.
  5. Запустите виртуальную машину и подключитесь к ней, используя один из поддерживаемых протоколов удаленного рабочего стола и убедитесь, что GPU/vGPU доступен, открыв панель управления NVIDIA. В Windows вы также можете открыть диспетчер устройств Windows. Виртуальный графический процессор должен появиться в разделе Видеоадаптеры. Дополнительную информацию см. в разделе Программный графический драйвер NVIDIA vGPU в документации к программному обеспечению NVIDIA Virtual GPU.

    system info
  6. Настройте лицензирование гостевого программного обеспечения NVIDIA vGPU для каждого виртуального графического процессора и добавьте учетные данные лицензии в панели управления NVIDIA. Дополнительную информацию см. в разделе Как обеспечивается лицензирование программного обеспечения NVIDIA vGPU в документации по программному обеспечению NVIDIA Virtual GPU.

5. Обновление и включение xorg (виртуальные машины Linux)

Прежде чем вы сможете использовать графический процессор на виртуальной машине, вам необходимо обновить и включить xorg на виртуальной машине. Установка драйвера NVIDIA должна выполнить это автоматически. Проверьте, обновлен ли и включен ли xorg, просмотрев /etc/X11/xorg.conf:

cat /etc/X11/xorg.conf

Первые две строки говорят, было ли оно создано NVIDIA. Например:

cat /etc/X11/xorg.conf
nvidia-xconfig: X configuration file generated by nvidia-xconfig
nvidia-xconfig: version 390.87 (buildmeister@swio-display-x64) Tue Aug 21 17:33:38 PDT 2018

Если файл не сконфигурирован выполните описанные ниже действия.

Порядок действий:
  1. На виртуальной машине сгенерируйте файл xorg.conf с помощью следующей команды:

    X -configure
  2. Скопируйте файл xorg.conf с из текущего каталога в каталог /etc/X11/:

    cp /root/xorg.conf.new /etc/X11/xorg.conf
  3. Перезагрузите виртуальную машину.

  4. Убедитесь, что xorg обновлен и включен, просмотрев /etc/X11/xorg.conf:

    cat /etc/X11/xorg.conf

    Найдите раздел Device. Вы должны увидеть запись, подобную следующей:

    Section "Device"
        Identifier     "Device0"
        Driver         "nvidia"
        VendorName     "NVIDIA Corporation"
    EndSection

Теперь графический процессор назначен виртуальной машине.

6. Мониторинг графических процессоров NVIDIA

NVIDIA System Management Interface, nvidia-smi - это инструмент командной строки, который сообщает информацию об управлении графическими процессорами NVIDIA.

Инструмент nvidia-smi входит в следующие пакеты:

  • Пакет NVIDIA Virtual GPU Manager для хоста;

  • Пакет драйверов NVIDIA для поддерживаемой гостевой ОС

Объем предоставляемой информации об управлении зависит от того, откуда вы запустили nvidia-smi:

  • Из командной оболочки хоста nvidia-smi сообщает информацию об управлении физическими и виртуальными GPU NVIDIA, присутствующими в системе.

    При запуске из командной оболочки хоста nvidia-smi не отобразит GPU, которые в данный момент работают в режиме GPU passthrough.
  • Из гостевой ВМ nvidia-smi извлекает статистику использования vGPU или напрямую проброшенных GPU, назначенных ВМ.

Для получения дополнительной информации см. Интерфейс управления системой NVIDIA nvidia-smi в документации по программному обеспечению NVIDIA Virtual GPU.

Пример 3. Вывод nvidia-smi
# nvidia-smi
Wed Dec 13 18:30:31 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.199.03   Driver Version: 470.199.03   CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            On   | 00000000:98:00.0 Off |                    0 |
| N/A   51C    P8    18W /  70W |   7635MiB / 15359MiB |      1%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A     13992    C+G   vgpu                             7552MiB |
+-----------------------------------------------------------------------------+