如果您使用的CUDA库需要匹配更高版本的NVIDIA驱动,请升级节点的NVIDIA驱动,即卸载旧版本驱动,然后安装新版本驱动。本文介绍如何手动升级GPU节点驱动。
前提条件
操作步骤
步骤一:下线节点与排空节点
执行以下命令,将待升级驱动的GPU节点设置为不可调度状态。
kubectl cordon <NODE_NAME>
其中<NODE_NAME>为节点名称。
预期输出:
node/<NODE_NAME> cordoned
执行以下命令,排空待升级驱动的GPU节点上的Pod。
kubectl drain <NODE_NAME> --grace-period=120 --ignore-daemonsets=true # 设置120秒钟的宽限期限,让任务优雅的关闭
预期输出:
There are pending nodes to be drained: <NODE_NAME>
步骤二:卸载GPU节点旧版本驱动
登录节点,执行以下命令,关闭节点上的kubelet和containerd服务(某些Daemonset服务使用GPU,但是kubectl drain并不能清除这些Daemonset,请在关闭kubelet和containerd后,再清除这些服务)。
sudo systemctl stop kubelet containerd
登录节点,执行以下fuser命令,确认是否还有进程在使用GPU。如果存在,则执行kill命令终止此进程(升级驱动过程中,不允许有进程使用GPU)。
sudo fuser -v /dev/nvidia*
如果没有服务在使用GPU,那么该命令执行后不会有任何输出;如果有服务在使用GPU,那么执行该命令后,将会有输出,表示有进程在使用GPU。下方示例显示有一个进程(进程号3781)在使用GPU资源。
USER PID ACCESS COMMAND /dev/nvidia0: root 3781 F.... dcgm-exporter /dev/nvidiactl: root 3781 F...m dcgm-exporter
此时,您可以通过进程号ID终止此进程。
sudo kill 3781
再次执行fuser命令确认是否有进程在使用GPU,直到没有任何输出,否则继续使用kill命令终止进程。
登录节点,卸载该GPU节点已安装的NVIDIA驱动。
sudo nvidia-uninstall
(可选)删除nvidia fabric manager。
执行以下命令,确定节点是否安装nvidia fabric manager。
sudo rpm -qa | grep ^nvidia-fabric-manager
如果没有输出,表示节点未安装nvidia fabric manager,则无需卸载;如果有输出,则需要执行以下命令卸载nvidia fabric manager。
yum remove nvidia-fabric-manager
步骤三:GPU节点安装新版本驱动
从NVIDIA官方网站下载新版本驱动到节点上,并执行以下命令安装。本文以NVIDIA-Linux-x86_64-510.108.03.run为例。
sudo bash NVIDIA-Linux-x86_64-510.108.03.run -a -s -q
执行以下命令,查看新驱动是否正常。
sudo nvidia-smi
预期输出如下,您可以看到驱动版本已经变更为510.108.03。
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 510.108.03 Driver Version: 510.108.03 CUDA Version: 11.6 | |-------------------------------+----------------------+----------------------+ | 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 Tesla V100-SXM2... Off | 00000000:00:07.0 Off | 0 | | N/A 35C P0 40W / 300W | 0MiB / 32768MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
开启如下配置。
sudo nvidia-smi -pm 1 || true # 代表启用Persistence模式。 sudo nvidia-smi -acp 0 || true # 切换权限要求为UNRESTRICTED。 sudo nvidia-smi --auto-boost-default=0 || true # 不开启自动提升模式,0代表不启用。 sudo nvidia-smi --auto-boost-permission=0 || true # 允许非管理员控制自动提升模式,0代表允许,1代表不允许。 sudo nvidia-modprobe -u -c=0 -m || true # 加载NVIDIA统一内存内核模块,而不是NVIDIA内核模块,且使用给定的编号创建NVIDIA设备文件。
(可选)如果需要开机自启动NVIDIA驱动,请查看/etc/rc.d/rc.local文件,确认文件中包含以下配置。
sudo nvidia-smi -pm 1 || true sudo nvidia-smi -acp 0 || true sudo nvidia-smi --auto-boost-default=0 || true sudo nvidia-smi --auto-boost-permission=0 || true sudo nvidia-modprobe -u -c=0 -m || true
执行以下命令,检查节点是否需要安装nvidia fabric manager。
sudo lspci | grep -i 'Bridge:.*NVIDIA'
如果没有输出,则不需要安装nvidia fabric manager,否则需要安装nvidia fabric manager。从NVIDIA YUM仓库下载nvidia fabric manager到节点,且nvidia fabric manager的版本与新版本驱动一致。
执行以下命令,安装并启动nvidia fabric manager。
# 安装nvidia fabric manager sudo yum localinstall nvidia-fabric-manager-510.108.03-1.x86_64.rpm # 开机启动 systemctl enable nvidia-fabricmanager.service # 启动服务 systemctl start nvidia-fabricmanager.service
启动kubelet和containerd服务。
sudo systemctl restart containerd kubelet
步骤四:上线节点
执行以下命令,上线节点。其中<NODE_NAME>为节点名称。
sudo kubectl uncordon <NODE_NAME>