更新时间:2024-06-17 GMT+08:00
分享

手动更新GPU节点驱动版本

一般情况下,您可以通过CCE AI套件(NVIDIA GPU)插件配置节点的驱动文件路径,节点重启后会自动安装驱动。您也可以手动更新驱动的方式进行更新。

手动更新GPU节点的驱动版本为临时方案,适用于需要对某个节点进行差异化配置的场景,但节点重启后将自动重置为GPU插件配置中指定的版本。

如果需要稳定升级GPU节点驱动,推荐使用通过节点池升级节点的GPU驱动版本

前提条件

需要使用kubectl连接到集群,详情请参见通过kubectl连接集群

操作步骤

如果您需要使用指定的NVIDIA驱动版本,可以在节点安装新版本GPU驱动,操作步骤如下:

  1. 对节点下线,并将节点上的负载进行手动驱逐,结束所有程序对GPU卡的使用。

    1. 节点下线
      kubectl cordon <NODE_NAME>

      下线后对应节点状态变成不可调度

      NAME            STATUS                     ROLES    AGE   VERSION
      192.168.1.xx    Ready,SchedulingDisabled   <none>   20m   v1.25.5-r20-25.1.31.1
    2. 手动驱逐节点上的工作负载。
      kubectl drain 192.168.1.xx --ignore-daemonsets=true --delete-emptydir-data

      参数详情请参见如何驱逐节点上的所有Pod

      预期效果:

      node/192.168.1.xx drained
    3. 如果有DaemonSet工作负载使用了GPU卡,则需要先停止kubelet和containerd运行时服务。

      登录需要更新GPU驱动的节点,如192.168.1.xx。

      • 停止服务(containerd运行时)
        systemctl stop kubelet kubelet-monit containerd containerd-monit
      • 停止服务(docker运行时)
        systemctl stop kubelet kubelet-monit docker docker-monit
    4. 检查是否有程序正在使用GPU卡设备。

      运行命令: sudo fuser -v /dev/nvidia*

      如无fuser命令(以基于RPM的Linux发行版为例),可执行命令yum install psmisc安装psmisc包。
      # sudo fuser -v /dev/nvidia*
                           USER        PID ACCESS COMMAND
      /dev/nvidia0:        root      12192 F.... nvidia-gpu-devi
      /dev/nvidiactl:      root      12192 F.... nvidia-gpu-devi
      删除进程,上例中的进程号是12192,运行命令:sudo kill 12192
      # sudo kill 12192
      # sudo fuser -v /dev/nvidia*      #再次确认是否有程序正在使用GPU卡设备

  2. 节点安装指定NVIDIA驱动版本。

    1. NVIDIA官方网站中下载指定的驱动版本,如何选择GPU节点驱动版本请参见选择GPU节点驱动版本
    2. 记录当版本驱动状态。根据CCE AI套件(NVIDIA GPU)插件版本差异,查询驱动的命令如下:
      • 1.x.x版本执行: /opt/cloud/cce/nvidia/bin/nvidia-smi
      • 2.0.0-2.5.3版本执行:/usr/local/nvidia/bin/nvidia-smi
      • 2.5.4以上版本直接执行:nvidia-smi
      # nvidia-smi
      Tue Feb 20 15:06:54 2024
      +-----------------------------------------------------------------------------+
      | 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  Tesla V100-SXM2...  Off  | 00000000:21:01.0 Off |                    0 |
      | N/A   31C    P0    23W / 300W |      0MiB / 16160MiB |      0%      Default |
      |                               |                      |                  N/A |
      +-------------------------------+----------------------+----------------------+
      
      +-----------------------------------------------------------------------------+
      | Processes:                                                                  |
      |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
      |        ID   ID                                                   Usage      |
      |=============================================================================|
      |  No running processes found                                                 |
      +-----------------------------------------------------------------------------+
    3. 安装前准备。
      获取当前节点内核版本并安装相关依赖(如gcc、make、kernel-devel), 以基于RPM的Linux发行版为例(操作系统为EulerOS、HCE 、CentOS等)。
      yum install -y perl kernel-devel-$(uname -r) zlib-devel binutils binutils-extra binutils-devel elfutils-libelf-devel gcc make
    4. 安装下载好的并验证。
      本例中以NVIDIA-Linux-x86_64-535.54.03.run版本的驱动为例。
      #获取内核版本
      kerVersion=`uname -r`
      
      #安装过程详情存放地址
      touch /root/nvidia-installer.log
      
      #安装从nvidia官方网站下载的驱动
      sh NVIDIA-Linux-x86_64-535.54.03.run --silent --kernel-source-path=/usr/src/kernels/$kerVersion --log-file-name=/root/nvidia-installer.log --no-install-compat32-libs --utility-prefix="/usr/local/nvidia" --opengl-prefix="/usr/local/nvidia"

      安装过程中如出现以下错误:

      ERROR: An NVIDIA kernel module 'nvidia' appears to already be loaded in your kernel.  This may be because it is in use (for example, by an X server, a CUDA program, or the NVIDIA Persistence Daemon), but this may also happen if your kernel was configured without support for module unloading.  Please be sure to exit any programs that may be using the GPU(s) before attempting to upgrade your driver.  If no GPU-based programs are running, you know that your kernel supports module unloading, and you still receive this message, then an error may have occurred that has corrupted an NVIDIA kernel module's usage count, for which the simplest remedy is to reboot your computer.
      ERROR: Installation has failed.  Please see the file '/root/nvidia-installer.log' for details.  You may find suggestions on fixing installation problems in the README available on the Linux driver download page at www.nvidia.com.

      可执行以下步骤进行解决:

      1. 执行命令禁用kubelet和containerd运行时服务:
        • 禁用服务(containerd运行时)
          systemctl disable kubelet kubelet-monit containerd containerd-monit
        • 禁用服务(docker运行时)
          systemctl disable kubelet kubelet-monit docker docker-monit
      2. reboot重启节点。
      3. 重新执行驱动安装命令。
      4. 重新启用kubelet和containerd运行时服务:
        • 启用服务(containerd运行时)
          systemctl enable kubelet kubelet-monit containerd containerd-monit
        • 启用服务(docker运行时)
          systemctl enable kubelet kubelet-monit docker docker-monit
    5. 验证新版本GPU驱动是否安装好,通过命令 nvidia-smi 进行确认。
      # nvidia-smi
      Tue Feb 20 15:13:58 2024
      +---------------------------------------------------------------------------------------+
      | NVIDIA-SMI 535.54.03              Driver Version: 535.54.03    CUDA Version: 12.2     |
      |-----------------------------------------+----------------------+----------------------+
      | 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-16GB           Off | 00000000:21:01.0 Off |                    0 |
      | N/A   34C    P0              38W / 300W |      0MiB / 16384MiB |      2%      Default |
      |                                         |                      |                  N/A |
      +-----------------------------------------+----------------------+----------------------+
      
      +---------------------------------------------------------------------------------------+
      | Processes:                                                                            |
      |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
      |        ID   ID                                                             Usage      |
      |=======================================================================================|
      |  No running processes found                                                           |
      +---------------------------------------------------------------------------------------+
    6. 清理驱动文件和历史命令。
      rm NVIDIA-Linux-x86_64-535.54.03.run /root/nvidia-installer.log && history -c

  3. 恢复节点。

    1. 恢复kubelet和containerd运行时服务。
      • 恢复服务(containerd运行时)
        systemctl start kubelet kubelet-monit containerd containerd-monit
      • 恢复服务(docker运行时)
        systemctl start kubelet kubelet-monit docker docker-monit
    2. 解除节点的调度限制。
      kubectl uncordon <NODE_NAME>

相关文档