全部產品
Search
文件中心

:基於節點池管理共用GPU

更新時間:Jan 26, 2025

基於節點池管理共用GPU能夠為您提供更加靈活的GPU共用調度和顯存隔離策略。本文通過在專有版GPU叢集中建立兩個含標籤的節點池樣本,介紹如何基於節點池管理共用GPU的調度能力和顯存隔離能力。

適用情境

  • 本文所描述的組件,僅支援專有版GPU叢集,不支援託管版GPU叢集。

  • 若您想在ACK Pro版叢集安裝共用GPU組件,請參考安裝共用GPU調度組件

前提條件

您已完成以下操作:

  • 安裝共用GPU調度組件

  • 規劃節點池。

    節點池名稱可自訂,本文以cgpu和cgpu-no-isolation為例進行闡述。

    節點池名稱

    共用調度

    顯存隔離

    標籤

    cgpu

    • cgpu=true

    • cgpu.disable.isolation=false

    cgpu-no-isolation

    • cgpu=true

    • cgpu.disable.isolation=true

背景資訊

在阿里雲Container ServiceKubernetes版ACK(Container Service for Kubernetes)上使用GPU共用調度時,您可能會遇到以下情境:

  • 訓練任務A在代碼中已經配置該任務可使用的GPU顯存大小,此時叢集只需要提供GPU共用調度能力即可,不需要提供GPU顯存隔離能力。

  • 訓練任務B在代碼中沒有配置該任務可使用的GPU顯存大小,此時叢集不僅需要提供GPU共用調度能力,而且還需要提供GPU顯存隔離能力。

那如何在一個叢集中同時支援這兩種情境呢?

基於節點池管理共用GPU的方法同時支援這兩種情境。您只需要建立兩個節點池:

  • 第一個節點池的節點只提供共用調度能力,不提供顯存隔離能力,該節點池只適用於運行訓練任務A。

  • 第二個節點池的節點同時提供共用調度能力和顯存隔離能力,該節點池只適用於運行訓練任務B。

注意事項

在使用節點池管理共用GPU的過程中,需要注意以下兩點:

  • 用節點池管理共用GPU時,如果某個任務沒有寫nodeSelector,那麼該任務的Pod可能被調度到任意一個節點池,容易造成結果錯亂。

    重要

    強烈建議給任務指定nodeSelector。

  • 如果某個節點的特定標籤發生變化(例如:cgpu.disable.isolation=false變為cgpu.disable.isolation=true),需要重啟該節點的gpushare-device-plugin,顯存隔離的配置才會生效。

    重啟策略是將舊的gpushare-device-plugin Pod刪除後,ACK會自動建立一個新的Pod,具體操作如下:

    1. 執行以下命令,查詢叢集的gpushare-device-plugin Pod。

      kubectl get po -n kube-system  -l name=gpushare-device-plugin-ds -o wide

      預期輸出:

      NAME                              READY   STATUS    RESTARTS   AGE   IP              NODE                        NOMINATED NODE   READINESS GATES
      gpushare-device-plugin-ds-6r8gs   1/1     Running   0          18h   192.168.7.157   cn-shanghai.192.168.7.157   <none>           <none>
      gpushare-device-plugin-ds-pjrvn   1/1     Running   0          15h   192.168.7.158   cn-shanghai.192.168.7.158   <none>           <none>
    2. 以cn-shanghai.192.168.7.157節點為例,執行以下命令,刪除gpushare-device-plugin Pod。

      kubectl delete po gpushare-device-plugin-ds-6r8gs -n kube-system

步驟一:建立節點池

  1. 登入Container Service管理主控台

  2. 在控制台左側導覽列,單擊叢集

  3. 叢集列表頁面,單擊目的地組群名稱或者目的地組群右側操作列下的詳情

  4. 在叢集管理頁左側導覽列,選擇節點管理 > 節點池

  5. 建立節點池頁面,設定節點池的配置項。

    有關配置項的詳細說明,請參見建立Kubernetes託管版叢集。部分配置說明如下:

    • 數量:設定節點池初始節點數量。如不需要建立節點,可以填寫為0。

    • 作業系統:選擇節點的作業系統,包括CentOS 7.x、Alibaba Cloud Linux 2.x。

    • 節點標籤:您可以為叢集節點添加標籤。

    • ECS標籤:您可以為ECS執行個體添加標籤。

    • 自訂資源群組:您可以指定節點池所擴容節點的資源群組資訊。

    其中,在節點標籤地區為每個節點池打上特定的標籤。

    • 節點池cgpu需要的特定標籤:cgpu=true、cgpu.disable.isolation=false

    • 節點池cgpu-no-isolation需要的特定標籤:cgpu=true、cgpu.disable.isolation=true

    以節點池cgpu-no-isolation為例:節點標籤

  6. 單擊確認配置

    節點池頁面,如果節點池狀態顯示初始化中,則說明節點池正在建立中。建立完成後,狀態顯示為已啟用

說明

