Проброс или шеринг GPU в LXC

Поднимаю ollama в LXC через helper scripts (Proxmox VE Helper-Scripts)
В сервере торчит безхозная 1050Ti
Как сделать так, чтобы она была доступна в контейнере для ускорения работы LLM?

Недавно ставил оттуда openwebui и скрипт все сам сделал, подозреваю, что ollama это тоже должен делать

Я свою 3060 прокинул по этому гайду: https://www.youtube.com/watch?v=Met9pEfxsF8

Да, помогло. Единственное только не разобрался - это только в один LXC на хосте можно сделать? Просто в контейнере с ollama всё работает как часы, а в аналогичном с jupyter даже дрова не ставятся, вылетает по ошибке.

Люди, которые работают с docker+gpu знают про nvidia-container-toolkit (Overview — NVIDIA Container Toolkit). Но если внимательно покопаться по докам выше, то можно найти примечательную картинку:


Лежит вот тут Architecture Overview — NVIDIA Container Toolkit

Но нормальных инструкций по тому как скрестить lxc+nvidia container toolkit нет.

Исправляем

Из базового пакета lxc-pve при установке Proxmox устанавливается файл /usr/share/lxc/hooks/nvidia:

ls -al /usr/share/lxc/hooks/nvidia
-rwxr-xr-x 1 root root 7379 сен  2 11:08 /usr/share/lxc/hooks/nvidia

который и творит всю магию по работе с карточками. Но его надо “включить”. Для этого смотрим какие конфиги заданы:

ls -al /usr/share/lxc/config/common.conf.d
итого 32
drwxr-xr-x 2 root root  4096 ноя 10 20:03 .
drwxr-xr-x 4 root root 12288 ноя 10 20:03 ..
-rw-r--r-- 1 root root   103 июн 10 11:44 00-lxcfs.conf
-rw-r--r-- 1 root root   190 сен 15 20:24 01-pve.conf

Смотрим номер последнего правила и делаем:

sudo tee /usr/share/lxc/config/common.conf.d/02-nvidia.conf <<< 'lxc.hook.mount = /usr/share/lxc/hooks/nvidia'

Данная конфигурация говорит о том, что при запуске контейнера необходимо запускать хук nvidia.

Далее начинается самое не приятное: надо в конфигурации необходимых контейнеров руками указать GPU и capabilites используемые карточкой.
Например:

cat /etc/pve/lxc/135.conf
arch: amd64
.....
unprivileged: 1
lxc.environment: NVIDIA_VISIBLE_DEVICES=GPU-697224d8-d5cc-84e8-32c3-1133b6ca6a3b
lxc.environment: NVIDIA_DRIVER_CAPABILITIES=compute,utility

Необходимо задать две переменные окружения - NVIDIA_VISIBLE_DEVICES и NVIDIA_DRIVER_CAPABILITIES (также как и у docker run -e NVIDIA_VISIBLE_DEVICES=... ).
Capabilities смотрим в документации Specialized Configurations with Docker — NVIDIA Container Toolkit (не смотрите что для докера - под капотом используется одно и тоже).
Если несколько GPU, то можно посмотреть через nvidia-container-cli info UUID’ы и номера (индексы):

nvidia-container-cli info
NVRM version:   580.105.08
CUDA version:   13.0

Device Index:   0
Device Minor:   0
Model:          NVIDIA GeForce RTX 3060
Brand:          GeForce
GPU UUID:       GPU-697224d8-d5cc-84e8-32c3-1133b6ca6a3b
Bus Location:   00000000:03:00.0
Architecture:   8.6

Device Index:   1
Device Minor:   1
Model:          NVIDIA GeForce RTX 4060 Ti
Brand:          GeForce
GPU UUID:       GPU-6193d5fd-1fa7-f5de-26f9-b87bd9bc60e4
Bus Location:   00000000:04:00.0
Architecture:   8.9

и использовать их. Например прокидывать по индексам NVIDIA_VISIBLE_DEVICES=0,3,6 или по UUID NVIDIA_VISIBLE_DEVICES=GPU-6972....,GPU-4532324. Если в наличии только один GPU, то можно просто NVIDIA_VISIBLE_DEVICES=all.

Примущество данного подхода - не надо внутри контейнера ставить драйвера как во всех инструкциях пишут (но на хостовой системе естественнно должны быть), при обновлении драйверов на хостовой системе не надо внутри контейнера ничего делать.
Недостаток - правки переменных окружения - вручную.

1 лайк