全部產品
Search
文件中心

Container Service for Kubernetes:GPU FAQ

更新時間:Jun 19, 2024

本文介紹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叢集

  1. 請前往權益配額,申請開放自訂系統鏡像功能。

  2. 基於CentOS 7.X和Alibaba Cloud Linux 2製作自訂系統鏡像,鏡像中需要安裝NVIDIA GRID驅動並且正確配置GRID License。具體操作,請參見使用執行個體建立自訂鏡像在GPU虛擬化型執行個體中安裝GRID驅動(Linux)

  3. 建立節點池。具體操作,請參見建立節點池

  4. 將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驅動升級。

  1. 擷取叢集KubeConfig並通過kubectl工具串連叢集

  2. 將GPU節點設定為不可調度(本例以節點 cn-beijing.i-2ze19qyi8votgjz12345為例)。

    kubectl cordon cn-beijing.i-2ze19qyi8votgjz12345
    
    node/cn-beijing.i-2ze19qyi8votgjz12345 already cordoned
  3. 將要升級驅動的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
  4. 卸載當前的NVIDIA驅動。

    說明

    本步驟中卸載的是版本為384.111的驅動包,如果您的驅動版本不是384.111,則需要在NVIDIA官網下載對應的驅動安裝包,並將本步驟中的384.111替換成您實際的版本。

    1. 登入到該GPU節點,通過nvidia-smi查看驅動版本。

      sudo nvidia-smi -a | grep 'Driver Version'
      Driver Version                      : 384.111
    2. 下載NVIDIA驅動安裝包。

      sudo cd /tmp/
      sudo curl -O https://cn.download.nvidia.cn/tesla/384.111/NVIDIA-Linux-x86_64-384.111.run
      說明

      需要在安裝包中卸載NVIDIA。

    3. 卸載當前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
  5. 升級Kernel。

  6. 重啟GPU機器。

    sudo reboot
  7. 重新登入GPU節點,安裝對應的Kernel Devel。

    sudo yum install -y kernel-devel-$(uname -r)
  8. 請到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
  9. 查看 /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
  10. 重啟kubelet和Docker。

    sudo service kubelet stop
    sudo service docker restart
    sudo service kubelet start
  11. 將這個GPU節點重新設定為可調度。

    kubectl uncordon cn-beijing.i-2ze19qyi8votgjz12345
    
    node/cn-beijing.i-2ze19qyi8votgjz12345 already uncordoned
  12. 在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。

您可以按照以下操作,修複該問題。

  1. 備份/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
  2. 執行以下命令,重啟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
  3. 執行以下命令,確認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-reloadsystemctl daemon-reexec等操作後,在GPU容器內部無法正常使用GPU裝置,具體表現為在GPU容器內部執行nvidia-smi會出現如下報錯。

sudo nvidia-smi

Failed to initialize NVML: Unknown Error

問題原因

在Alibaba Cloud Linux 3上使用systemd時會有如下行為:在執行systemctl daemon-reloadsystemctl daemon-reexec等操作時,會更新cgroup相關配置,進而影響NVIDIA GPU裝置在容器中的正常使用。更詳細的資訊,請參見社區相關的issue167148

解決方案

如果出現上述問題,您可以參考如下情況描述和對應方法,結合自身業務要求,嘗試解決。

  • 情況一:如果您的應用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報錯頁面為例,顯示如下:

    報錯資訊.png

    說明

    關於其他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所需的配置。

    操作入口和節點池配置項說明,請參見建立節點池編輯節點池

    image

    說明

    關閉GSP相關步驟可能會造成擴容節點的時延增加。

    添加已有節點

    1. 您可以建立節點池或編輯待添加節點的節點池的配置,在進階配置中為節點池配置標籤ack.aliyun.com/disable-nvidia-gsp=true。已有節點添加到節點池中後,ACK會自動在該節點上設定關閉GSP所需的配置。

      操作入口和節點池配置項說明,請參見建立節點池編輯節點池

      image

      說明

      關閉GSP相關步驟可能會造成添加節點到叢集的時延增加。

    2. 將已有節點添加至節點池。操作入口和相關注意事項,請參見添加已有節點

    管理叢集中已有節點

    您可以通過以下方式在已有節點中關閉GSP。

    通過節點池標籤方式關閉GSP

    1. 為節點所在節點池配置標籤ack.aliyun.com/disable-nvidia-gsp=true

      操作入口和節點池配置項說明,請參見編輯節點池

      image

    2. 將該節點移除叢集,但不釋放ECS。具體操作,請參見移除節點

    3. 以添加已有節點的方式將已移除的節點重新添加到叢集中。操作入口和相關注意事項,請參見添加已有節點

    登入節點手動執行關閉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序號相同。deviceTypegpuhealthyfalse。向叢集中提交上述配置後,即可在調度器中隔離對應GPU卡。