如果您需要增加GPU節點,可對該節點進行擴容。具體操作,請參見建立節點池

步驟二:提交任務

提交cgpu-test和cgpu-test-no-isolation兩個任務,在部署任務的YAML檔案中均需要指定nodeSelector

  • cgpu-test:該任務的代碼中沒有設定可用的GPU顯存大小,需要藉助共用的顯存隔離能力才能正常運行。樣本YAML配置如下:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: cgpu-test
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: cgpu-test
        spec:
          nodeSelector:
            cgpu.disable.isolation: "false" # 添加nodeSelector,選擇節點池cgpu。
          containers:
          - name: cgpu-test
            image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5
            command:
            - python
            - tensorflow-sample-code/tfjob/docker/mnist/main.py
            - --max_steps=100000
            - --data_dir=tensorflow-sample-code/data
            resources:
              limits:
                # 單位為GiB,該Pod總共申請了3 GiB顯存。
                aliyun.com/gpu-mem: 3
            workingDir: /root
          restartPolicy: Never
    說明
    • nodeSelector:指定節點池為cgpu。

    • cgpu.disable.isolation=false:表示將任務調度到節點池cgpu的節點上運行。

    • aliyun.com/gpu-mem:設定GPU顯存大小。

  • cgpu-test-no-isolation:該任務的代碼中設定了每個GPU可用顯存大小,不需要藉助cgpu的顯存隔離能力。樣本YAML配置如下:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: cgpu-test-no-isolation
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: cgpu-test-no-isolation
        spec:
          nodeSelector:
            cgpu.disable.isolation: "true" # 添加nodeSelector,選擇節點池cgpu-no-isolation。
          containers:
          - name: cgpu-test-no-isolation
            image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5
            command:
            - python
            - tensorflow-sample-code/tfjob/docker/mnist/main.py
            - --max_steps=100000
            - --data_dir=tensorflow-sample-code/data
            resources:
              limits:
                # 單位為GiB,該Pod總共申請了3 GiB顯存。
                aliyun.com/gpu-mem: 3
    說明
    • nodeSelector:指定節點池為cgpu-no-isolation。

    • cgpu.disable.isolation=true:表示將任務調度到節點池cgpu-no-isolation的節點上運行。

    • aliyun.com/gpu-mem:設定GPU顯存大小。

步驟三:查看執行結果

  1. 執行以下命令,查看任務狀態。

    kubectl get po

    預期輸出:

    NAME                       READY   STATUS    RESTARTS   AGE
    cgpu-test-0                1/1     Running   0          5m55s
    cgpu-test-no-isolation-0   1/1     Running   0          6m42s
  2. 在Pod cgpu-test-0(需要顯存隔離的任務)執行命令nvidia-smi,查看容器可使用的顯存。

    kubectl exec cgpu-test-0 -- nvidia-smi

    預期輸出:

    Mon Nov  2 11:33:10 2020
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 418.87.01    Driver Version: 418.87.01    CUDA Version: 10.1     |
    |-------------------------------+----------------------+----------------------+
    | 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 V100-SXM2...  On   | 00000000:00:07.0 Off |                    0 |
    | N/A   34C    P0    54W / 300W |   3039MiB /  3226MiB |      1%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+

    容器可使用的顯存為3226 MiB(該GPU卡的總顯存為16 GiB),說明共用GPU的顯存隔離能力已生效。

  3. 在Pod cgpu-test-no-isolation-0(不需要顯存隔離的任務)執行nvidia-smi,查看容器可使用的顯存。

    kubectl exec cgpu-test-no-isolation-0 -- nvidia-smi

    預期輸出:

    Mon Nov  2 11:39:59 2020
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 418.87.01    Driver Version: 418.87.01    CUDA Version: 10.1     |
    |-------------------------------+----------------------+----------------------+
    | 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 V100-SXM2...  On   | 00000000:00:07.0 Off |                    0 |
    | N/A   37C    P0    56W / 300W |   1929MiB / 16130MiB |      1%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+

    容器可發現的顯存為16130 MiB(該GPU卡的總顯存為16 GiB),說明共用GPU的顯存隔離能力已被關閉,此種情況下,容器中的應用程式需要通過以下環境變數擷取自己能夠使用的顯存大小。執行以下命令,擷取能夠使用的顯存大小。

    kubectl exec cgpu-test-no-isolation-0 -- env | grep ALIYUN

    預期輸出:

    ALIYUN_COM_GPU_MEM_CONTAINER=3    # 在某張卡上,該容器被允許使用的顯存大小,此處代表3 GiB。
    ALIYUN_COM_GPU_MEM_DEV=15      # 這張卡的總顯存大小。
    ...
  4. 對比在Pod cgpu-test-no-isolation-0和cgpu-test-0中執行nvidia-smi的結果。

    cgpu-test-no-isolation-0顯示整張GPU卡的顯存,而cgpu-test-0隻能顯示申請的GPU顯存大小,說明基於節點池可以有效管理共用GPU。