Proxmox 8: vGPU у віртуальних машинах та контейнерах LXC

pic

Привіт, 👋

Через деякий час після того, як мені вдалося налаштувати vGPU, я зіткнувся з викликом — передати GPU в контейнери LXC. Чому передача (passthrough)? Тому що контейнери LXC працюють не так, як віртуальні машини (VM). Це означає, що контейнери LXC побудовані на хості Proxmox, і щоб мати змогу використовувати GPU, спочатку потрібно забезпечити доступ до GPU на самому хості. Увімкнення vGPU і встановлення драйвера на хост — це ще не все, тому що драйвер хоста — це, швидше, інструмент керування, а можливості драйвера також інсталюються на хост. Що ж можна зробити в цьому випадку? Просто, встановити ще один драйвер, в який інтегровано драйвер Nvidia для vGPU.

Нижче я створю для вас короткий і детальний посібник, як досягти цього. Об'єднання звичайного драйвера з драйвером vGPU схоже на створення монстра, але таким чином ви отримаєте найкраще від вашого GPU. У такий спосіб ви зможете розподілити GPU для використання у віртуальних машинах (VM), на самому хості та в контейнерах LXC.

Крок 1 (IOMMU групи):

По-перше, потрібно увімкнути групи IOMMU і зробити кілька налаштувань перед установкою драйвера (див. https://medium.com/@dionisievldulrincz/enable-vgpu-capabilities-on-proxmox-8-ca321d8c12cf). Просто скористайтеся вказаним посібником і зупиніться на кроці, де потрібно завантажити та патчити драйвер. (Порада: якщо ви вже зробили налаштування, можете пропустити наступний крок).

Крок 2 (Встановлення драйвера):

ВАЖЛИВО: Якщо у вас вже встановлений драйвер Nvidia, використовуйте команду “nvidia-uninstall”, щоб повністю видалити його і підготуватися до нового драйвера.

Завантажте відповідну версію об'єднаного драйвера Nvidia для вашого GPU, використовуючи команду wget знизу (Щоб перевірити, яку версію підтримує ваш GPU, ви можете скористатися частиною "Check GPU" з цього посилання: https://wvthoog.nl/proxmox-vgpu-v3/).

v16: wget https://alist.homelabproject.cc/d/foxipan/vGPU/16.4/NVIDIA-Linux-x86_64-535.161.07-merged-vgpu-kvm-patched-kernel6.8.run
v17: wget https://alist.homelabproject.cc/d/foxipan/vGPU/17.2/NVIDIA-Linux-x86_64-550.90.07-merged-vgpu-kvm-patched.run

Після того як ви завантажите об'єднаний драйвер, продовжуйте з його встановленням, використовуючи команду:

chmod +x DRIVER_NAME.run  
./DRIVER_NAME.run --dkms

Якщо буде запит на X server, виберіть “NO”. В основному, під час встановлення можна вибирати стандартні параметри.
Якщо установка пройшла успішно, ви повинні побачити повідомлення про успішне встановлення драйвера. На цьому етапі перезавантажте хост.

Крок 3 (Перевірка правильності установки):

Після перезавантаження відкрийте оболонку Proxmox хоста і виконайте команди, щоб перевірити, чи встановлений драйвер коректно та працює:

nvidia-smi

pic

Перевірка інформації за допомогою nvidia-smi

nvidia-smi vgpu надасть вам інформацію про гостьові системи, які використовують GPU:

pic

Інформація nvidia-smi vgpu

nvidia-smi vgpu -c дасть вам інформацію про доступні типи віртуальних GPU для ваших vGPU:

pic

Інформація nvidia-smi vgpu -c про типи сіток

mdevctl types надасть список доступних типів, які можна використовувати у ваших віртуальних машинах (VM).

pic

Інформація mdevctl types

Якщо будь-яка з вищезгаданих команд повертає порожні списки або нічого, швидше за все, щось не так з вашою установкою.
Не можу надати більше інформації, оскільки в основному все повинно працювати коректно.

Можливі проблеми:

Невірна версія драйвера для вашої архітектури GPU.
Драйвер не був коректно завантажений.
Драйвер викинув помилку під час установки, яку було проігноровано.
Попередній драйвер не був коректно видалений/не був видалений.
Драйвер nouveau не був заблокований.
Групи IOMMU не були увімкнені.
Ви пропустили хоча б один крок.
Ви підключили кабель до порту GPU.

Крок 4 (Передача GPU):

Залежно від того, як ви хочете використовувати GPU, ви, ймовірно, захочете використовувати його в віртуальній машині (VM) або контейнері LXC. Для VM виконайте крок 4.1, а для LXC — крок 4.2.

Щодо клієнтських/GRID драйверів, якщо ви вже маєте встановлені драйвери grid з переднього етапу, вони також підходять (наприклад, я використовую grid драйвер для v16.8 на моєму Windows-комп'ютері, а хост Proxmox має драйвер v16.5).

Крок 4.1 (vGPU у VM):

По-перше, якщо у вас є віртуальна машина, потрібно передати їй GPU. Це можна зробити через інтерфейс користувача, перейшовши до VM->Hardware->Add->PCI Device. Тут поставте галочку на “Raw Device” і знайдіть ваш GPU у списку.

pic

Знаходимо GPU в розділі Raw Devices

Виберіть його, поставте галочки на “ROM-Bar” і “PCI-Express” і вгорі в спливаючому вікні ви побачите опцію “Primary GPU”, яку теж треба вибрати, а також “MDev Type”. Це відкриє список доступних типів. Виберіть потрібний тип і підтвердіть його кнопкою “OK”.
Порада: Якщо ви використовуєте розблокування vGPU, яке повинні були налаштувати з іншого посібника, ви зможете переозначити ці типи з списку. Це дуже корисна функція, якщо ви використовуєте VM для ігор, тому що за замовчуванням кожен vGPU має обмеження фреймів до 30fps, яке можна вимкнути через файл profile_override.toml. Наприклад, я відредагував тип nvidia-49 і встановив наступне:

pic

vgpu unlock profile override

Тепер завантажте вашу Windows-машину та встановіть драйвер гостя на ній (Використовуйте Spice або Remote Desktop Connection, щоб мати візуальний доступ до вашої VM). Драйвери для гостя можна знайти тут:

v16: https://alist.homelabproject.cc/foxipan/vGPU/16.5/NVIDIA-GRID-Linux-KVM-535.161.05-535.161.08-538.46/Guest_Drivers
v17: https://alist.homelabproject.cc/d/foxipan/vGPU/17.2/NVIDIA-GRID-Linux-KVM-550.90.05-550.90.07-552.55.zip

Після цього видаліть будь-який дисплей з обладнання VM Proxmox та перезавантажте вашу VM.

pic

Видалення дисплеїв з VM

Після перезавантаження ви повинні бути готові до роботи.
Швидше за все, вам буде потрібна ліцензія. Ви можете отримати 90-денну пробну версію з сайту Nvidia (https://www.nvidia.com/en-us/data-center/resources/vgpu-evaluation/**) або можна знайти інші альтернативи в інтернеті (https://git.collinwebdesigns.de/oscar.krause/fastapi-dls).

Крок 4.2 (GPU в LXC):

Це трохи складніше, ніж для VM, але ви зможете налаштувати це. Чому це потрібно? Наприклад, я використовую Jellyfin для трансляції відео в моїй домашній мережі. Передача GPU в контейнер Jellyfin дозволяє використовувати можливість транскодування. Інше застосування в LXC може бути для моделей ollama і так далі. Насправді, що відбувається, так це те, що драйвери хоста Proxmox зв'язуються з контейнером LXC, і сам контейнер використовує GPU. Це схоже на створення мосту між хостом і LXC, щоб вони використовували один і той же GPU.
Давайте почнемо!

Перші кроки будуть виконуватись на хості.
Насамперед, потрібно знайти cgroups для вашого драйвера nvidia та використовуваний рендер. Для цього можна використати наступні команди: “ls -alh /dev/nvidia” та “ls -alh /dev/dri*”.

pic

Отримуємо cgroups для nvidia на хост-машині

Тепер потрібно відредагувати конфігурацію контейнера LXC та дозволити відповідні cgroups:
nano /etc/pve/lxc/LXC_ID.conf

Згідно з виведеним результатом команд ls, потрібно вказати правильні числа. У моєму випадку я додам наступне в конфігурацію:

# Звичайні Cgroups  
lxc.cgroup2.devices.allow: c 195:* rwm  
lxc.cgroup2.devices.allow: c 255:* rwm  
lxc.cgroup2.devices.allow: c 507:* rwm  
lxc.cgroup2.devices.allow: c 511:* rwn  
# Транскодування  
lxc.cgroup2.devices.allow: c 128:* rwm  
lxc.cgroup2.devices.allow: c 226:* rwn  
# Файли пристроїв для проходу  
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file  
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file  
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file  
lxc.mount.entry: /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file  
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file  
lxc.mount.entry: /dev/dri/renderD128 dev/dri/renderD128 none bind,optional,create=file

Тепер перевірте, чи є ці пристрої в контейнері, використовуючи команду “ls -alh /dev/nvidia*” у контейнері.

pic

Перевіряємо наявність груп nvidia в контейнері

Далі встановлюємо драйвер nvidia. Версія має співпадати з версією драйвера за інформацією “nvidia-smi” на хост-машині. В контейнері LXC потрібно встановити звичайний драйвер nvidia, драйвер grid не потрібен, оскільки він не працюватиме. GRID призначений лише для віртуальних машин.

Ви можете завантажити драйвер з сайту Nvidia (Наприклад, я завантажив його звідси: https://www.nvidia.com/en-us/drivers/details/218856/)

Якщо ви завантажите цей драйвер на хост, ви можете скопіювати його в LXC за допомогою команди pct push (Детальніше тут: https://pve.proxmox.com/pve-docs/pct.1.html) або просто завантажити його за допомогою wget в контейнері LXC. Потім продовжуйте з установкою, але переконайтеся, що не встановлюєте модуль ядра, оскільки він вже є на хост-машині, і також переконайтеся, що ім'я драйвера відповідає вашому:

chmod +x NVIDIA-Linux-x86_64-535.161.07.run  
./NVIDIA-Linux-x86_64-535.161.07.run --no-kernel-module

Під час установки я вибрав вже виділені опції, а для X вибрав “No”. Якщо все пройшло правильно, ви повинні побачити таке повідомлення:

pic

Успішна установка драйвера

Перезавантажте контейнер і виконайте команду “nvidia-smi” в LXC.
Якщо ви отримали виведення, це означає, що драйвер встановлений правильно.

pic

nvidia-smi в контейнері LXC

У моєму випадку, якщо я запускаю відео в Jellyfin на своєму телефоні і виконую команду “nvidia-smi” на хості Proxmox, я отримую наступну інформацію:

pic

Перевіряємо, чи працює транскодування

Оскільки ffmpeg також є в списку, це означає, що транскодування працює правильно, і весь процес був виконаний правильно.

🙏🙏🙏 З огляду на це, я буду дуже вдячний, якщо ви підтримайте мене за допомогою кави тут: buymeacoffee.com/vl4di99, оскільки ці статті займають багато часу та зусиль для написання, а також налаштування потребують часу для тестування, щоб ви могли просто “підключити та використовувати”.

Спеціальна подяка:
https://alist.homelabproject.cc/foxipan
https://git.collinwebdesigns.de/oscar.krause/fastapi-dls
Nvidia за створення таких потужних GPU...

Нехай удача буде з вами, а драйвери — на вашому боці,

vl4di99

Перекладено з: Proxmox 8 vGPU in VMs and LXC Containers

Leave a Reply

Your email address will not be published. Required fields are marked *