Использование OpenGL внутри докера с nvidia-docker2 - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь запустить приложения OpenGL ( Gazebo ) внутри контейнера Ubuntu 16.04, и я хотел бы иметь возможность воспользоваться преимуществами графического ускорения nvidia, когда оно будет доступно.Я пытаюсь выяснить, какой рекомендуемый, официально поддерживаемый (надеюсь, nvidia) способ добиться этого.

Мои требования:

  1. Создание изображения отнимает много времени, поэтому я бы хотел иметь одно изображение для всех видов графики (nvidia, mesa, т.е. все остальное), или, если они раздельные, их следует создавать «ОТ» общего базового изображения с большей частью контента.
  2. Контейнер nvidia должен работать на разных системах, на которых могут быть установлены разные карты nvidia и версии драйверов.
  3. Мне нужно использовать Ubuntu 16.04, компания требует этого, хотя это наименее важное из этих требований,например, если бы это можно было сделать только 18.04, я бы тоже заинтересовался.

То, что я пробовал до сих пор:

  • Просто создайте отдельные образы для nvidia ивсе остальное, с FROM nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04.Это хорошо работает, но требует создания двух образов, что занимает вдвое больше времени и вдвое больше дискового пространства. Требование к нарушению 1.
  • Сначала создайте «нормальное» (mesa / intel) изображение из ubuntu:16.04, сделайте там все трудоемкое, а затем используйте его в качестве основы для другогоОбраз, где драйверы NVIDIA устанавливаются вручную из официального «файла запуска».Это работает, если драйвер точно соответствует драйверу, установленному на хосте, но не если хост имеет другую (например, более старую) версию. Требование о нарушении 2.
  • Ничего не делать, просто запустите мой обычный контейнер с поддержкой mesa с --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all -e NVIDIA_DRIVER_CAPABILITIES=all.Если я это сделаю, nvidia-smi видит карту, но OpenGL (например, glxinfo) все еще пытается загрузить драйвер swrast, который не работает.

Большинство примеров, которые я виделв дикой природе используют базу nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04, и я не могу найти, как драйверы nvidia установлены (если они вообще есть) в этом образе.Я также где-то читал, что во время выполнения контейнера nvidia (то есть nvidia-docker2, который я использую) вам не нужно устанавливать драйверы, но это не так, по крайней мере, для OpenGL.

Итак, есть ли способ создать образы контейнеров для nvidia и non-nvidia, которые удовлетворяют всем моим требованиям, или я просто хочу слишком много?

1 Ответ

0 голосов
/ 18 декабря 2018

Зачем тратить время на поиски решения самостоятельно, когда можно просто «украсть» чужое решение?Особенно, если это кто-то другой - NVIDIA.

Так как nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04, кажется, работает хорошо, но использование его как основы нарушает требование 1, я могу просто скопировать файлы из него и вместо этого в свое изображение.

Здесь ${from} указывает на мое исходное изображение контейнера, не поддерживающего nvidia (но я также протестировал его с from=ubuntu:16.04), и я просто копирую драйверы и конфигурацию nvidia:

ARG from
FROM nvidia/opengl:1.0-glvnd-runtime-ubuntu16.04 as nvidia
FROM ${from}

COPY --from=nvidia /usr/local /usr/local
COPY --from=nvidia /etc/ld.so.conf.d/glvnd.conf /etc/ld.so.conf.d/glvnd.conf

ENV NVIDIA_VISIBLE_DEVICES=all NVIDIA_DRIVER_CAPABILITIES=all
* 1010С учетом этого и моего ${from}, построенного поверх ubuntu:16.04, glxinfo возвращает ожидаемую конфигурацию (NVIDIA является поставщиком GL), и я могу запускать Gazebo, Blender и т. Д., Как на хосте.Прелесть этого в том, что результирующий контейнер работает, даже когда не используется среда выполнения nvidia, в системе без драйверов nvidia, он просто грациозно возвращается к использованию Mesa (я думаю, это то, что делает «glvnd»).

Хотя в настоящее время мне требуется использовать Ubuntu 16.04, я не вижу причин, по которым подобный подход не будет работать для других версий Ubuntu.

...