Привіт, 👋
Через деякий час після того, як мені вдалося налаштувати 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
Перевірка інформації за допомогою nvidia-smi
nvidia-smi vgpu надасть вам інформацію про гостьові системи, які використовують GPU:
Інформація nvidia-smi vgpu
nvidia-smi vgpu -c дасть вам інформацію про доступні типи віртуальних GPU для ваших vGPU:
Інформація nvidia-smi vgpu -c про типи сіток
mdevctl types надасть список доступних типів, які можна використовувати у ваших віртуальних машинах (VM).
Інформація 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 у списку.
Знаходимо GPU в розділі Raw Devices
Виберіть його, поставте галочки на “ROM-Bar” і “PCI-Express” і вгорі в спливаючому вікні ви побачите опцію “Primary GPU”, яку теж треба вибрати, а також “MDev Type”. Це відкриє список доступних типів. Виберіть потрібний тип і підтвердіть його кнопкою “OK”.
Порада: Якщо ви використовуєте розблокування vGPU, яке повинні були налаштувати з іншого посібника, ви зможете переозначити ці типи з списку. Це дуже корисна функція, якщо ви використовуєте VM для ігор, тому що за замовчуванням кожен vGPU має обмеження фреймів до 30fps, яке можна вимкнути через файл profile_override.toml. Наприклад, я відредагував тип nvidia-49 і встановив наступне:
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.
Видалення дисплеїв з 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*”.
Отримуємо 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*” у контейнері.
Перевіряємо наявність груп 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”. Якщо все пройшло правильно, ви повинні побачити таке повідомлення:
Успішна установка драйвера
Перезавантажте контейнер і виконайте команду “nvidia-smi” в LXC.
Якщо ви отримали виведення, це означає, що драйвер встановлений правильно.
nvidia-smi в контейнері LXC
У моєму випадку, якщо я запускаю відео в Jellyfin на своєму телефоні і виконую команду “nvidia-smi” на хості Proxmox, я отримую наступну інформацію:
Перевіряємо, чи працює транскодування
Оскільки 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