这篇文章上次修改于 686 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

首先,庆祝一下我在被环境折磨好几天后终于让项目跑起来了!!
话不多说,进入正题。

环境配置

温馨提示:本文默认您已在宿主机上正确安装Nvidia驱动和Cuda驱动!
请使用"nvidia-smi"命令检查您的驱动程序是否正常!!

懒人脚本

ps: 如果不想折腾可以用C4写的脚本(仅适用于CentOS||RHEL 7/8!!)一键安装就不用听我bb了
地址:http://ocr.stariver.org/fs/init_rhel_centos.sh
用法(需root或sudo执行):

wget http://ocr.stariver.org/fs/init_rhel_centos.sh -O fxxknvidia.sh && chmod +X fxxknvidia.sh && bash fxxknvidia.sh

正题

先安装一些重要软件包:

sudo yum install -y yum-utils   device-mapper-persistent-data   lvm2 #安装一些重要软件包

然后加上Docker-CE和Nvidia的Yum Repo:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
sudo yum-config-manager     --add-repo     https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo

继续安装Docker-CE和Nvidia-Container-Runtime:

yum install docker-ce docker-ce-cli containerd.io nvidia-container-runtime -y

安装完Docker别忘记开启daemon和开机自启动:

systemctl start docker && systemctl enable docker

之后根据Nvidia-Container-Runtime的位置配置一下daemon:

whereis nvidia-container-runtime

tee /etc/docker/daemon.json <<EOF
{
    "runtimes": {
        "nvidia": {
            "path": $Path_Of_Nvidia-Container-Runtime,
            "runtimeArgs": []
        }
    }
}
EOF

走到这,理论上您已成功配置环境,您可以通过以下命令检验:

sudo docker run --gpus all --rm nvidia/cuda:10.2-base-centos8 nvidia-smi

如果没有任何报错,恭喜你成功配置了GPU Docker环境,可以开始破坏环境进行进一步部署了。

注意事项

使用新版(19.03或更高)

由于Docker-CE中,19.03及更高版本才开始支持这个特性,在这之前GPU Docker都是通过nvidia-docker实现的,如果您原来已经安装了旧版Docker,请重新安装或尝试升级。

无法拉取 nvidia/cuda:latest

报错通常为:

Error response from daemon: manifest for nvidia/cuda:latest not found: manifest unknown: manifest
unknown

导致这种情况的原因Nvidia在CUDA、CUDAGL与OPENGL仓库内已经弃用"latest"标签,官方原文通告如下:

The "latest" tag for CUDA, CUDAGL, and OPENGL images has been deprecated on NGC and Docker Hub.

With the removal of the latest tag, the following use case will result in the "manifest unknown" error.

这种情况请前往这里查看您所需的镜像并直接加tag来拉取:

docker pull nvidia/cuda:10.2-base-centos8

上述问题也会出现在docker run的时候本地没有相应镜像的情况下。

下载与宿主机对应cuda版本的镜像

这算是个...玄学问题?
如果容器与宿主机的cuda版本不对应,可能导致一些奇奇怪怪的问题(亲身体会过)。
所以还是建议宿主机和容器的cuda版本对应,例如宿主机的cuda版本是11.2,容器的cuda版本也应该是11.2。