Docker 让 Nvidia GPU 在 Docker 构建过程中可见

Mic*_*ain 5 python-3.x docker pytorch nvidia-docker

我想构建一个 docker 映像,在其中使用 pytorch 编译自定义内核。因此,我需要访问可用的 GPU,以便在 docker 构建过程中编译自定义内核。在主机上,一切都已设置,包括nvidia-container-runtimenvidia-docker、Nvidia-Drivers、Cuda 等。以下命令显示主机系统上的 docker 运行时信息:

$ docker info|grep -i runtime
 Runtimes: nvidia runc
 Default Runtime: runc
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,在我的例子中,docker 的默认运行时是runc. 我认为将默认运行时从 更改为runc可以nvidia解决此问题,如此处所述

建议的解决方案不适用于我的情况,因为:

  • 我无权更改我使用的系统上的默认运行时
  • 我无权更改该daemon.json文件

有没有办法在 Dockerfile 的构建过程中访问 GPU,以便为 CPU 和 GPU 编译自定义 pytorch 内核(在我的例子中是 DCNv2)?

这是我的 Dockerfile 的最小示例,用于重现此问题。在此图中,DCNv2 仅针对 CPU 进行编译,而不针对 GPU 进行编译。

FROM nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04

RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata && \
    apt-get install -y --no-install-recommends software-properties-common && \
    add-apt-repository ppa:deadsnakes/ppa && \
    apt update && \
    apt install -y --no-install-recommends python3.6 && \
    apt-get install -y --no-install-recommends \
    build-essential \
    python3.6-dev \
    python3-pip \
    python3.6-tk \
    pkg-config \
    software-properties-common \
    git

RUN ln -s /usr/bin/python3 /usr/bin/python & \
    ln -s /usr/bin/pip3 /usr/bin/pip

RUN python -m pip install --no-cache-dir --upgrade pip setuptools && \
    python -m pip install --no-cache-dir torch==1.4.0 torchvision==0.5.0

RUN git clone https://github.com/CharlesShang/DCNv2/

#Compile DCNv2
WORKDIR /DCNv2
RUN bash ./make.sh

# clean up
RUN apt-get clean && \
    rm -rf /var/lib/apt/lists/*

#Build: docker build -t my_image .
#Run: docker run -it my_image
Run Code Online (Sandbox Code Playgroud)

一个可行的非最佳解决方案如下:

  • 注释掉RUN bash ./make.shDockerfile 中的行
  • 构建镜像:docker build -t my_image .
  • 以交互模式运行图像:docker run --gpus all -it my_image
  • 手动编译DCNv2:root@1cd02fd62461:/DCNv2# ./make.sh

这里 DCNv2 是针对 CPU 和 GPU 编译的,但这在我看来不是一个理想的解决方案,因为每次启动容器时我都必须编译 DCNv2。