Vmware gpu passthrough windows

ESXi 6.5 Passthrough Video Card/GPU to Plex VM

Apr 26, 2018 / Karim Elatov / plex, intel_gpu_top

Hardware Acceleration with Plex

So I ran into Using Hardware-Accelerated Streaming post from plex. And I found it intriguing, but then I saw this section in the post:

Can I use Hardware-Accelerated Streaming inside of a virtual machine?

Hardware-Acceleration Streaming is not currently possible inside of virtual machines, as virtual machine hosts do not expose low-level video hardware to the guest operating system. While some virtual machines expose generic 3D acceleration to the guest OS as a virtual driver, this does not include support for accelerated video decoding or encoding.

But I wanted to find out what would happen if I just passthough the Video Card to the VM?

Enable Passthrough on Video Card/GPU in ESXi 6.5

The instructions for accomplishing this are laid out in:

I have the following Video Card on my ESXi Host:

Looking at other forums it looks like people didn’t have much luck with that video card:

But I guess I got lucky. In the vSphere Web Client, I just went to Host -> Manage -> Hardware -> PCI Devices -> Toggle passthough on the Video Card:

Then I rebooted the host and under the Passthough column I saw Active. I didn’t have to do any extra configuration for that. After I rebooted I thought the ESXi was hung cause it just showed the following on the boot up:

vmkapi_v2_2_0_vmkernel_shim successfully loaded

This is actually expected since the Hypervisor enables the passthough at this point and you won’t see the boot up process any more. This was discussed in stuck after reboot: “vmkapei loaded successfully”. I did have SSH enabled on the host and I was able to SSH to the host and confirm it booted up fine and the auto start process started booting up all the VMs.

Another FYI is that with PCI Passthrough you can’t take snapshots of the VM (this could impact your Backups). From VMware KB 2142307:

While VMDirectPath I/O can improve performance of a virtual machine, enabling it makes several important features of vSphere unavailable to the virtual machine, such as Suspend and Resume, Snapshots, Fault Tolerance, and vMotion.

Adding Video Card/GPU to VM

This was pretty easy as well. I just shutdown the VM and then in the Web Client I went to Virtual Machines -> VM -> Actions -> Edit Settings. Then added a new PCI Device and selected the Video Card from the drop down list:

After I powered on the Linux VM, I actually still saw the console through Vsphere Web Client and the monitor that was connected to the ESXi host didn’t show anything. I then realized the VM now had two Video Cards:

and here are the two PCI devices:

Disabling Primary Video Card on a VM

At this point I wanted to make sure the VM only has one Video card. As I was looking around for a way to accomplish this, I ran into a parameter in the vmx file called svga.present. I also some folks try to use that parameter:

So I decided to try it out. Virtual Machines -> VM -> Actions -> Edit Settings -> VM Options -> Advanced -> Configuration Parameters -> Edit Configuration -> Set svga.present to FALSE:

Then after another reboot of the VM, I saw the VM boot up process on the monitor that is connected to the ESXi host and inside the VM only one VGA device showed up:

And here is the information on the PCI device:

Enabling Hardrware Acceleration on Plex

The original link has all the instructions:

  1. Enable hardware acceleration To use Hardware-Accelerated Streaming in Plex Media Server, you need to enable it using the Plex Web App.
  2. Open the Plex Web app.
  3. Navigate to Settings >Server >Transcoder to access the > server settings.
  4. Turn on Show Advanced in the upper-right corner to expose advanced settings.
  5. Turn on Use hardware acceleration when available.
  6. Click Save Changes at the bottom.

You do not need to restart Plex Media Server after saving the changes.

Not too difficult.

Confirming Hardrware Acceleration is utilized

I ran into Hardware-Accelerated Streaming not working on 64-bit Ubuntu 16.04, i7-3770 and PMS 1.9.5.4339 which show sample logs of HW Acceleration. So when I checked out my logs I saw this:

Adding Plex User to be part of the Video group

I then ran into a couple of posts which had similar logs about the hardware transcoding failing:

And they recommended adding the plex user to be part of the video group. So I did that:

Читайте также:  System windows forms bindingsource

And restarted the plex service:

And after that I saw the following in the logs:

You will also see HW when a video is playing in the Plex Web App:

Confirming GPU Utilization

Initially I ran top to make sure the CPU is not getting utilized as much. And I did see that when plex was transcoding:

I then ran into a tool called intel_gpu_top and that is available with the intel-gpu-tools package on CentOS 7.

When I ran that tool I did see GPU utilization:

Lastly I had a zabbix agent collecting CPU information on the box, and here are the results from before:

And here are the results watching the same thing after:

