本文介紹GPU常見問題。
阿里雲Container Service是否支援GPU虛擬化型(vGPU)執行個體?
vGPU執行個體需要購買NVIDIA官方提供的GRID License才能正常工作,而阿里雲並不提供License伺服器。因此即使您建立了GPU虛擬化叢集,vGPU執行個體也無法使用。因此,阿里雲Container Service已不再支援在控制台選擇vGPU執行個體作為叢集節點。
不支援的虛擬化GPU執行個體包括以ecs.vgn5i、ecs.vgn6i、ecs.vgn7i、ecs.sgn7i為首碼的ECS執行個體。如果您的業務對vGPU執行個體有強依賴,您可以向NVIDIA購買GRID License,自建License伺服器。
更新ACK叢集中vGPU執行個體的NVIDIA驅動License時,需要使用License伺服器。
購買ECS執行個體並參考NVIDIA官網教程搭建License伺服器。更多資訊,請參見NVIDIA。
如果您的License伺服器已經搭建完成,請參考以下步驟將vGPU執行個體加入ACK叢集。
將vGPU執行個體加入ACK叢集
請前往權益配額,申請開放自訂系統鏡像功能。
基於CentOS 7.X和Alibaba Cloud Linux 2製作自訂系統鏡像,鏡像中需要安裝NVIDIA GRID驅動並且正確配置GRID License。具體操作,請參見使用執行個體建立自訂鏡像和在GPU虛擬化型執行個體中安裝GRID驅動(Linux)。
建立節點池。具體操作,請參見建立節點池。
將vGPU執行個體加入到步驟3建立的節點池中,具體操作,請參見添加已有節點。
後續相關步驟:更新ACK叢集中vGPU執行個體的NVIDIA驅動License
更新ACK叢集中vGPU執行個體的NVIDIA驅動License,具體操作,請參見更新ACK叢集中GPU虛擬化型(vGPU)執行個體的NVIDIA驅動License。
如何在已有叢集的GPU節點上手動升級Kernel?
下面為您介紹如何在已有叢集的GPU節點上手動升級Kernel。
當前kernel版本低於3.10.0-957.21.3
。
請確認需要升級的目標kernel版本,並謹慎操作。
本文提供方案並不涉及kernel升級,僅針對在kernel升級的前提下對應的NVIDIA驅動升級。
將GPU節點設定為不可調度(本例以節點 cn-beijing.i-2ze19qyi8votgjz12345為例)。
kubectl cordon cn-beijing.i-2ze19qyi8votgjz12345 node/cn-beijing.i-2ze19qyi8votgjz12345 already cordoned
將要升級驅動的GPU節點進行排水。
kubectl drain cn-beijing.i-2ze19qyi8votgjz12345 --grace-period=120 --ignore-daemonsets=true node/cn-beijing.i-2ze19qyi8votgjz12345 cordoned WARNING: Ignoring DaemonSet-managed pods: flexvolume-9scb4, kube-flannel-ds-r2qmh, kube-proxy-worker-l62sf, logtail-ds-f9vbg pod/nginx-ingress-controller-78d847fb96-5fkkw evicted
卸載當前的NVIDIA驅動。
說明本步驟中卸載的是版本為384.111的驅動包,如果您的驅動版本不是384.111,則需要在NVIDIA官網下載對應的驅動安裝包,並將本步驟中的
384.111
替換成您實際的版本。登入到該GPU節點,通過
nvidia-smi
查看驅動版本。sudo nvidia-smi -a | grep 'Driver Version' Driver Version : 384.111
下載NVIDIA驅動安裝包。
sudo cd /tmp/ sudo curl -O https://cn.download.nvidia.cn/tesla/384.111/NVIDIA-Linux-x86_64-384.111.run
說明需要在安裝包中卸載NVIDIA。
卸載當前NVIDIA驅動。
sudo chmod u+x NVIDIA-Linux-x86_64-384.111.run sudo sh./NVIDIA-Linux-x86_64-384.111.run --uninstall -a -s -q
升級Kernel。
重啟GPU機器。
sudo reboot
重新登入GPU節點,安裝對應的Kernel Devel。
sudo yum install -y kernel-devel-$(uname -r)
請到NVIDIA官網下載和安裝您需要的NVIDIA驅動。本文以410.79為例。
sudo cd /tmp/ sudo curl -O https://cn.download.nvidia.cn/tesla/410.79/NVIDIA-Linux-x86_64-410.79.run sudo chmod u+x NVIDIA-Linux-x86_64-410.79.run sudo sh ./NVIDIA-Linux-x86_64-410.79.run -a -s -q # warm up GPU 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
查看 /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
重啟kubelet和Docker。
sudo service kubelet stop sudo service docker restart sudo service kubelet start
將這個GPU節點重新設定為可調度。
kubectl uncordon cn-beijing.i-2ze19qyi8votgjz12345 node/cn-beijing.i-2ze19qyi8votgjz12345 already uncordoned
在GPU節點上的Device Plugin Pod驗證版本。
kubectl exec -n kube-system -t nvidia-device-plugin-cn-beijing.i-2ze19qyi8votgjz12345 nvidia-smi Thu Jan 17 00:33:27 2019 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 410.79 Driver Version: 410.79 CUDA Version: N/A | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla P100-PCIE... On | 00000000:00:09.0 Off | 0 | | N/A 27C P0 28W / 250W | 0MiB / 16280MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
說明如果通過
docker ps
命令,發現GPU節點沒有容器被啟動,請參見修複GPU節點容器啟動問題。
修複GPU節點容器啟動問題
在某些特定Kubernetes版本中的GPU節點上,重啟Kubelet和Docker時,發現沒有容器被啟動。
sudo service kubelet stop
Redirecting to /bin/systemctl stop kubelet.service
sudo service docker stop
Redirecting to /bin/systemctl stop docker.service
sudo service docker start
Redirecting to /bin/systemctl start docker.service
sudo service kubelet start
Redirecting to /bin/systemctl start kubelet.service
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
執行以下命令,查看Docker的Cgroup Driver。
sudo docker info | grep -i cgroup
Cgroup Driver: cgroupfs
此時發現的Cgroup Driver類型是cgroupfs。
您可以按照以下操作,修複該問題。
備份/etc/docker/daemon.json,完成後,執行以下命令更新/etc/docker/daemon.json。
sudo cat >/etc/docker/daemon.json <<-EOF { "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } }, "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "10" }, "oom-score-adjust": -1000, "storage-driver": "overlay2", "storage-opts":["overlay2.override_kernel_check=true"], "live-restore": true } EOF
執行以下命令,重啟Docker和kubelet。
sudo service kubelet stop Redirecting to /bin/systemctl stop kubelet.service sudo service docker restart Redirecting to /bin/systemctl restart docker.service sudo service kubelet start Redirecting to /bin/systemctl start kubelet.service
執行以下命令,確認Docker的Cgroup Driver的類型為systemd。
sudo docker info | grep -i cgroup Cgroup Driver: systemd
裸金屬執行個體節點添加失敗怎麼辦?
由於裸金屬執行個體(ecs.ebmgn7)支援開啟MIG。為了避免已有MIG設定對節點部署造成影響,系統會在該類型節點每一次添加進叢集時對已有的MIG設定進行重設。由於該類型執行個體的重設時間不定,可能會出現重設時間過長的情況,從而導致添加節點指令碼運行逾時添加節點失敗。
如果您的該系列節點出現添加失敗的情況,請在節點宿主機上執行以下命令:
sudo cat /var/log/ack-deploy.log
在輸出結果中查看添加失敗的報錯位置,是否有以下報錯:
command timeout: timeout 300 nvidia-smi --gpu-reset
如果存在則說明,添加節點失敗是由MIG的reset引起的。請重新添加該節點,詳細資料,請參見添加已有節點。
Alibaba Cloud Linux 3運行GPU容器出現Failed to initialize NVML: Unknown Error的問題怎麼辦?
問題現象
在Alibaba Cloud Linux 3上執行systemctl daemon-reload
、systemctl daemon-reexec
等操作後,在GPU容器內部無法正常使用GPU裝置,具體表現為在GPU容器內部執行nvidia-smi
會出現如下報錯。
sudo nvidia-smi
Failed to initialize NVML: Unknown Error
問題原因
在Alibaba Cloud Linux 3上使用systemd時會有如下行為:在執行systemctl daemon-reload
、systemctl daemon-reexec
等操作時,會更新cgroup相關配置,進而影響NVIDIA GPU裝置在容器中的正常使用。更詳細的資訊,請參見社區相關的issue1671、48。
解決方案
如果出現上述問題,您可以參考如下情況描述和對應方法,結合自身業務要求,嘗試解決。
情況一:如果您的應用Pod申請GPU資源的方式是通過為容器設定環境變數NVIDIA_VISIBLE_DEVICES=all實現,您可以評估能否給該應用程式容器添加一個privileged許可權,privileged許可權的添加可以參考以下樣本。
apiVersion: v1 kind: Pod metadata: name: test-gpu-pod spec: containers: - name: test-gpu-pod image: centos:7 command: - sh - -c - sleep 1d securityContext: # 為容器添加privilege許可權 privileged: true
情況二:對於使用共用GPU調度的應用,目前建議使用Alibaba Cloud Linux 2或CentOS 7。
情況三:重建該應用Pod。但在執行該操作前,您需要評估重建該應用Pod是否會對您的業務造成影響,並且該方案並不能保證重建後的Pod不會再出現該問題。
情況四:如果以上情況都不適用,可以評估您的業務能否使用其他動作系統,例如:Alibaba Cloud Linux 2或者CentOS 7。
使用GPU時出現XID 119/XID 120錯誤導致GPU掉卡怎麼辦?
問題現象
使用GPU時出現GPU掉卡現象,例如在Linux系統上使用GPU時,出現GPU卡啟動失敗的錯誤提示。執行
sh nvidia-bug-report.sh
命令後,在產生的日誌中,可以看到XID 119或XID 120錯誤資訊。以XID 119報錯頁面為例,顯示如下:說明關於其他XID Error的更多資訊,請參考NVIDIA Common XID Errors。
可能原因
引起上述問題的原因可能是GPU的GSP(GPU System Processor)組件運行狀態異常。目前,NVIDIA並未提供某個驅動版本來徹底解決GPU的掉卡問題,因此建議您在使用GPU卡之前先關閉GSP功能。
說明如果您想瞭解更多關於GSP功能的影響詳情,請參見開啟或關閉GSP功能的影響。
解決方案
以下根據不同情境說明如何關閉GSP。
擴容新節點
您可以建立節點池或編輯已有節點池的配置,在進階配置中為節點池配置標籤
ack.aliyun.com/disable-nvidia-gsp=true
。後續擴容新節點時,ACK會自動在該節點上設定關閉GSP所需的配置。說明關閉GSP相關步驟可能會造成擴容節點的時延增加。
添加已有節點
管理叢集中已有節點
您可以通過以下方式在已有節點中關閉GSP。
通過節點池標籤方式關閉GSP
為節點所在節點池配置標籤
ack.aliyun.com/disable-nvidia-gsp=true
。操作入口和節點池配置項說明,請參見編輯節點池。
將該節點移除叢集,但不釋放ECS。具體操作,請參見移除節點。
以添加已有節點的方式將已移除的節點重新添加到叢集中。操作入口和相關注意事項,請參見添加已有節點。
登入節點手動執行關閉GSP
如果您的節點無法通過移除叢集再添加到叢集方式來關閉GSP,那麼您可以登入節點,手動執行關閉GSP的步驟。具體操作,請參見使用GPU時出現XID 119/XID 120錯誤導致GPU掉卡怎麼辦?。
說明NVIDIA驅動在510版本引入了GSP。例如,如果您需要登入節點,手動將驅動由470升級至525版本,那麼您在470版本時無需關閉GSP,但升級至525版本後,有可能會觸發GSP缺陷。請在升級驅動完成後,參見使用GPU時出現XID 119/XID 120錯誤導致GPU掉卡怎麼辦?手動執行關閉GSP的步驟。
如何手動隔離叢集中的故障卡?
在使用共用GPU調度時,叢集中可能會出現壞卡導致任務運行失敗的情況。為了防止重啟後的任務再次調度到壞卡上導致重複失敗,可以手動標記叢集中的壞卡,標記後調度器將不再使用該卡,從而達到故障隔離的效果。
使用該功能之前,請確認您的調度器版本以及叢集版本滿足以下要求。
1.24及以上版本叢集,調度器版本不低於1.xx.x-aliyun-6.4.3.xxx。
1.22版本叢集,調度器版本不低於1.22.15-aliyun-6.2.4.xxx。
叢集中正在使用共用GPU調度。相關資訊請參見共用GPU調度概述。
您可以通過向叢集中提交一個特殊的ConfigMap的方式來標記故障GPU,參考以下樣本:
apiVersion: v1
kind: ConfigMap
metadata:
name: <node-name>-device-status # 替換 <node-name>為實際的節點名
namespace: kube-system
data:
devices: |
- deviceId: 0 #執行nvidia-smi擷取GPU序號
deviceType: gpu
healthy: false
ConfigMap的命名空間應當在kube-system中,且命名應當為故障卡所在的節點名加上-device-status
尾碼。data
內容中deviceId
與節點上通過nvidia-smi
指令返回的GPU序號相同。deviceType
為gpu
,healthy
為false
。向叢集中提交上述配置後,即可在調度器中隔離對應GPU卡。