Гаразд, я нарешті зумів це зробити, не використовуючи привілейований режим.
Я працюю на сервері ubuntu 14.04 і використовую останню версію cuda (6.0.37 для Linux 13.04 64 біт).
Підготовка
Встановіть драйвер nvidia та cuda на свій хост. (це може бути трохи хитро, тому я запропоную вам дотримуватися цього посібника /ubuntu/451672/installing-and-testing-cuda-in-ubuntu-14-04 )
УВАГА: Дійсно важливо зберігати файли, які використовувались для установки ходу cuda
Запустіть Docker Daemon для запуску за допомогою lxc
Нам потрібно запустити демон-докер за допомогою драйвера 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
Рядок Driver Execution повинен виглядати так:
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, який дозволяє нам дозволити нашому контейнеру отримати доступ до цих пристроїв. Варіант такий: (я рекомендую використовувати * для другорядного числа, оскільки це зменшить довжину команди запуску)
--lxc-conf = 'lxc.cgroup.devices.allow = c [основний номер]: [другорядне число або *] rwm'
Тож якщо я хочу запустити контейнер (припустимо, ваше ім'я зображення - куда).
docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda