Хорошо, мне наконец-то удалось это сделать без использования режима --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, чтобы иметь возможность изменять конфигурацию и предоставлять контейнеру доступ к устройству.
Одноразовое использование:
sudo service docker stop
sudo docker -d -e lxc
Постоянная конфигурация.
Измените свой файл конфигурации докера, расположенный в / etc / default / docker. Измените строку DOCKER_OPTS, добавив '-e lxc'. Вот моя строка после модификации.
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc"
Затем перезапустите демон, используя
sudo service docker restart
Как проверить, эффективно ли демон использует драйвер lxc?
docker info
Строка «Драйвер выполнения» должна выглядеть так:
Execution Driver: lxc-1.0.5
Создайте свой образ с помощью драйверов NVIDIA и CUDA.
Вот основной Dockerfile для создания CUDA-совместимого образа.
FROM ubuntu:14.04
MAINTAINER Regan <http://stackoverflow.com/questions/25185405/using-gpu-from-a-docker-container>
RUN apt-get update && apt-get install -y build-essential
RUN apt-get --purge remove -y nvidia*
ADD ./Downloads/nvidia_installers /tmp/nvidia > Get the install files you used to install CUDA and the NVIDIA drivers on your host
RUN /tmp/nvidia/NVIDIA-Linux-x86_64-331.62.run -s -N --no-kernel-module > Install the driver.
RUN rm -rf /tmp/selfgz7 > For some reason the driver installer left temp files when used during a docker build (i don't have any explanation why) and the CUDA installer will fail if there still there so we delete them.
RUN /tmp/nvidia/cuda-linux64-rel-6.0.37-18176142.run -noprompt > CUDA driver installer.
RUN /tmp/nvidia/cuda-samples-linux-6.0.37-18176142.run -noprompt -cudaprefix=/usr/local/cuda-6.0 > CUDA samples comment if you don't want them.
RUN export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64 > Add CUDA library into your PATH
RUN touch /etc/ld.so.conf.d/cuda.conf > Update the ld.so.conf.d directory
RUN rm -rf /temp/* > Delete installer files.
Запустите ваше изображение.
Сначала вам нужно определить свой основной номер, связанный с вашим устройством. Самый простой способ - выполнить следующую команду:
ls -la /dev | grep nvidia
Если результат пустой, используйте запуск одного из примеров на хосте, чтобы добиться цели. Результат должен выглядеть следующим образом.
Как видите, между группой и датой есть набор из 2 чисел. Эти 2 числа называются старшими и младшими (написаны в таком порядке) и предназначены для устройства. Мы просто будем использовать основные номера для удобства.
Почему мы активировали драйвер LXC? Использовать опцию lxc conf, которая позволяет нам разрешать нашему контейнеру доступ к этим устройствам. Опция: (я рекомендую использовать * для младшего номера, потому что это уменьшает длину команды run)
--lxc-conf = 'lxc.cgroup.devices.allow = c [старший номер]: [младший номер или *] rwm'
Так что, если я хочу запустить контейнер (Предположим, ваше изображение называется CUDA).
docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda