Проблема прокидывания видеокарт NVIDIA в Docker-контейнеры

linux docker

Некоторое время назад я столкнулся с любопытной проблемой. При попытке пробросить видеокарту NVIDIA в Docker-контейнер у меня все падало с ошибкой. При этом, на соседней машине, ровно с таким же конфигом, все работало вообще без проблем. Казалось бы, в чем подвох?

Немного о механизмах проброса конкретно NVIDIA

Начнем с того, что исторически NVIDIA под линуксом является своеобразным мемом - в основном, из-за проблем с драйверами. Справедливости ради, последние годы шутки достаточно сильно утрируют проблему, примерно как с классическим "плазма не падает".

Но вернемся обратно к нашим баранам. Проброс карты осуществляется с помощью NVIDIA Container Toolkit. Документация на сайте прям максимально подробная и позволяет настроить все даже без понимания, а что, собсно, происходит.

Тем не менее, не завелось. Просто вылетает с ошибкой docker: Error response from daemon: failed to create shim task: OCI runtime create failed: nvidia-container-runtime did not terminate successfully: exit status 1: unknown.. Гугл нашел примерно дофига чего, но большинство советов сводятся к "откатите на предыдущую версию и будет вам счастье". Еще одна часть результатов, как обычно, содержит закрытый вопрос с комментарием от самого автора "спасибо, все работает". Что именно при этом он сделал - непонятно.

Промучившись таким образом пару часов, я наконец-то смог собрать хоть какие-то логи. И когда я наконец-то сел их анализировать я расстроился. По сути, все мои проблемы сводились к тому факту, что мне было лень добавлять репозиторий Docker'a в apt (забыл сказать, все происходило на Ubuntu) и я просто поставил его из Snap'a. Скорее всего, знающие люди дошли бы быстрее, но я в целом слабо представляю себе, что это за зверь такой, Snap, и зачем он нужен.

Резюмируя, чтобы сразу озвучить, как решить проблему. Не пользуйтесь докером из снапа :)

А теперь отступление про Snap

Когда я наконец-то разобрался, что это и с чем едят - я не знал, то ли смеятся, то ли плакать.

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

Но вот способ применения пользователями этой фичи - это мем. Люди решили, что таким образом Canonical дали им возможность не обновлять систему. Для примера возьмем дискорд - он не дает запускать старые версии. Обновляйся или не пользуйся. Подход хороший. Но ему тоже нужны какие-то библиотеки, то есть рано или поздно вслед за дискордом придется обновлять систему. Но не в случае Snap'a! Он создаст дискорду нужное ему окружение и все хорошо. А потом мы удивляемся, откуда у нас в 2024 году возникают какие-нибудь 2-3-4 ядра у обычных пользователей. Не на серверах, там правила игры другие, да и защита строится по другим принципам (хотя обновления, по-хорошему, и там никто не отменял), а у обычных пользователей. Вот уж действительно, благими намерениями вымощена дорога в ад.

Previous Post Next Post