Я ищу способ использовать графический процессор из док-контейнера.
Контейнер выполнит произвольный код, поэтому я не хочу использовать привилегированный режим.
Какие-нибудь советы?
Из предыдущего исследования я понял, что run -v
и / или LXC cgroup
- это путь, но я не уверен, как именно это осуществить.
Ответы:
Ответ Регана великолепен, но он немного устарел, поскольку правильный способ сделать это - избежать контекста выполнения lxc, так как Docker отбросил LXC в качестве контекста выполнения по умолчанию с docker 0.9.
Вместо этого лучше сообщить докеру об устройствах nvidia через флаг --device и просто использовать собственный контекст выполнения, а не lxc.
Окружающая среда
Эти инструкции были протестированы в следующей среде:
Установите драйвер nvidia и cuda на свой хост
См. CUDA 6.5 для экземпляра графического процессора AWS, на котором запущена Ubuntu 14.04, чтобы получить настройки своего хост-компьютера.
Установить докер
Найдите свои устройства NVIDIA
Запустите Docker контейнер с предустановленным драйвером nvidia
Я создал образ докера с предустановленными драйверами cuda. Dockerfile доступно на dockerhub , если вы хотите знать , как был построен этот образ.
Вы захотите настроить эту команду в соответствии с вашими устройствами nvidia. Вот что сработало для меня:
Убедитесь, что CUDA правильно установлен
Это должно быть запущено из док-контейнера, который вы только что запустили.
Установите образцы CUDA:
Сборка устройства. Пример запроса:
Если все работает, вы должны увидеть следующий вывод:
источник
ls -la /dev | grep nvidia
но CUDA не может найти ни одно устройство с поддержкой CUDA:./deviceQuery
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 38
-> no CUDA-capable device is detected
Result = FAIL
это из-за несовпадения библиотек CUDA на хосте и в контейнере?Написание обновленного ответа, так как большинство уже существующих ответов устарели на данный момент.
Версии раньше чем
Docker 19.03
раньше требовалиnvidia-docker2
и--runtime=nvidia
флаг.Так как
Docker 19.03
вам нужно установитьnvidia-container-toolkit
пакет, а затем использовать--gpus all
флаг.Итак, вот основы,
Установка пакета
Установите
nvidia-container-toolkit
пакет согласно официальной документации на Github .Для ОС на базе Redhat выполните следующий набор команд:
Для ОС на основе Debian выполните следующий набор команд:
Запуск докера с поддержкой GPU
Обратите внимание, флаг
--gpus all
используется для назначения всех доступных графических процессоров в контейнер докера.Чтобы назначить конкретный графический процессор док-контейнеру (если на вашем компьютере доступно несколько графических процессоров)
Или
источник
Хорошо, мне наконец-то удалось это сделать без использования режима --privileged.
Я использую Ubuntu Server 14.04 и использую последнюю версию CUDA (6.0.37 для Linux 13.04 64 бит).
подготовка
Установите драйвер nvidia и cuda на свой хост. (это может быть немного сложно, поэтому я предлагаю вам следовать этому руководству /ubuntu/451672/install-and-testing-cuda-in-ubuntu-14-04 )
ВНИМАНИЕ: Очень важно сохранить файлы, которые вы использовали для установки хоста cuda.
Получить Docker Daemon для запуска с помощью lxc
Нам нужно запустить демон docker, используя драйвер lxc, чтобы иметь возможность изменять конфигурацию и предоставлять контейнеру доступ к устройству.
Одноразовое использование:
Постоянная конфигурация. Измените свой файл конфигурации докера, расположенный в / etc / default / docker. Измените строку DOCKER_OPTS, добавив '-e lxc'. Вот моя строка после модификации.
Затем перезапустите демон, используя
Как проверить, эффективно ли демон использует драйвер lxc?
Строка «Драйвер выполнения» должна выглядеть так:
Создайте свой образ с помощью драйверов NVIDIA и CUDA.
Вот основной Dockerfile для создания CUDA-совместимого образа.
Запустите ваше изображение.
Сначала вам нужно определить свой основной номер, связанный с вашим устройством. Самый простой способ - выполнить следующую команду:
Если результат пустой, используйте запуск одного из примеров на хосте, чтобы добиться цели. Результат должен выглядеть следующим образом. Как видите, между группой и датой есть набор из 2 чисел. Эти 2 числа называются старшими и младшими (написаны в таком порядке) и предназначены для устройства. Мы просто будем использовать основные номера для удобства.
Почему мы активировали драйвер LXC? Использовать опцию lxc conf, которая позволяет нам разрешать нашему контейнеру доступ к этим устройствам. Опция: (я рекомендую использовать * для младшего номера, потому что это уменьшает длину команды run)
Так что, если я хочу запустить контейнер (Предположим, ваше изображение называется CUDA).
источник
--device
возможность разрешить контейнеру доступ к устройству хоста. Однако я попытался использовать,--device=/dev/nvidia0
чтобы позволить Docker-контейнеру запускать CUDA, и потерпел неудачу./dev/nvidiao
,/dev/nvidia1
,/dev/nvidiactl
и/dev/nvidia-uvm
с--device
. Хотя не знаю почему./dev/nvidia*
@Regan. Для @ChillarAnand я сделал cuda-dockerМы только что выпустили экспериментальный репозиторий GitHub, который должен облегчить процесс использования графических процессоров NVIDIA внутри контейнеров Docker.
источник
Недавние усовершенствования NVIDIA создали гораздо более надежный способ сделать это.
По сути, они нашли способ избежать необходимости устанавливать драйвер CUDA / GPU внутри контейнеров и обеспечивать его соответствие модулю ядра хоста.
Вместо этого драйверы находятся на хосте, и контейнеры не нуждаются в них. Это требует модифицированного docker-cli прямо сейчас.
Это здорово, потому что теперь контейнеры стали намного более переносимыми.
Быстрый тест на Ubuntu:
Для получения дополнительной информации см .: Контейнер Docker с поддержкой графического процессора и: https://github.com/NVIDIA/nvidia-docker
источник
Обновлен для cuda-8.0 в Ubuntu 16.04
Установите докер https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
Создайте следующий образ, который включает в себя драйверы nvidia и набор инструментов cuda
Dockerfile
sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm <built-image> ./deviceQuery
Вы должны увидеть вывод, похожий на:
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GRID K520 Result = PASS
источник
Чтобы использовать графический процессор из Docker-контейнера, вместо использования родного Docker, используйте Nvidia-Docker. Для установки докера Nvidia используйте следующие команды
источник
Используйте x11docker от mviereck:
https://github.com/mviereck/x11docker#hardware-acceleration говорит
Этот скрипт действительно удобен, так как обрабатывает все настройки и настройки. Запуск образа докера на X с помощью gpu так же прост, как
источник