k8s, nvidia и таймслайсинг - небольшой обход граблей

Mar 01, 2024 14:58

На работе требуется нынче а) запускать нейросети в контейнере, б) чтоб ещё и в k8s, а не просто докер.
K8s таки есть (сам же и поднимал), осталось дело за запуском там видеокарты.
Нюансы:

1) весь k8s в виртуалках, за исключением сервера с нвидией и сеть k8s - на eth1. Ок, сделал там vxlan eth1 вместо того, что было.

2) если поставить nvidia-container-toolkit _полностью_ в соответствии с документацией, т.е. когда он рантайм по-умолчанию в containerd, через какое-то время служебные контейнеры начинают немножечко не отрабатывать пробы и перезапускаются, включая сетевой плагин. Это приводит к тому, что остальные контейнеры, у которых есть сеть, также перезапускаются. И всё это происходит примерно каждые 3-4 минуты.
Решение:
а) вернуть runc как рантайм по-умолчанию в конфиге containerd,
б) сделать RuntimeClass для запуска контейнеров, которым требуется GPU
Для п.б пришлось ещё сделать в конфиге containerd дубликат runc с именем nvidia, так как помимо всего прочего потребовалось ещё и nvidia device plugin с этим классом запускать. Он DaemonSet, так что запускается вообще везде.

3) так как количество GPU на сервере оказалось ограниченным :-), то сделал timeslicing, при помощи configmap для nvidia-device-plugin (подсмотрел чуть-чуть в темплейте helm, как прописать его использование, остальное - в документации описано достаточно понятно).

Итого для запуска требуется:
- вписать правильный tolerations (на тот сервер обычные контейнеры не допускаются)
- рядом добавить runtimeClassName: nvidia

P.S. Рад, щаслив, горд ©
P.P.S тег "колхоз", ибо назвать по-другому то, что сделано - сложновато.

Кросспост. Оригинал тут

работа, компутерное, колхоз, лытдыбр

Previous post Next post
Up