从docker容器中使用GPU?

Reg*_*gan 138 cuda docker

我正在寻找一种从docker容器中使用GPU的方法.

容器将执行任意代码,因此我不想使用特权模式.

有小费吗?

从以前的研究中我了解到run -v和/或LXC cgroup是要走的路,但我不确定如何完全解决这个问题

tle*_*den 126

Regan的答案很棒,但它有点过时,因为正确的方法是避免lxc执行上下文,因为Docker已将LXC作为docker 0.9的默认执行上下文.

相反,最好通过--device标志告诉docker关于nvidia设备,并且只使用本机执行上下文而不是lxc.

环境

这些说明在以下环境中进行了测试:

  • Ubuntu 14.04
  • CUDA 6.5
  • AWS GPU实例.

在您的主机上安装nvidia驱动程序和cuda

请参阅运行Ubuntu 14.04的AWS GPU实例上的CUDA 6.5以获取主机设置.

安装Docker

$ 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
Run Code Online (Sandbox Code Playgroud)

找到你的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
Run Code Online (Sandbox Code Playgroud)

运行预先安装了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
Run Code Online (Sandbox Code Playgroud)

验证CUDA已正确安装

这应该从刚刚启动的docker容器内部运行.

安装CUDA样本:

$ cd /opt/nvidia_installers
$ ./cuda-samples-linux-6.5.14-18745345.run -noprompt -cudaprefix=/usr/local/cuda-6.5/
Run Code Online (Sandbox Code Playgroud)

构建deviceQuery示例:

$ cd /usr/local/cuda/samples/1_Utilities/deviceQuery
$ make
$ ./deviceQuery   
Run Code Online (Sandbox Code Playgroud)

如果一切正常,您应该看到以下输出:

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 6.5, NumDevs =    1, Device0 = GRID K520
Result = PASS
Run Code Online (Sandbox Code Playgroud)

  • 如果不需要lxc,为什么要安装lxc-docker? (6认同)
  • 我在主机上有CUDA 5.5,在你的映像创建的容器中有CUDA 6.5.CUDA正在处理主机,我将设备传递给容器.容器通过`ls -la/dev |看到GPU grep nvidia`但是CUDA找不到任何支持CUDA的设备:`./ setupQuery``./ setupQuery Starting ...``CUDA设备查询(Runtime API)版本(CUDART静态链接)``cudaGetDeviceCount返回38`` - >没有检测到支持CUDA的设备``Result = FAIL`是不是因为主机和容器中的CUDA库不匹配? (4认同)
  • 你能解释为什么图像需要安装 nvidia 驱动程序吗?我认为只有主机安装 nvidia 驱动程序(并使用 --device ...)就足够了? (3认同)
  • 目前,如果您将Windows作为主机,则无法执行此操作. (2认同)

Reg*_*gan 40

好吧,我终于设法在不使用--privileged模式的情况下完成了.

我正在运行ubuntu服务器14.04,我正在使用最新的cuda(6.0.37 for linux 13.04 64 bit).


制备

