Docker 容器将一个软件包在一个完整的文件系统中,该文件系统包含运行所需的一切:代码、运行时、系统工具、系统库——任何可以安装在服务器上的东西。这保证了软件无论其环境如何,都将始终运行相同的程序。
最初的 Docker 不能调用 GPU。
解决这个问题的早期解决方案之一是在容器中完全安装 NVIDIA 驱动程序,并在启动时映射到与 NVIDIA GPUs (例如 /dev/nvidia0 )对应的字符设备中。此解决方案很脆弱,因为主机驱动程序的版本必须与容器中安装的驱动程序版本完全匹配。这一要求大大降低了这些早期容器的可移植性,破坏了 Docker 更重要的特性之一。[^1]
为了让 Docker 支持 NVIDIA 显卡,英伟达公司开发了 NVIDIA Docker。该软件是对 Docker 的包装,使得容器能够看到并使用宿主机的 NVIDIA 显卡。
根据网上的资料,从 Docker 19 版本之后,NVIDIA Docker 成为了过去式。不需要单独去下 NVIDIA Docker 这个独立的 Docker 应用程序,也就是说 GPU Docker 所需要的 Runtime 被集成进 Docker 中,使用的时候用 --gpus 参数来控制。(PS:我使用的服务器安装的 Docker 版本为 20.10 但是并不能识别 --gpus 参数,原因不详,但在安装 NVIDIA Docker 并重启 Docker 服务后恢复正常)
正如上文所说,在使用 Docker 调用 GPU 时,遇到了不能识别 --gpus 参数的报错,无奈重新安装 NVIDIA Docker,在安装过程中又遇到一些报错,遂记录下来备用。
NVIDIA 官方地址
首先安装 docker(此处略)
安装 nvidia docker
# Setup the package repository and the GPG key
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# Install the nvidia-docker2 package (and dependencies) after updating the package listing
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
# Restart the Docker daemon to complete the installation after setting the default runtime
$ sudo systemctl restart docker
# test
$ sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
可能原因:不能访问 https://nvidia.github.io/libnvidia-container/gpgkey
解决:打开此网址,会自动下载 gpgkey 文件,之后 cd 到下载路径下运行
$ sudo apt-key add gpgkey
成功后会输出 OK
原因:
$ curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
在这条命令中读取 https://nvidia.github.io/libnvidia-container/ubuntu20.04/libnvidia-container.list 这个网址内的信息并写到 /etc/apt/sources.list.d/nvidia-docker.list 文件中。查看本地相应文件,发现该文件为空,说明在写入文件时出现了问题,可能与文件权限有关,从而影响了下载源的更新。
解决:访问上述地址,复制网址中的文本,通过 sudo vim 写入到本地的相应文件。
注意:
1、$distribution 需要替换为相应系统版本号,如上面链接中的 ubuntu20.04。
2、对于 1.6.0 之前的 NVIDIA Container Toolkit 版本,应使用 nvidia-docker 存储库而不是上面的 libnvidia-container 存储库。
之后按照官方的方法安装和测试。
# Install the nvidia-docker2 package (and dependencies) after updating the package listing
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
# Restart the Docker daemon to complete the installation after setting the default runtime
$ sudo systemctl restart docker
# test
$ sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
输出
$ docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
Wed Aug 31 01:49:18 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.141.03 Driver Version: 470.141.03 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 NVIDIA GeForce ... Off | 00000000:01:00.0 On | N/A |
| 30% 37C P8 15W / 170W | 432MiB / 12045MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
[1] 英伟达博客
参考
https://blog.csdn.net/qq_41719643/article/details/120750359
https://www.jianshu.com/p/f25ccedb996e
https://www.cnblogs.com/chester-cs/p/14444247.html