现在有--gpu
标记 gitlab 运行程序版本 >13.9。你应该使用那些 insetad。如果您坚持使用旧版本,请继续阅读。
有多个步骤:
- 在主机上安装 nvidia 驱动程序
- 安装 nvidia-docker2
- 使用 CUDA 构建 docker 镜像
- 让它在 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]