Проброс (passthrough) видеокарты nVIDIA в виртуалку Ubuntu 16.04 для хоста VMWare vSphere ESXi 6.5

Как уже писал ранее — недавно в мой домашний сервер была куплена видеокарта MSI GeForce GTX 1080 Ti GAMING X TRIO 11 GB OC Enthusiast для погружения в тему Deep Learning. Но из-за сложившейся ранее ситуации — мне необходимо было иметь ОС Windows Server, а с видюхой я планировал работать в Ubuntu. Вначале была мысль поставить Ubuntu (хвостовой ОС), а оттуда грузить через VirtualBox уже Windows (гостевой ОС), но были огромные вопросы по производительности, да и мы же не ищем легких путей:) Поэтому по советам товарищей с форума я решился попробовать гипервизор VMWare vSphere ESXi 6.5, который позволяет пробрасывать PCI-устройство в одну из гостевых операционных систем (виртуальных машин).

Естественно, всё оказалось не так просто и радужно как хотелось бы, но гугл и несколько дней тестов привели меня к полноценной инструкции (пошаговому руководству) как лучше всего сделать PCI-passthrough (проброс видюхи GTX 1080 Ti) в Ubuntu Desktop 16.04.4 и использовать там CUDA Toolkit 9.1. Об этом я и расскажу далее, но прежде чем пошагово начинать настройку — советую бегло прочитать статью и пометить у себя в голове важные моменты (ведь я не знаю вашу конфигурацию и описываю свой опыт), т.к. у вас могут появиться дополнительные вопросы или действия, которые необходимо сделать отличным от моего образом.

Все ссылки на источники я оставил и пометил «публикационным» способом. Так будет удобнее и проще, если вдруг захотите найти источник и углубиться (если вдруг возникнет какая-то проблема).

Предварительная настройка гипервизора ESXi 6.5

  1. Для начала необходимо включить доступ по SSH в веб-интерфейсе ESXi: кликаем правой кнопкой мыши по пункту Host в навигаторе слева, выбираем ServicesEnable Secure Shell (SSH).
  2. Заходим под своим логином/паролем по SSH и меняем режим проброса nVidia устройств [1] с bridge на link:
    # vi /etc/vmware/passthru.map
    находим там следующее значение и меняем на link:
    # NVIDIA
    10de ffff bridge false
  3. Делаем проброс устройства в хост: заходим в веб-интерфейсе ESXi в ManageHardwarePCI Devices и выбираем видеокарту, жмём сверху «Toggle passthrough».
  4. Выполняем перезагрузку (reboot) хоста vSphere ESXi.

