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