我如何在gitlab-ci docker executor中使用cuda

时间:2018-12-06 08:59:46

标签: docker cuda gitlab

我们正在使用gitlab持续集成来构建和测试我们的项目。最近,一个项目增加了对CUDA的要求,以启用GPU加速。我不想更改我们的管道(docker和gitlab-ci对我们来说运行良好),所以我想以某种方式使docker能够与nvidia GPU对话。

其他详细信息:

4 个答案:

答案 0 :(得分:1)

有多个步骤:

  1. 在主机PC上安装nvidia驱动程序
  2. 安装nvidia-docker2
  3. 使用CUDA构建docker镜像
  4. 让它在gitlab CI中工作

请注意,如果您只想编译CUDA代码并且不需要运行它,则无需使用nvidia-docker2,在主机PC上具有nvidia驱动程序,并且无需获取任何特殊步骤。它在gitlab CI中工作。 (即,您只需要执行步骤3)

恐怕我对docker不太熟悉,所以如果我将容器和图像混合在一起,我深表歉意。如果有更多知识的人想要修复有关docker的任何错字,将不胜感激。

步骤1:在主机PC上安装nvidia驱动程序

您在这里有两个选择。您可以使用主机操作系统的推荐步骤。这很容易,但是这意味着环境可能在构建服务器之间有所不同。 另一个选择是直接从nVidia(即https://www.nvidia.com/object/unix.html)下载安装程序,以便您可以将它与docker容器一起分发。

步骤2:安装nvidia-docker2

我当前的测试PC是archlinux,因此这是从AUR使用它的一种情况。 nVidia为多个操作系统提供了存储库,因此请参见nvidia-docker github页面上的快速入门指南。

您应该按照快速入门指南测试您的nvidia-docker安装。从主机PC运行以下命令: docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi应该运行并输出如下内容:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 415.18       Driver Version: 415.18       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  Off  | 00000000:02:00.0  On |                  N/A |
| 28%   39C    P0    24W / 120W |    350MiB /  6071MiB |      3%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

请注意,尽管我已经指定了基于9.0的映像,但是nvidia-smi报告了Cuda10。我认为这是因为在主机PC上安装了Cuda 10。 nvidia-docker文档说它将使用来自docker映像的cuda,所以这应该不是问题。

第3步:使用CUDA构建docker镜像

除非有充分的理由,否则应直接使用Nvidia dockerhub docker映像。就我而言,我想使用基于Debian的docker映像,但是Nvidia仅提供Ubuntu和CentOS的映像。幸运的是,Nvidia为其图像发布了dockerfile,因此您可以从其中复制其dockerfile的相关部分。我基于https://gitlab.com/nvidia/cuda/blob/ubuntu16.04/9.2/base/Dockerfile

dockerfile的魔术部分包括:

# Install cuda manually
RUN wget https://developer.nvidia.com/compute/cuda/9.2/Prod2/local_installers/cuda_9.2.148_396.37_linux

COPY install_cuda.exp install_cuda.exp
RUN mv cuda_* cuda_install_bin && \
    chmod +x cuda_install_bin && \
    expect install_cuda.exp && \
    rm cuda_*

# Magic copied from nvidia's cuda9.2 dockerfile at
# https://gitlab.com/nvidia/cuda/blob/ubuntu16.04/9.2/base/Dockerfile
ENV CUDA_VERSION 9.2.148


LABEL com.nvidia.volumes.needed="nvidia_driver"
LABEL com.nvidia.cuda.version="${CUDA_VERSION}"

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

# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility
ENV NVIDIA_REQUIRE_CUDA "cuda>=9.2"

“期望”命令允许您编写脚本以自动自动接受许可协议等。发布install_cuda.exp文件对我来说不是一个好主意(因为我无法接受您的同意),但就我而言,我接受了eula,同意将其安装在不受支持的操作系统上, em> not 安装图形驱动程序,安装了cuda,使用了默认路径,安装了指向usr / local / cuda的符号链接,并且未安装示例。 有关Expect的更多信息,请参见手册页 [online man page here]。 检查文件主要由expect -- "(y)es/(n)o/(q)uit:" { send "y\r" }

之类的行组成

您应该检查是否可以使用自己的容器运行nvidia-smi的nvidia-smi test命令。 (即docker run --runtime=nvidia -it your_image_here /bin/sh

第4步:让它在gitlab-ci中运行。

在网络上进行调查时,大多数消息来源告诉您,您无法从gitlab运行器配置中提供--runtime标志。实际上,根据此merge request,您可以。为此,您必须编辑/etc/gitlab-runner/config.toml并将runtime = "nvidia"添加到正确的位置。 例如,我的跑步者配置如下:

[[runners]]
  name = "docker-runner-test"
  url = "<<REDACTED>>"
  token = "<<REDACTED>>"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "build_machine"
    privileged = false
    disable_cache = false
    runtime = "nvidia"
    volumes = ["/cache"]
    pull_policy = "never"
    shm_size = 0
  [runners.cache]

答案 1 :(得分:1)

自 13.9 版起,GitLab Runners 支持 --gpus all 参数:

https://docs.gitlab.com/runner/configuration/gpus.html

答案 2 :(得分:0)

作为记录,如果有人偶然发现此问题,因为docker 19.03在docker client中包含对GPU的本机支持,因此此方法is now deprecated

但是,在撰写本文时,gitlab-runner does not support yet这个新的API。

我已经检查过,即使不赞成使用旧方法,现在也仍然可以使用。

答案 3 :(得分:0)

查看 GitLab 13.9(2021 年 2 月):

<块引用>

GitLab Runner 的 GPU 和智能调度支持

机器学习中使用的专门计算工作负载可以显着受益于对 GPU 的访问。
开发人员可以通过转发 --gpu 标志来配置 GitLab Runner 以利用 Docker 执行器中的 GPU。

您也可以在 GitLab’s fork of Docker Machine 的最新支持下使用它,这允许您accelerate workloads with attached GPUs
这样做有助于控制与可能昂贵的机器配置相关的成本。

参见 DocumentationIssue