前几天发现公司服务器上的docker不能用了(在运行中的docker可正常使用,但是不能start和run一个容器),定位原因是服务器上存在多个版本的NVIDIA驱动。可能是服务器自更新或者有同事不小心安装了相关的依赖项。
现在是希望在不重启服务器的前提下,找到问题并解决它。
一、遇到的情况(两种)
docker run或者start时报错如下:
Error response from daemon: OCI runtime create failed: unable to retrieve OCI runtime error (open /run/containerd/io.containerd.runtime.v1.linuxg.json: no such file or directory): exec: "nvidia-container-runtime": executable file not found in $PATH: : unknownError: failed to start containers: xxx
nvidia-smi时报错如下:
Failed to initialize NVML: Driver/library version mismatch
二、定位问题
2.1 查看nvidia版本
>>> cat /proc/driver/nvidia/versionNVRM version: NVIDIA UNIX x86_64 Kernel Module 460.56 Tue Feb 23 23:31:36 UTC 2021GCC version: gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
2.2 查看系统更新日志(无异常)
# 列出日志中与NVIDIA有关的信息>>> cat /var/log/dpkg.log |grep nvidia
# 将所有与安装于更新有关的log保存在log.dat中>>> grep "install|upgrade" /var/log/dpkg.log | grep "2021-10" > log.dat
2.3 查看NVIDIA驱动版本以及其他依赖项
>>> sudo dpkg --list |grep nvidia-*
三、尝试解决
3.1 解决nvidia-smi报错
同事在不重启电脑的情况下,将多版本卸载后重新安装了一个NVIDIA-460驱动。但是具体安装方式我不清楚。安装后,查询结果如下:
解决了nvidia-smi报错问题,但是docker仍不能使用。
对比之前截图,发现少了NVIDIA-docker相关的软件。按照本系列的《Linux系统下的cuda更新安装》教程逐步定位检查。确认 ① NVIDIA驱动更新OK;② CUDA安装 OK;③ cuDNN安装可能存在问题(示例报错:ERROR: cuda failure (unknown error) in error_util.h:91 \ Aborting…)
3.2 解决cuDNN示例报错问题
按照Linux系统下的cuda更新安装(二)中所示,重新安装了一次cuDNN,但是问题仍存在。没办法定位这个问题产生的影响,因此先解决docker的start与run的问题吧。
3.3 在线安装nvidia-docker2
安装nvidia-docker2的前提是安装好docker,可以用docker --version来查看自己安装的docker版本。
① 首先最简单的安装方式:sudo apt install -y nvidia-docker2。(一般在有网络情况下,执行这条命令就可以了。)
② 是没找到相关的安装包资源吗?那就试试sudo apt-get update。得到了以下报错信息
③ 那么试试添加nvidia-docker的源:curl -s -L ``[https://nvidia.github.io/nvidia-docker/gpgkey](https://nvidia.github.io/nvidia-docker/gpgkey)`` | sudo apt-key add -得到了gpg: no valid OpenPGP data found.
网上查了一下,说是这个代码可以分为两部分执行,那就先下载gpg文件:curl -O https://packages.cloud.google.com/apt/doc/apt-key.gpg。得到了超时报错。
好,至此已经忙了几个小时。虽然还没装好环境,但是得到一个大致的方向,就是公司电脑不能连外网(半年前还可以连,所以之前没往这个方向去想)。在和运维支持部的同事确认之后,开始寻找离线安装nvidia-docker2的方法。
3.4 离线安装nvidia-docker2
主要流程:
① 下载libnvidia-container;
sudo dpkg -i libnvidia-container1_1.5.1-1_amd64.debsudo dpkg -i libnvidia-container-tools_1.5.1-1_amd64.deb
② 下载nvidia-container-toolkit和nvidia-container-runtime;
sudo dpkg -i nvidia-container-toolkit_1.5.1-1_amd64.debsudo dpkg -i nvidia-container-runtime_3.5.0-1_amd64.deb
③ 下载nvidia-docker2
sudo dpkg -i nvidia-docker2_2.6.0-1_all.deb
④ 重启docker
sudo service docker restart
遇到的问题:
① 安装nvidia-container-toolkit_1.5.1时遇到缺少libnvidia-container-toolkit依赖项 。
用命令sudo apt-get -f -y install没有解决该问题,而是又一次提醒我无法连接网络的这一实事。
后面安装提示下载了libnvidia-container1以及对应版本的libnvidia-container-tools。
参考文章:
- 如何离线安装nvidi-docker:https://github.com/NVIDIA/nvidia-docker/issues/1134。文中列出了安装包的下载路径及使用方法,足以解决问题。但是刚接触时纠结于deb的版本问题,所以没参考。
- nvidia container toolkit官方安装指南:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker
- 一个较详细的docker安装指南:https://www.cnblogs.com/ytwang/p/14809112.html(但是要求在一个有网络的环境下用命令行下载相关安装包,所以只参考了思路,没有条件实现)
- 相关安装包索引:https://mirror.cs.uchicago.edu/nvidia-docker/libnvidia-container/stable/ubuntu18.04/amd64/
- 最终参考的文章:https://zhuanlan.zhihu.com/p/397638816

