我正在寻找一种从docker容器内使用GPU的方法。
容器将执行任意代码,所以我不想使用特权模式。
任何建议吗?
从以前的研究中,我了解到运行-v和/或LXC cgroup是要走的路,但我不确定如何把它拉下来
我正在寻找一种从docker容器内使用GPU的方法。
容器将执行任意代码,所以我不想使用特权模式。
任何建议吗?
从以前的研究中,我了解到运行-v和/或LXC cgroup是要走的路,但我不确定如何把它拉下来
当前回答
在ubuntu 16.04上为cuda-8.0更新
安装docker https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04 构建以下映像,其中包括nvidia驱动程序和cuda工具包
Dockerfile
FROM ubuntu:16.04
MAINTAINER Jonathan Kosgei <jonathan@saharacluster.com>
# A docker container with the Nvidia kernel module and CUDA drivers installed
ENV CUDA_RUN https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run
RUN apt-get update && apt-get install -q -y \
wget \
module-init-tools \
build-essential
RUN cd /opt && \
wget $CUDA_RUN && \
chmod +x cuda_8.0.44_linux-run && \
mkdir nvidia_installers && \
./cuda_8.0.44_linux-run -extract=`pwd`/nvidia_installers && \
cd nvidia_installers && \
./NVIDIA-Linux-x86_64-367.48.run -s -N --no-kernel-module
RUN cd /opt/nvidia_installers && \
./cuda-linux64-rel-8.0.44-21122537.run -noprompt
# Ensure the CUDA libs and binaries are in the correct environment variables
ENV LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64
ENV PATH=$PATH:/usr/local/cuda-8.0/bin
RUN cd /opt/nvidia_installers &&\
./cuda-samples-linux-8.0.44-21122537.run -noprompt -cudaprefix=/usr/local/cuda-8.0 &&\
cd /usr/local/cuda/samples/1_Utilities/deviceQuery &&\
make
WORKDIR /usr/local/cuda/samples/1_Utilities/deviceQuery
运行容器
sudo docker命令-ti——device /dev/ nvidaa0:/dev/ nvidaa0——device /dev/ nvidaactl:/dev/ nvidaactl——device /dev/nvidia-uvm:/dev/nvidia-uvm <built-image> ./deviceQuery . uvm:/dev/nvidia-uvm
你应该看到类似的输出:
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GRID K520 结果=通过
其他回答
我们刚刚发布了一个实验性的GitHub存储库,它可以简化在Docker容器中使用NVIDIA gpu的过程。
在ubuntu 16.04上为cuda-8.0更新
安装docker https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04 构建以下映像,其中包括nvidia驱动程序和cuda工具包
Dockerfile
FROM ubuntu:16.04
MAINTAINER Jonathan Kosgei <jonathan@saharacluster.com>
# A docker container with the Nvidia kernel module and CUDA drivers installed
ENV CUDA_RUN https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run
RUN apt-get update && apt-get install -q -y \
wget \
module-init-tools \
build-essential
RUN cd /opt && \
wget $CUDA_RUN && \
chmod +x cuda_8.0.44_linux-run && \
mkdir nvidia_installers && \
./cuda_8.0.44_linux-run -extract=`pwd`/nvidia_installers && \
cd nvidia_installers && \
./NVIDIA-Linux-x86_64-367.48.run -s -N --no-kernel-module
RUN cd /opt/nvidia_installers && \
./cuda-linux64-rel-8.0.44-21122537.run -noprompt
# Ensure the CUDA libs and binaries are in the correct environment variables
ENV LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64
ENV PATH=$PATH:/usr/local/cuda-8.0/bin
RUN cd /opt/nvidia_installers &&\
./cuda-samples-linux-8.0.44-21122537.run -noprompt -cudaprefix=/usr/local/cuda-8.0 &&\
cd /usr/local/cuda/samples/1_Utilities/deviceQuery &&\
make
WORKDIR /usr/local/cuda/samples/1_Utilities/deviceQuery
运行容器
sudo docker命令-ti——device /dev/ nvidaa0:/dev/ nvidaa0——device /dev/ nvidaactl:/dev/ nvidaactl——device /dev/nvidia-uvm:/dev/nvidia-uvm <built-image> ./deviceQuery . uvm:/dev/nvidia-uvm
你应该看到类似的输出:
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GRID K520 结果=通过
Regan的回答很好,但有点过时了,因为正确的方法是避免使用lxc执行上下文,因为Docker从Docker 0.9开始就放弃了lxc作为默认执行上下文。
相反,最好通过——device标志告诉docker nvidia设备,并且只使用本机执行上下文而不是lxc。
环境
这些指令在以下环境中进行了测试:
Ubuntu 14.04 CUDA 6.5 AWS GPU实例。
在主机上安装nvidia驱动程序和cuda
请参阅运行Ubuntu 14.04的AWS GPU实例上的CUDA 6.5来获得您的主机设置。
安装码头工人
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update && sudo apt-get install lxc-docker
找到你的nvidia设备
ls -la /dev | grep nvidia
crw-rw-rw- 1 root root 195, 0 Oct 25 19:37 nvidia0
crw-rw-rw- 1 root root 195, 255 Oct 25 19:37 nvidiactl
crw-rw-rw- 1 root root 251, 0 Oct 25 19:37 nvidia-uvm
运行预安装nvidia驱动的Docker容器
我已经创建了一个预安装cuda驱动程序的docker映像。如果您想知道这个映像是如何构建的,dockerfile可以在dockerhub上找到。
您需要自定义此命令以匹配您的nvidia设备。以下是对我有效的方法:
$ sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm tleyden5iwx/ubuntu-cuda /bin/bash
检查CUDA是否正确安装
这应该在刚刚启动的docker容器中运行。
安装CUDA样本:
$ cd /opt/nvidia_installers
$ ./cuda-samples-linux-6.5.14-18745345.run -noprompt -cudaprefix=/usr/local/cuda-6.5/
构建deviceQuery示例:
$ cd /usr/local/cuda/samples/1_Utilities/deviceQuery
$ make
$ ./deviceQuery
如果一切正常,您应该看到以下输出:
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 6.5, NumDevs = 1, Device0 = GRID K520
Result = PASS
要从docker容器中使用GPU,而不是使用本地docker,使用Nvidia-docker。要安装Nvidia docker,请使用以下命令
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-
docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker
sudo pkill -SIGHUP dockerd # Restart Docker Engine
sudo nvidia-docker run --rm nvidia/cuda nvidia-smi # finally run nvidia-smi in the same container
NVIDIA最近的改进提供了一种更健壮的方式来实现这一点。
从本质上讲,他们已经找到了一种方法,可以避免在容器内部安装CUDA/GPU驱动程序,并使其与主机内核模块匹配。
相反,驱动程序在主机上,容器不需要它们。 现在需要修改docker-cli。
这很好,因为现在容器更加便携了。
Ubuntu上的一个快速测试:
# Install nvidia-docker and nvidia-docker-plugin
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb
# Test nvidia-smi
nvidia-docker run --rm nvidia/cuda nvidia-smi
详情见: 启用gpu的Docker容器 和:https://github.com/NVIDIA/nvidia-docker