手动升级GPU节点驱动

如果您使用的CUDA库需要匹配更高版本的NVIDIA驱动,请升级节点的NVIDIA驱动,即卸载旧版本驱动,然后安装新版本驱动。本文介绍如何手动升级GPU节点驱动。

前提条件

获取集群KubeConfig并通过kubectl工具连接集群

操作步骤

步骤一:下线节点与排空节点

  1. 执行以下命令,将待升级驱动的GPU节点设置为不可调度状态。

    kubectl cordon <NODE_NAME>

    其中<NODE_NAME>为节点名称。

    预期输出:

    node/<NODE_NAME> cordoned
  2. 执行以下命令,排空待升级驱动的GPU节点上的Pod。

    kubectl drain <NODE_NAME> --grace-period=120 --ignore-daemonsets=true   # 设置120秒钟的宽限期限,让任务优雅的关闭

    预期输出:

    There are pending nodes to be drained:
     <NODE_NAME>

步骤二:卸载GPU节点旧版本驱动

  1. 登录节点,执行以下命令,关闭节点上的kubelet和containerd服务(某些Daemonset服务使用GPU,但是kubectl drain并不能清除这些Daemonset,请在关闭kubelet和containerd后,再清除这些服务)。

    sudo systemctl stop kubelet containerd
  2. 登录节点,执行以下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命令终止进程。

  3. 登录节点,卸载该GPU节点已安装的NVIDIA驱动。

    sudo nvidia-uninstall
  4. (可选)删除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节点安装新版本驱动

  1. NVIDIA官方网站下载新版本驱动到节点上,并执行以下命令安装。本文以NVIDIA-Linux-x86_64-510.108.03.run为例。

    sudo bash NVIDIA-Linux-x86_64-510.108.03.run -a -s -q
  2. 执行以下命令,查看新驱动是否正常。

    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                                                 |
    +-----------------------------------------------------------------------------+
  3. 开启如下配置。

    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设备文件。
  4. (可选)如果需要开机自启动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
  5. 执行以下命令,检查节点是否需要安装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
  6. 启动kubelet和containerd服务。

    sudo systemctl restart containerd kubelet

步骤四:上线节点

执行以下命令,上线节点。其中<NODE_NAME>为节点名称。

sudo kubectl uncordon <NODE_NAME>