全部產品
Search
文件中心

Container Service for Kubernetes:手動升級GPU節點驅動

更新時間:Feb 28, 2024

如果您使用的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>