Установка Ubuntu 16.04 и настройка проброса видеокарты

  1. Создаем новую VM в ESXi, но не устанавливаем туда операционную систему.
  2. Заходим в расширенные настройки VM: кликаем правой кнопкой мыши, выбираем Edit settings и далее переходим в таб VM Options, а там выбираем пункт Advanced, затем нажимаем кнопку Edit Configuration и добавляем следующую настройку [1], [2]:
    firmware = efi
    Если сделать это уже на установленной системе, то велика вероятность, что в итоге она затем не загрузится. Скорее всего у меня это было связано с настройками биоса на самом сервере. Я не пытался разобраться почему всё именно так, но пришел к выводу, что лучше сделать этот пункт до установки убунты и не мучаться.
  3. Далее устанавливаем убунту 16.04 (во время установки я не ставил никакие проприетарные драйвера, т.е. не отмечал 2 галочки во время установки), выключаем её.
  4. Снова заходим в расширенные настройки VM и там прописываем (как это делали в шаге 2):
    pciPassthru.use64bitMMIO = TRUE
    vmci.msix = FALSE
    hypervisor.cpuid.v0 = FALSE
    Первые две настройки отвечают за то, чтоб была корректная работа с памятью и адресным пространством в PCI-устройства [2], а последний нужен для того, чтоб NVIDIA-драйвера не знали, что у нас операционка в виртуальной машине — подробнее об этом в [1].
  5. Далее запускаем нашу виртуальную машину (заметьте: проброс самого PCI-устройства в неё мы ещё не делали), подключаемся по VMware Remote Console (VMRC) и скачиваем CUDA тулкит отсюда:
    https://developer.nvidia.com/cuda-downloads
    Я советую качать инсталлер runfile:
    Operating System → Linux
    Architecture → x86_64
    Distribution → Ubuntu
    Version → 16.04
    Installer Type → runfile (local)
    Замечу, что качаем сразу toolkit и патчи (на момент написания статьи было 3 патча). Драйвера для видеокарты (не последней доступной версии) находятся в cuda toolkit. Ставить ли отдельно самую последнюю версию драйверов? Я не могу сказать, скорее всего лучше не рисковать и поставить те, которые идут вместе с тулкитом (но если вы будете ставить их раздельно, то есть пропускать установку драйверов при установке cuda toolkit, то учтите, что там будет другая опция для отмены OpenGL библиотек — об этом будет написано далее).
  6. Выходим (logout, не poweroff) из юзера, нажимаем ALT+CTRL+F1 (для VMRC из под macOS: FN+Control+Option+F1), вводим логин и пароль в консоли.
  7. Далее нам нужно заблокировать загрузку nouveau [3] (подробнее об этом и вообще о подготовке операционки в официальном Installation Guide для CUDA — [4]):
    # sudo vi /etc/modprobe.d/blacklist-nouveau.conf
    Вставляем туда:
    blacklist nouveau
    options nouveau modeset=0
  8. Устанавливаем необходимые для samples (примеров) библиотеки [5], [6]. Отдельно замечу, что устанавливаем не все из списка, а только те, на которые у меня ругался инсталлятор (лишнего нам не нужно, да и нужны они грубо говоря только для примеров — не факт, что в настоящих задачах они вам понадобятся).
    # sudo apt-get install freeglut3-dev libxmu-dev libxi-dev
  9. Далее нужно установить модули ядра (?) и его исходный код версии 4.4, т.к. только эта версия поддерживается на данный момент в CUDA Toolkit (подробнее об этом: [7], [8], [9]).
    # sudo apt-get install linux-image-extra-virtual
    # sudo apt-get install linux-headers-generic
  10. Причем текущие модули ядра (?) нужно будет удалить [11], так как даже если указывать путь к исходному коду ядра для версии 4.4 через параметр «—kernel-source-path», то всё равно при установке nVidia драйверов видеокарты будет вылетать ошибка. На момент написания статьи последней версией ядра было 4.13 (узнать текущую версию можно через команду uname -r).
    # sudo apt-get purge linux-image-4.13*
    # sudo apt-get purge linux-headers-4.13*
  11. Далее нужно обновить образ initramfs, чтобы при загрузке Ubuntu использовалось ядро версии 4.4:
    # sudo update-initramfs -u
  12. Следующим шагом нужно выключить ОС командой:
    # sudo poweroff
  13. Заходим в настройки VM в веб-интерфейсе vSphere ESXi 6.5 и добавляем туда видеокарту: Add other devicePCI device. Отдельно замечу, что я добавлял только саму видео карту, а звуковой контроллер (HDMI Audio Controller) — не добавлял.
  14. После добавления видеокарты при попытке сохранить настройки ESXi будет ругаться на резервацию памяти (подробнее — [12]), поэтому необходимо будет открыть выше настройки оперативной памяти (Memory) и поставить галочку напротив: ReservationReserve all guest memory (All locked).

Установка CUDA Toolkit 9.1 на Ubuntu 16.04

Конечно, частично этот раздел должен включать в себя и некоторые действия из предыдущего, но для упрощения и уменьшения количества шагов — все написано так, как написано 🙂

  1. Включаем виртуальную машину, подключаемся по VMRC, не входим в пользователя и нажимаем ALT+CTRL+F1. Вводим логин/пароль в консоли.
  2. Ставим все обновления:
    # sudo apt-get update
    # sudo apt-get upgrade
  3. Выключаем дисплейный менеджер Иксов:
    # sudo service lightdm stop
  4. Проверяем текущую версию ядра (должно быть 4.4.0-X-generic, подробнее снова в [4]):
    # uname -r
  5. Переходим в директорию, куда мы ранее скачали CUDA Toolkit вместе с патчами (или директорию, где у нас находится драйвер для видеокарты, но повторю что он идет вместе с тулкитом, и если вы не хотите ставить его отдельно, то нет необходимости его качать).
    # cd Загрузки
  6. Запускаем установку тулкита (обратите особое внимание на передаваемый параметр для отключения OpenGL — [13]):
    # sudo sh cuda_9.1.85_387.26_linux.run —no-opengl-libs
    Как и обещал выше — сразу же здесь предупрежу, что опция для отключения OpenGL библиотек при установке отдельно драйвера для видеокарты — отличается. Для установки драйвера видеокарты команда для установки будет следующей:
    # sudo sh NVIDIA-Linux-x86_64-390.48.run —no-opengl-files
  7. Перед установкой тулкита нам зададут несколько вопросов, на которые я отвечал следующим образом (тут вопросы в сокращенном виде!):
    EULA: accept
    install driver: y
    run nvidia-xconfig: n (важно! если поставите y, то скорее всего не сможете зайти в пользователя — [13], [14])
    install toolkit: y
    toolkit location: (ничего не менял, оставил по дефолту — просто Enter)
    symbolic link: y
    install samples: y
    samples location: (ничего не менял, оставил по дефолту — просто Enter)
  8. В итоге у нас должны установиться: nvidia driver, cuda toolkit и cuda samples и не должно вывалиться никаких ошибок (если вывалились — гуглите… я пока тестировал это всё и писал для себя короткие заметки с командами — переустанавливал убунту раз 5, чтобы попробовать заново).
  9. Далее нужно прописать пути к CUDA и библиотекам в переменных окружения, я сделал это следующим образом (пути отобразились в сообщении об успешной установке выше — именно оттуда я их и взял):
    # echo «export PATH=/usr/local/cuda-9.1/bin:$PATH» >>

