На работе требуется нынче а) запускать нейросети в контейнере, б) чтоб ещё и в 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 тег "колхоз", ибо назвать по-другому то, что сделано - сложновато.
Кросспост. Оригинал
тут