在您的主机上安装nvidia驱动程序和cuda.(这可能有点棘手,所以我建议你按照这个指南https://askubuntu.com/questions/451672/installing-and-testing-cuda-in-ubuntu-14-04)

注意:保留用于主机cuda安装的文件非常重要


使用lxc运行Docker Daemon

我们需要使用lxc驱动程序运行docker守护程序,以便能够修改配置并让容器访问设备.

一次使用:

sudo service docker stop
sudo docker -d -e lxc
Run Code Online (Sandbox Code Playgroud)

永久配置 修改位于/ etc/default/docker中的docker配置文件通过添加'-e lxc'来更改DOCKER_OPTS行这是修改后的我的行

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc"
Run Code Online (Sandbox Code Playgroud)

然后使用重启守护进程

sudo service docker restart
Run Code Online (Sandbox Code Playgroud)

如何检查守护进程是否有效使用lxc驱动程序?

docker info
Run Code Online (Sandbox Code Playgroud)

执行驱动程序行应如下所示:

Execution Driver: lxc-1.0.5
Run Code Online (Sandbox Code Playgroud)

使用NVIDIA和CUDA驱动程序构建映像.

这是一个用于构建CUDA兼容映像的基本Dockerfile.

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.
Run Code Online (Sandbox Code Playgroud)

运行你的形象.

首先,您需要确定与您的设备相关的主要号码.最简单的方法是执行以下命令:

ls -la /dev | grep nvidia
Run Code Online (Sandbox Code Playgroud)

如果结果为空,请使用启动主机上的其中一个样本.结果应该是这样的 在此输入图像描述 如您所见,组和日期之间有一组2个数字.这两个数字称为主要和次要数字(按此顺序写入)并设计一个设备.为方便起见,我们将使用主要数字.

为什么我们激活了lxc驱动程序?使用允许我们允许容器访问这些设备的lxc conf选项.选项是:(我建议使用*作为次要编号,因为它会减少运行命令的长度)

--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
Run Code Online (Sandbox Code Playgroud)

  • 然后我成功地将所有`/ dev/nvidiao`,`/ dev/nvidia1`,`/ dev/nvidiactl`和`/ dev/nvidia-uvm`暴露为`--device`.虽然不知道为什么. (4认同)
  • 感谢您对`/ dev/nvidia*`@Regan的提示.对@ChillarAnand我做了一个[cuda-docker](https://registry.hub.docker.com/u/shiquanwang/docker-cuda/) (2认同)

3XX*_*XX0 30

我们刚刚发布了一个实验性的GitHub存储库,它可以简化在Docker容器中使用NVIDIA GPU的过程.

  • 没有Windows支持.运行CUDA容器需要用于Linux的Nvidia驱动程序以及访问代表GPU的Linux设备,例如/ dev/nvidia0.当Docker安装在Windows上并在VirtualBox虚拟机内运行时,这些设备和驱动程序不可用. (6认同)
  • 有窗户支持吗?它似乎不是,但也许我错过了一些东西. (4认同)

Mat*_*att 20

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
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅:支持 GPU的Docker容器 和:https://github.com/NVIDIA/nvidia-docker

  • 实际上,您能否给出使用 nvidia-docker 有意义的实际场景? (2认同)

Jon*_*han 17

更新了ubuntu 16.04上的cuda-8.0

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
Run Code Online (Sandbox Code Playgroud)
  1. 运行你的容器

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

  • 我得到以下输出.cudaGetDeviceCount返回38 - >没有检测到支持CUDA的设备Result = FAIL (3认同)

Sid*_*hou 7

目标:

我的目标是制作一个支持 CUDA 的 docker 镜像,而不使用 nvidia/cuda 作为基础镜像。因为我有一些自定义的 jupyter 图像,我想以此为基础。

先决条件:

主机已经安装了nvidia 驱动程序CUDA 工具包nvidia-container-toolkit。请参阅官方文档和Rohit 的回答

测试 nvidia 驱动程序和 CUDA 工具包是否正确安装:nvidia-smi在主机上,它应该显示正确的“驱动程序版本”和“CUDA 版本”并显示 GPU 信息。

测试 nvidia-container-toolkit 是否正确安装: docker run --rm --gpus all nvidia/cuda:latest nvidia-smi

文件

我发现我假设成为正式Dockerfile NVIDIA / CUDA这里我“扁平化”的,附加的内容,我Dockerfile和测试它可以很好地工作:

FROM sidazhou/scipy-notebook:latest
# FROM ubuntu:18.04 

###########################################################################
# See https://gitlab.com/nvidia/container-images/cuda/-/blob/master/dist/10.1/ubuntu18.04-x86_64/base/Dockerfile
# See https://sarus.readthedocs.io/en/stable/user/custom-cuda-images.html
###########################################################################
USER root

###########################################################################
# base
RUN apt-get update && apt-get install -y --no-install-recommends \
    gnupg2 curl ca-certificates && \
    curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub | apt-key add - && \
    echo "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/cuda.list && \
    echo "deb https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64 /" > /etc/apt/sources.list.d/nvidia-ml.list && \
    apt-get purge --autoremove -y curl \
    && rm -rf /var/lib/apt/lists/*

ENV CUDA_VERSION 10.1.243
ENV CUDA_PKG_VERSION 10-1=$CUDA_VERSION-1

# For libraries in the cuda-compat-* package: https://docs.nvidia.com/cuda/eula/index.html#attachment-a
RUN apt-get update && apt-get install -y --no-install-recommends \
    cuda-cudart-$CUDA_PKG_VERSION \
    cuda-compat-10-1 \
    && ln -s cuda-10.1 /usr/local/cuda && \
    rm -rf /var/lib/apt/lists/*

# Required for nvidia-docker v1
RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && \
    echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf

ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64


###########################################################################
#runtime next
ENV NCCL_VERSION 2.7.8

RUN apt-get update && apt-get install -y --no-install-recommends \
    cuda-libraries-$CUDA_PKG_VERSION \
    cuda-npp-$CUDA_PKG_VERSION \
    cuda-nvtx-$CUDA_PKG_VERSION \
    libcublas10=10.2.1.243-1 \
    libnccl2=$NCCL_VERSION-1+cuda10.1 \
    && apt-mark hold libnccl2 \
    && rm -rf /var/lib/apt/lists/*

# apt from auto upgrading the cublas package. See https://gitlab.com/nvidia/container-images/cuda/-/issues/88
RUN apt-mark hold libcublas10


###########################################################################
#cudnn7 (not cudnn8) next

ENV CUDNN_VERSION 7.6.5.32

RUN apt-get update && apt-get install -y --no-install-recommends \
    libcudnn7=$CUDNN_VERSION-1+cuda10.1 \
    && apt-mark hold libcudnn7 && \
    rm -rf /var/lib/apt/lists/*


ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES all
ENV NVIDIA_REQUIRE_CUDA "cuda>=10.1"


###########################################################################
#docker build -t sidazhou/scipy-notebook-gpu:latest .

#docker run -itd -gpus all\
#  -p 8888:8888 \
#  -p 6006:6006 \
#  --user root \
#  -e NB_UID=$(id -u) \
#  -e NB_GID=$(id -g) \
#  -e GRANT_SUDO=yes \
#  -v ~/workspace:/home/jovyan/work \
#  --name sidazhou-jupyter-gpu \
#  sidazhou/scipy-notebook-gpu:latest

#docker exec sidazhou-jupyter-gpu python -c "import tensorflow as tf; print(tf.config.experimental.list_physical_devices('GPU'))"
Run Code Online (Sandbox Code Playgroud)


Roh*_*hit 5

编写更新后的答案,因为到目前为止大多数已经存在的答案已经过时了。

早于Docker 19.03要求nvidia-docker2--runtime=nvidia标志的版本。

从开始Docker 19.03,您需要安装nvidia-container-toolkit软件包,然后使用该--gpus all标志。

所以,这是基础

套件安装

nvidia-container-toolkit根据Github上的官方文档安装软件包。

对于基于Redhat的操作系统,请执行以下命令集:

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo

$ sudo yum install -y nvidia-container-toolkit
$ sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

对于基于Debian的操作系统,请执行以下命令集:

# Add the package repositories
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
$ sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)

在GPU支持下运行Docker

docker run --name my_all_gpu_container --gpus all -t nvidia/cuda
Run Code Online (Sandbox Code Playgroud)

请注意,该标志--gpus all用于将所有可用gpu分配给docker容器。

要将特定的GPU分配给Docker容器(如果您的计算机中有多个GPU)

docker run --name my_first_gpu_container --gpus device=0 nvidia/cuda
Run Code Online (Sandbox Code Playgroud)

要么

docker run --name my_first_gpu_container --gpus '"device=0"' nvidia/cuda
Run Code Online (Sandbox Code Playgroud)

  • 截至 2019 年,这是在 docker 容器内使用 GPU 的正确方法。 (8认同)
  • 有人曾经在 AWS 上的 Batch 作业中尝试过这个吗? (5认同)
  • NVIDIA 官方说明 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker 说要安装 nvidia-docker2。它们应该更新吗? (3认同)