Назначение виртуальных графических процессоров (zVirt 3.X)
В этом документе описывается, как разделить одну видеокарту NVIDIA (с графическим процессором (GPU)), размещенную на хосте, на несколько видеокарт (vGPU). Данная процедура необходима для запуска множества виртуальных машин в zVirt (на одной физической видеокарте) для выполнения графически требовательных задач и программного обеспечения, которое не может работать без GPU.
-
nouveau - проект по созданию свободных драйверов для видеокарт компании Nvidia с поддержкой ускорения трёхмерной графики.
-
GPU - отдельное устройство персонального компьютера или игровой приставки, выполняющее графический рендеринг.
-
vGPU - это технология ускорения графики, которая обеспечивает разделение ресурсов одного графического процессора между несколькими ВМ.
-
IOMMU - блок управления памятью для операций ввода-вывода. Так же как традиционный, процессорный блок управления памятью, который переводит виртуальные адреса, видимые процессором в физические, этот блок занимается трансляцией виртуальных адресов, видимых аппаратным устройством, в физические адреса.
1. Предисловие
Установка карт NVIDIA на физических серверах, работающей на основе zVirt обеспечивает высокую производительность графических возможностей приложений по сравнению с возможностями сред без аппаратного ускорения. Эта технология идеально подходит для сценариев использования, связанных с большим объемом графических данных, например в работе дизайнеров, архитекторов, инженеров, в области высшего образования, в нефтегазовой промышленности, в здравоохранении, а также в работе привилегированных пользователей, которым требуется доступ к интерфейсам двухмерных и трехмерных графических данных.
В данном руководстве будет рассмотрен режим vGPU (Virtual GPU). Вы можете разделить физическое устройство GPU на одно или несколько виртуальных устройств, называемых опосредованными устройствами. Затем эти опосредованные устройства можно назначить одной или нескольким виртуальным машинам в качестве виртуальных GPU. Эти виртуальные машины совместно используют производительность одного физического GPU. Для некоторых GPU только одно опосредованное устройство может быть назначено одному гостю. Поддержка vGPU доступна только для некоторых NVIDIA GPU.
У хоста есть четыре GPU. Каждый GPU может поддерживать до 16 vGPU, в общей сложности 64 vGPU. Возможны следующие варианты назначения vGPU:
одна виртуальная машина с 64 vGPU 64 виртуальные машины, каждая с одним vGPU 32 виртуальные машины, каждая с одним vGPU; 8 виртуальных машин, каждая с двумя vGPU; 4 виртуальные машины, каждая с четырьмя vGPU
-
Ваше GPU устройство поддерживает функциональность виртуального GPU (vGPU).
-
Ваша система входит в список проверенных серверных аппаратных платформ. Подробнее о поддерживаемых GPU и подтвержденных платформах смотрите в разделе СЕРТИФИЦИРОВАННЫЕ СЕРВЕРЫ NVIDIA vGPU.
-
Чипсет хоста поддерживает Intel VT-d или AMD-Vi.
2. Предварительные действия, выполняемые на хосте
Данная инструкция протестирована на базе zVirt 3.0 (zVirt Node). |
Для дальнейшей настройки vGPU необходимо выполнить следующие действия на хосте:
-
Включить Passthrough устройств хоста и SR-IOV.
-
Включить перераспределение PCI устройств.
-
Заблокировать драйвер Nouveau.
Рассмотрим подробнее.
-
Убедитесь, что видеокарта корректно отображается на хосте zVirt. Например, имя этого хоста host-gpu. Для этого:
-
Перейдите
. -
Нажмите на имя хоста (в примере - host-gpu) для перехода в подробное представление.
-
Перейдите на вкладку Устройства Хоста.
-
-
Переведите хост host-gpu в обслуживание. Для этого:
-
Перейдите
. -
Выделите нужный хост (в примере - host-gpu)
-
Нажмите Управление > Обслуживание.
-
-
Подключитесь по SSH к данному хосту. Выполните вывод содержимого файла /proc/cmdline. Пример вывода файла:
cat /proc/cmdline OOT_IMAGE=(hd0,msdos1)//zvirt-node-ng-3.0-0.20220410.0+1/vmlinuz-4.18.0-373.el8.x86_64 crashkernel=auto resume=/dev/mapper/znn-swap rd.lvm.lv=znn/zvirt-node-ng-3.0-0.20220410.0+1 rd.lvm.lv=znn/swap rhgb quiet root=/dev/znn/zvirt-node-ng-3.0-0.20220410.0+1 boot=UUID=d802e2a5-b7d8-4c6a-b24a-625bfd971da7 rootflags=discard img.bootid=zvirt-node-ng-3.0-0.20220410.0+1
-
Последовательно выполните две команды для внесения nouveau в список заблокированных драйверов.
grubby --update-kernel=ALL --args="rd.driver.blacklist=nouveau" grubby --update-kernel=ALL --args="nouveau.modeset=0"
-
Выполните команду, которая позволит добавлять физические устройства в гостевые ОС: режим Passthrough устройств хоста и SR-IOV. Для процессоров на базе Intel и AMD команды будут отличаться.
-
Intel
grubby --update-kernel=ALL --args="intel_iommu=on"
-
AMD
grubby --update-kernel=ALL --args="amd_iommu=on"
-
-
Выполните команду, которая позволяет осуществлять временное перераспределение ресурсов и отключает динамическое перераспределение.
grubby --update-kernel=ALL --args="pci=realloc"
-
Добавьте драйвер nouveau в blacklist. Для этого создайте файл blacklist-nouveau.conf и добавьте в него следующую информацию:
nano /etc/modprobe.d/blacklist-nouveau.conf # add to the end (create new if it does not exist) blacklist nouveau options nouveau modeset=0
-
Сгенерируйте новую конфигурацию файла grub и перезагрузитесь, выполнив команды:
dracut --force
reboot
-
После перезагрузки, проверьте, что драйвер nouveau не используется. Для этого выполните команду:
lsmod | grep nouveau
-
После перезапуска хоста, проверьте, что в файле /proc/cmdline появились добавленные ранее данные. Например:
BOOT_IMAGE=(hd0,gpt2)//zvirt-node-ng-3.0-0.20220410.0+1/vmlinuz-4.18.0-373.el8.x86_64 crashkernel=auto resume=/dev/mapper/znn-swap rd.lvm.lv=znn/zvirt-node-ng-3.0-0.20220410.0+1 rd.lvm.lv=znn/swap rhgb quiet root=/dev/znn/zvirt-node-ng-3.0-0.20220410.0+1 boot=UUID=e65ca870-eaac-439f-943a-56ed524d1e4f rootflags=discard img.bootid=zvirt-node-ng-3.0-0.20220410.0+1 rd.driver.blacklist=nouveau nouveau.modset=0 intel_iommu=on pci=realloc
3. Установка пакетов на хост
Необходимо установить дополнительные пакеты на хост. Если на сервере имеется доступ в интернет, то порядок действий будет следующим:
-
Убедитесь, что включены репозитории centos-zvirt-main и centos-zvirt-extras:
dnf repolist all
Если указанные репозитории по каким-то причинам отключены, их можно включить следующей командой
dnf config-manager --enable *zvirt*
-
При необходимости настройте доступ в репозиторий:
zvirt-credentials -u USERNAME -p PASSWORD
-
Определите, какая версия ядра используется. Для этого выполните команду
uname -a
uname -a Linux server 4.18.0-373.el8.x86_64 #1 SMP Tue Mar 22 15:11:47 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
В текущем примере используется версия на базе 4.18.0-373.el8.
-
На основе версии, выясненной на предыдущем шаге выполните команду для установки и скачивания kernel-devel и kernel-headers. Например:
dnf install kernel-devel-4.18.0-373.el8 kernel-headers-4.18.0-373.el8
-
Установите средства разработки, с помощью команды:
dnf install libglvnd-devel elfutils-libelf-devel zlib-devel gcc make --nobest
-
Скачайте пакет с драйверами для RHEL 8.6 и разместите их на сервере. Ссылка для скачивания на сайте NVIDIA (требуется регистрация).
-
Установите драйвер на хост. Для этого выполните команду
rpm -i имя_драйвера
. Например:rpm -i NVIDIA-vGPU-rhel-8.6-450.236.03.x86_64.rpm Preparing packages for installation... NVIDIA-vGPU-rhel-8.6-450.236.03
-
Выключите сторонние репозитории:
dnf config-manager --disable appstream baseos epel extras appstream-source baseos-source extras-source ha powertools
-
Перезапустите хост командой reboot.
-
Выведите хост из обслуживания. Для этого:
-
Перейдите в
-
Выделите нужный хост (в примере - host-gpu)
-
Нажмите Управление > Включить.
-
4. Проверка корректности установки
-
Убедитесь, что программный пакет NVIDIA vGPU установлен и правильно загружен, присутствуют драйвера VFIO в списке загруженных модулей ядра. Для этого выполните команду
lsmod | grep vfio
. Например:lsmod | grep vfio nvidia_vgpu_vfio 57344 0 nvidia 19804160 10 nvidia_vgpu_vfio vfio_mdev 16384 0 mdev 24576 2 vfio_mdev,nvidia_vgpu_vfio vfio_iommu_type1 36864 0 vfio 36864 3 vfio_mdev,nvidia_vgpu_vfio,vfio_iommu_type1
-
Проверьте, что сервисы libvirtd и nvidia-vgpu-mgr.service запущены.
service libvirtd status Redirecting to /bin/systemctl status libvirtd.service ● libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled) Drop-In: /etc/systemd/system/libvirtd.service.d └─unlimited-core.conf Active: active (running) since Tue 2023-05-02 16:16:17 MSK; 35min ago Docs: man:libvirtd(8) https://libvirt.org Main PID: 4257 (libvirtd) Tasks: 19 (limit: 32768) Memory: 60.3M CGroup: /system.slice/libvirtd.service └─4257 /usr/sbin/libvirtd мая 02 16:16:17 sup-2029-06.vlab.ocs.ru systemd[1]: Starting Virtualization daemon... мая 02 16:16:17 sup-2029-06.vlab.ocs.ru systemd[1]: Started Virtualization daemon.
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 Tue 2023-05-02 16:15:16 MSK; 49min ago Process: 3421 ExecStart=/usr/bin/nvidia-vgpu-mgr (code=exited, status=0/SUCCESS) Main PID: 3429 (nvidia-vgpu-mgr) Tasks: 1 (limit: 3297650) Memory: 404.0K CGroup: /system.slice/nvidia-vgpu-mgr.service └─3429 /usr/bin/nvidia-vgpu-mgr мая 02 16:15:16 sup-2029-06.vlab.ocs.ru systemd[1]: Starting NVIDIA vGPU Manager Daemon... мая 02 16:15:16 sup-2029-06.vlab.ocs.ru systemd[1]: Started NVIDIA vGPU Manager Daemon. мая 02 16:15:17 sup-2029-06.vlab.ocs.ru nvidia-vgpu-mgr[3429]: notice: vmiop_env_log: nvidia-vgpu-mgr daemon started
-
Убедитесь, что драйвер NVIDIA успешно взаимодействует с физическим GPU, выполнив команду
nvidia-smi
. Например:nvidia-smi Tue May 2 16:52:14 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.236.03 Driver Version: 450.236.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 P4 On | 00000000:D8:00.0 Off | Off | | N/A 38C P8 12W / 75W | 21MiB / 8191MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
4.1. Проблемы после установки пакета(не появились необходимые драйвера и т.д)
-
Необходим файл …vgpu-kvm.run, например, NVIDIA-Linux-x86_64-510.47.03-vgpu-kvm.run
-
Переместите его на хост в одну директорию с rpm файлом.
-
Выдайте права на запуск:
chmod +x NVIDIA-Linux-x86_64-510.47.03-vgpu-kvm.run
-
Запустите:
sh /path_to_file/NVIDIA-Linux-x86_64-510.47.03-vgpu-kvm.run
5. Добавление vGPU к виртуальной машине
-
Определите идентификаторы устройства mdev_type для vGPU. Для этого выполните на хосте команду:
vdsm-client Host hostdevListByCaps | grep -i nvidia -A 10 -B 10 "capability": "pci", "driver": "nvidia", "iommu_group": "162", "is_assignable": "true", "mdev": { "nvidia-157": { "available_instances": "4", "description": "num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=4", "name": "GRID P4-2B" }, "nvidia-214": { "available_instances": "4", "description": "num_heads=4, frl_config=45, framebuffer=2048M, max_resolution=5120x2880, max_instance=4", "name": "GRID P4-2B4" }, "nvidia-243": { "available_instances": "8", "description": "num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=8", "name": "GRID P4-1B4" }, "nvidia-288": { "available_instances": "2", "description": "num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=4096x2160, max_instance=2", "name": "GRID P4-4C" }, "nvidia-289": { "available_instances": "1", "description": "num_heads=1, frl_config=60, framebuffer=8192M, max_resolution=4096x2160, max_instance=1", "name": "GRID P4-8C" }, "nvidia-63": { "available_instances": "8", "description": "num_heads=4, frl_config=60, framebuffer=1024M, max_resolution=5120x2880, max_instance=8", "name": "GRID P4-1Q" }, "nvidia-64": { "available_instances": "4", "description": "num_heads=4, frl_config=60, framebuffer=2048M, max_resolution=7680x4320, max_instance=4", "name": "GRID P4-2Q" }, "nvidia-65": { "available_instances": "2", "description": "num_heads=4, frl_config=60, framebuffer=4096M, max_resolution=7680x4320, max_instance=2", "name": "GRID P4-4Q" }, "nvidia-66": { "available_instances": "1", "description": "num_heads=4, frl_config=60, framebuffer=8192M, max_resolution=7680x4320, max_instance=1", "name": "GRID P4-8Q" }, "nvidia-67": { "available_instances": "8", "description": "num_heads=1, frl_config=60, framebuffer=1024M, max_resolution=1280x1024, max_instance=8", "name": "GRID P4-1A" }, "nvidia-68": { "available_instances": "4", "description": "num_heads=1, frl_config=60, framebuffer=2048M, max_resolution=1280x1024, max_instance=4", "name": "GRID P4-2A" }, "nvidia-69": { "available_instances": "2", "description": "num_heads=1, frl_config=60, framebuffer=4096M, max_resolution=1280x1024, max_instance=2", "name": "GRID P4-4A" }, "nvidia-70": { "available_instances": "1", "description": "num_heads=1, frl_config=60, framebuffer=8192M, max_resolution=1280x1024, max_instance=1", "name": "GRID P4-8A" }, "nvidia-71": { "available_instances": "8", "description": "num_heads=4, frl_config=45, framebuffer=1024M, max_resolution=5120x2880, max_instance=8", "name": "GRID P4-1B" } }, "numa_node": "1", "parent": "pci_0000_d7_00_0", "product": "GP104GL [Tesla P4]", "product_id": "0x1bb3", "vendor": "NVIDIA Corporation", "vendor_id": "0x10de" } },
-
Наименование для zVirt (например nvidia-157) соотносится с профилем от NVIDIA GRID P4-2B. Подробнее обо всех профилях можно узнать на сайте NVIDIA. Для текущего примера возьмем профиль nvidia-157, который поддерживает работу максимум 4 vGPUs на 1 физический GPU.
-
Подключитесь к порталу администрирования zVirt, выберите ВМ, куда будет подключен vGPU. ВМ должна быть выключена. Для ВМ должен быть настроен запуск на хосте, куда подключена видеокарта.
-
Подключитесь к порталу администрирования zVirt
-
Перейдите в
-
Выделите нужную ВМ и нажмите Изменить
-
Перейдите на вкладку Доп.параметры.
-
Выберите ключ с типом mdev_type и впишите ранее выбранный профиль, например nvidia-157.
-
Нажмите ОК
5.1. Не отображаются Типы mdev
Если типы mdev не отображаются, выполните следующие действия:
-
Создайте директорию со скриптом:
mkdir -p /opt/script/
-
Перейдите в нее:
cd /opt/script/
-
Создайте скрипт-файл
vi /opt/script/startup-sriov-manage.sh
-
Внесите в него следующее содержимое:
#!/bin/bash # Далее используется вывод содержимого lspci | grep -i nvidia /usr/lib/nvidia/sriov-manage -e 0000:af:00
-
Установите необходимые права:
chmod 777 /opt/script/startup-sriov-manage.sh
-
Создайте systemd unit:
vi /etc/systemd/system/run-at-startup.service
-
Внесите в него следующее содержимое:
[Unit] Description=Run script for nvidia After=default.target [Service] Type=simple RemainAfterExit=yes ExecStart=/opt/script/startup-sriov-manage.sh TimeoutStartSec=60 [Install] WantedBy=default.target
-
Запустите команду для сканирования изменений в юнитах systemd:
systemctl daemon-reload
-
Добавьте юнит в автозапуск:
systemctl enable --now run-at-startup
6. Установка драйвера на ВМ
Проверьте, что ВМ расположена на хосте с vGPU, включите ВМ. Установите драйвера для ОС (Ссылка для поиска и скачивания нужных драйверов)
6.1. Установка драйвера на ВМ на базе Windows.
-
Загрузите драйвер на ВМ. Запустите установку драйвера. После установки выполните перезагрузку из Zvirt
Выключение виртуальной машины из гостевой операционной системы Windows иногда переводит виртуальную машину в спящий режим, который не полностью очищает память, что может привести к последующим проблемам. Использование портала администрирования или портала VM для выключения виртуальной машины заставляет ее полностью очистить память. При работе с помощью протокола SPICE не отображается курсор. Рекомендуем воспользоваться сторонними протоколами: RDP, VNC. Если необходимо использовать SPICE, рекомендуем добавить в файл concole.vv значение SPICE_DEBUG_CURSOR=1
-
Видеокарта будет корректно отображаться в Диспетчере устройств, графических приложениях.
6.2. Установка драйвера на ВМ на базе Linux.
-
Запустите ВМ. Установите гостевые дополнения на ВМ, если они не были установлены ранее. Произведите обновление системы, выполнив команду, например
dnf update -y
(для CentOS 8 Stream). Установите пакеты, необходимые для работы:-
Установка при наличии доступа в интернет:
dnf -y install kernel-devel kernel-headers elfutils-libelf-devel zlib-devel gcc make
-
При отсутствии доступа в интернет необходимо скачать пакеты для CentOS 8 Stream и произвести их установку:
rpm -ivh --nodeps *.*
-
-
Проверьте, используется ли драйвер nouveau на виртуальной машине. Для этого выполните команду
lsmod | grep nouveau
.lsmod | grep nouveau nouveau 2355200 0 mxm_wmi 16384 1 nouveau wmi 32768 2 mxm_wmi,nouveau video 53248 1 nouveau i2c_algo_bit 16384 1 nouveau drm_display_helper 151552 1 nouveau drm_ttm_helper 16384 2 qxl,nouveau ttm 81920 3 qxl,drm_ttm_helper,nouveau drm_kms_helper 167936 5 qxl,drm_display_helper,nouveau drm 577536 7 drm_kms_helper,qxl,drm_display_helper,drm_ttm_helper,ttm,nouveau
-
Добавьте драйвер nouveau в blacklist. Для этого создайте файл blacklist-nouveau.conf и добавьте в него следующую информацию:
nano /etc/modprobe.d/blacklist-nouveau.conf # add to the end (create new if it does not exist) blacklist nouveau options nouveau modeset=0
-
Сгенерируйте новую конфигурацию файла grub и перезагрузитесь, выполнив команды:
dracut --force
reboot
-
После перезагрузки, проверьте, что драйвер nouveau не используется. Для этого выполните команду:
lsmod | grep nouveau
-
Узнайте полный путь до ядра системы. Для этого выполните команду:
ll /usr/src/kernels/ total 4 drwxr-xr-x. 23 root root 4096 Apr 18 04:14 4.18.0-485.el8.x86_64
В текущем примере полный путь до ядра системы будет /usr/src/kernels/4.18.0-485.el8.x86_64
-
Добавите бит
x
для установки драйвера. Для этого выполните командуchmod +x имя_драйвера
. Например:chmod +x NVIDIA-Linux-x86_64-450.236.01-grid.run
-
Установите драйвер NVIDIA, указав полный путь к ядру. Например:
./NVIDIA-Linux-x86_64-450.236.01-grid.run --kernel-source-path /usr/src/kernels/4.18.0-485.el8.x86_64 Verifying archive integrity... OK Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 450.236.01..............
-
На вопрос о необходимости запуска утилиты nvidia-xconfig ответьте утвердительно.
-
Перезагрузите ВМ. В графическом режиме проверьте отображение карты. Для проверки (в графическом режиме) выполните команду в терминале:
nvidia-settings&
-
Для проверки в режиме командной строки выполните
nvidia-smi
. Пример результата выполнения:
Теперь GPU назначен виртуальной машине.
7. Проверка подключенных устройств к хосту
Для проверки количество подключенных vGPU к хосту выполните команду mdevctl list
. В текущем примере подключено 2 устройства, всего же в режиме nvidia-157 может быть до 4-х vGPU.
mdevctl list
23528e9a-3fbb-44e5-a885-efae7899e06f 0000:d8:00.0 nvidia-157 auto (defined)
41c64afd-74c4-47cd-b5cb-7f90f826004e 0000:d8:00.0 nvidia-157 manual
Так же отслежитвать работу vGPU можно с помощью утилиты nvidia-smi
nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.236.03 Driver Version: 450.236.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 P4 On | 00000000:D8:00.0 Off | Off |
| N/A 39C P8 12W / 75W | 4029MiB / 8191MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 2648216 C+G vgpu 2000MiB |
| 0 N/A N/A 2673268 C+G vgpu 2000MiB |
+-----------------------------------------------------------------------------+
8. Лицензирование
Настройте лицензирование гостевого ПО NVIDIA vGPU для каждого vGPU и добавьте учетные данные лицензии в панели управления NVIDIA. Для дополнительной информации смотрите раздел Как осуществляется лицензирование ПО NVIDIA vGPU в документации по ПО NVIDIA Virtual GPU.
9. Удаление устройств NVIDIA vGPU
-
Удалите драйвера. Для Windows удаление происходит через оснастку Установка и удаление программ. Для Linux запустите
/usr/bin/nvidia-uninstall
. -
Отключите устройство из менеджера управления zVirt. Для этого:
-
Перейдите в
-
Выделите нужную ВМ и нажмите Изменить
-
Перейдите на вкладку Доп.параметры
-
Удалите опцию mdev_type.
-