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