如何在 gitlab-ci docker 执行器中使用 cuda

2024-04-06

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

额外细节:

  • 在我们的构建服务器上安装 nvidia GPU 没问题 - 我们有一些备用 GPU 可用于此目的
  • 我们没有使用ubuntu或centOS,所以我们不能使用nvidia 的 cuda 容器 https://hub.docker.com/r/nvidia/cuda/直接地
  • 您无法提供--runtime参数到 gitlab CI,所以你不能使用 nvidia 建议的 docker 调用。 [编辑:实际上,你现在可以了。看https://gitlab.com/gitlab-org/gitlab-runner/merge_requests/764 https://gitlab.com/gitlab-org/gitlab-runner/merge_requests/764 ]

现在有--gpu标记 gitlab 运行程序版本 >13.9。你应该使用那些 insetad。如果您坚持使用旧版本,请继续阅读。


有多个步骤:

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

请注意,如果您只想编译 CUDA 代码而不需要运行它,则不需要使用 nvidia-docker2,在主机 PC 上安装 nvidia 驱动程序,并且无需执行任何特殊步骤即可使其运行gitlab CI。 (即你只需要做第3步)

恐怕我对 docker 不太熟悉,所以如果我混合了容器和镜像,我很抱歉。如果有更多知识的人想要修复有关 docker 的任何拼写错误,我们将不胜感激。

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

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

第2步:安装nvidia-docker2

我当前的测试 PC 是 archlinux,所以这是从 AUR 使用它的情况。 nVidia 提供了多个操作系统的存储库,因此请参阅Nvidia-docker https://github.com/NVIDIA/nvidia-dockergithub 页面。

您应该按照快速入门指南测试您的 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 报告了 Cuda 10。我认为这是因为主机 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 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"

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

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

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

在网络上进行研究时,大多数消息来源都会告诉您,您无法提供--runtime来自 gitlab 运行器配置的标志。其实按照这个合并请求 https://gitlab.com/gitlab-org/gitlab-runner/merge_requests/764, 你可以。为此,您必须编辑/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]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 gitlab-ci docker 执行器中使用 cuda 的相关文章

随机推荐