/.bashrc
# echo «export LD_LIBRARY_PATH=/usr/local/cuda-9.1/lib64:$LD_LIBRARY_PATH» >>

/.bashrc

  • Затем нужно установить все патчи для CUDA Toolkit:
    # sudo sh cuda_9.1.85.1_linux.run
    # sudo sh cuda_9.1.85.2_linux.run
    # sudo sh cuda_9.1.85.3_linux.run
  • После этого не делать ребут (важно — [14]), а запустить дисплейный менеджер Иксов:
    # sudo service lightdm restart
  • Появится экран входа в пользователя — ввести логин/пароль и уже из убунты выполнить перезагрузку (reboot).
  • Проверка корректности установки NVIDIA-драйверов и CUDA Toolkit

    После перезагрузки и входа в пользователя необходимо проверить корректность установки драйверов и тулкита, т.к. если где-то что-то пошло не так и вы этого не заметили (или это каким-либо образом не отобразилось) — всё насмарку.
    Открываем терминал и выполняем следующие шаги [15]:

    1. Проверяем видно ли видеокарту и её параметры (GPU FAN, GPU Temp, RAM и тд):
      # nvidia-smi
    2. Проверяем версию CUDA компилятора:
      # nvcc -V
    3. Проверяем видит ли CUDA Toolkit видеокарту и отображает ли он её параметры через запуск одного из примеров (samples), а также в конце вывода последней команды должно быть Result = PASS:
      # cd

    /NVIDIA_CUDA-9.1_Samples/1_Utilities/deviceQuery
    # sudo make
    # ./deviceQuery

    Если в результате всё прошло без ошибок — можно считать, что всё успешно установлено и вам далее можно пользоваться этой виртуальной машиной с видеокартой как душе угодно 🙂 Но есть пару тонких моментов, которые я решил выделить в несколько отдельных разделов.

    Изменение разрешения экрана в гостевой Ubuntu 16.04 для ESXi 6.5

    Естественно, работать через VMRC с разрешением (screen resolution) 800х600 крайне некомфортно, а в настройке экранов в убунту (Параметры системыНастройка экрановРазрешение) максимальное возможное значение всего 1360×768, что тоже по нынешним меркам очень мало.

    Для того, чтобы поставить другое разрешение в гостевой ОС Ubuntu для хоста VMware vSphere ESXi 6.5 нужно проделать следующие действия:

    1. Зайти в убунту, открыть терминал и установить Open VMWare Tools [16]:
      # sudo apt-get install open-vm-tools open-vm-tools-desktop
    2. Выключить виртуальную машину, зайти в её настройки и для Video Card (не GPU, которое мы пробрасывали!) поставить Total video memory, например, 16 MB (можно и больше, я ставил 32 MB) — [17].

    После включения виртуальной машины в настройках экрана можно будет выбрать разрешение больше, чем до этого было возможно. Данный способ подойдет и просто для OS Ubuntu, которая установлена виртуальной машиной в ESXi — не обязательно пробрасывать видеокарту (хотя вся инструкция же об этом).

    Для моего iMac 27 дюймов с разрешением в macOS в 4K — комфортнее всего ставить в убунту разрешение экрана равное 1600х1200 (4:3) для сеанса работы через VMRC.

    PS: если использовать подключение через VNC — это тоже важно, там тоже будет то разрешение, которое установлено в ОС (а не автоматическое изменение в момент входа как это работает в RDP в Windows — и это очень грустно, что нет аналогичной функции или я просто о ней не знаю).

    Вывод изображения с GPU на монитор в гостевой OS Ubuntu 16.04 для хоста ESXi 6.5

    Рядом с моим сервером стоит старенький монитор с VGA каналом, но ради интереса мне захотелось проверить как GTX будет работать непосредственно при выводе изображения на монитор. В видеокарте GTX 1080Ti нет VGA-разъема, поэтому пришлось покупать ЦАП HDMI→VGA (я тестировал на этом: https://www.citilink.ru/catalog/computers_and_notebooks/cables/907388/ ).

    К слову, я не уверен, но скорее всего для запуска бенчмарков для проверки FPS и просто замера мощности карты — скорее всего нужно тоже делать хак, описанный в этом разделе, т.к., например, ранее в Windows Server 2012R2 (когда она стояла просто на сервере, без ESXi) после подключения видеокарты и установки на неё драйверов — FurMark и ещё какой-то бенчмарк отказались работать, сказав, что «не могут найти устройство» (подключение к винде было через RDP). Не знаю что они имели ввиду: видеокарту или монитор — скорее всего второе, т.к. другой софт вроде GPU-Z отлично видел видеокарту и показывал по ней все параметры.

    Возвращаясь опять к вопросу вывода экрана с GPU на монитор в убунте [18] — нужно произвести некоторые шаги:

    1. Подключить HDMI разъем монитора к GPU (без разницы через переходник или нет).
    2. Посмотреть следующие параметры видеокарты (GPU #0) и монитора (Display Device 0): PCI BusID, EDID Name, Minimum HorizSync, Maximum HorizSync, Minimum VertRefresh, Maximum VertRefresh с помощью команды:
      # sudo nvidia-xconfig —query-gpu-info
    3. Запустить создание/изменение конфигурации графической оболочки для Иксов через nvidia:
      # sudo nvidia-xconfig
      Тут важно отметить, что если у вас до этого был файл /etc/X11/xorg.conf , то лучше его забекапить ))
    4. Поменять настройки GPU в конфигурации графической оболочки:
      # vi /etc/X11/xorg.conf
    5. Находим:
      Section «Device»
      и прописываем там найденный в шаге №2 BusID (пример оформления в [18]).
    6. Находим:
      Section «Monitor»
      и меняем там следующие параметры (полученные в шаге №2):
      ModelName = EDID Name
      HorizSync = Minimum HorizSync — Maximum HorizSync
      VertRefresh = Minimum VertRefresh — Maximum VertRefresh
      Но будьте аккуратны и посмотрите пример оформления в [18], чтобы потом всё запустилось (в последних двух примерах нужно писать только цифры).
    7. После этого перезагружаем Ubuntu и любуемся на изображении в мониторе.

    Но! Здесь, в конце, следует предостеречь вас от одной досадной оплошности. При использовании вывода изображения через видео-карту на монитор — VMRC и простая консоль в ESXi не будут работать — то есть теперь там не будет изображения с гостевой ОС (будет просто черный экран).

    К тому же, взаимодействие с ОС будет происходить через мышь и клавиатуру, через которые вы работаете в VMRC, поэтому скорее всего предварительно — нужно позаботиться о том, чтоб прокинуть во внутрь Ubuntu клавиатуру и мышь, которые подключены непосредственно к серверу с ESXi.

    Резюмируя всё вышенаписанное

    Для меня был удивительным тот факт, что установка CUDA Toolkit и nVidia drivers в убунту — это такой геморрой. Я 3 дня фулл-тайм занимался тем, что тестировал различные ответы со стековерфолу и форума разработчиков nvdia. Очень спасали меня, конечно, снепшоты в ESXi, чтобы не устанавливать Ubuntu каждый раз с нуля. Но по итогу всё равно я несколько раз её переставлял, особенно когда в середине пути вскрылся косяк с efi.

    Если бы в тот момент я нашел такую же пошаговую инструкцию, где всё описано от и до — то это спасло бы кучу моих нервов и времени. Именно поэтому я записывал каждый сделанный шаг и в итоге решил написать это пошаговое руководство по пробросу видеокарты в ESXi. Да, конечно, лучше было бы описать всё на английском (in english), т.к. больше всего вопросов и ответов именно на этом языке, но как смог — так и сделал. Надеюсь, что зарубежные братья, кто столкнется с этим вопросом смогут воспользоваться google translate, чтобы не мучаться и сделать всё так, как я описал выше.

    Мне будет очень приятно, если вы поделитесь этой публикацией где-то на форуме (в момент, когда кто-то столкнется с такой же проблемой) или в каком-то чате, где у кого-нибудь возникнет этот же вопрос. Я потратил целый день, чтобы написать статью и разложить всё по полочкам, т.к. у меня всё было скомкано просто в текстовом файле в виде команд и ссылок откуда я взял эту информацию.

    Спасибо за внимание и да прибудет сила Deep Learning вместе с GPU!

    Оцените статью