全部產品
Search
文件中心

Container Service for Kubernetes:通過共用GPU調度實現算力分配

更新時間:Oct 25, 2024

ACK叢集Pro版支援為應用申請GPU顯存和算力,能夠協助您更精細化的使用GPU的顯存和算力資源。本文介紹如何通過共用GPU調度實現算力分配。

前提條件

  • 已建立ACK叢集Pro版,且叢集版本為v1.20及以上。具體步驟,請參見建立ACK託管叢集。對於不同ACK版本的叢集,調度器版本需滿足以下要求。關於調度器各版本支援的功能,請參見kube-scheduler

    ACK叢集版本

    調度器版本

    1.28

    v1.28.1-aliyun-5.6-998282b9及以上

    1.26

    v1.26.3-aliyun-4.1-a520c096及以上

    1.24

    v1.24.3-ack-2.0及以上

    1.22

    v1.22.15-ack-2.0及以上

    1.20

    v1.20.4-ack-8.0及以上

  • 已安裝共用GPU組件,且Chart版本為1.2.0以上。關於安裝共用GPU組件的具體操作,請參見安裝共用GPU調度組件

  • cGPU版本為1.0.5及以上。關於cGPU的升級操作,請參見升級節點cGPU版本

使用限制

  • 共用GPU調度目前支援僅申請顯存同時申請顯存和算力兩種任務,這兩種任務不能同時存在於一個節點上,即一個節點只運行僅申請顯存的任務,或者只運行同時申請顯存和算力的任務。

  • 為任務申請算力時,有如下限制:

    • 每一張GPU提供的算力按100計量,代表這張卡的100%算力,例如申請20代表使用GPU卡的20%算力。

    • 申請的算力值應為5的倍數,最小為5。如果不為5的倍數,任務將提交失敗。

  • 目前只有以下地區支援GPU顯存算力分配功能。如果您需要使用該功能,請確保叢集所在地區在此範圍內。

    地區

    地區ID

    華北2(北京)

    cn-beijing

    華東2(上海)

    cn-shanghai

    華東1(杭州)

    cn-hangzhou

    華北3(張家口)

    cn-zhangjiakou

    華南1(深圳)

    cn-shenzhen

    西南1(成都)

    cn-chengdu

    華南2(河源)

    cn-heyuan

    中國香港

    cn-hongkong

    印尼(雅加達)

    ap-southeast-5

    新加坡

    ap-southeast-1

    泰國(曼穀)

    ap-southeast-7

    美國(維吉尼亞)

    us-east-1

    美國(矽谷)

    us-west-1

    日本(東京)

    ap-northeast-1

    華東2 金融雲

    cn-shanghai-finance-1

  • 共用GPU調度支援算力分配的調度器於2022年03月01日上線,在此之後建立的叢集將使用新版本調度器,但是在此之前已有叢集的調度器不會自動升級到新版本,需要您手動進行操作。若您的叢集建立時間早於2022年03月01日,請按照如下操作進行處理:

    1. 提交工單申請新版共用GPU調度內測。

    2. 卸載舊版共用GPU組件。

      如果已安裝舊版共用GPU組件(僅支援顯存共用,Chart版本≤1.2.0),請按照以下步驟進行處理。

      1. 登入Container Service管理主控台,在左側導覽列選擇叢集

      2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇應用 > Helm

      3. Helm頁面,單擊ack-ai-installer右側操作列下方的刪除,然後在彈出的刪除應用對話方塊,單擊確定

    3. 安裝新版共用GPU組件。具體操作,請參見安裝共用GPU調度組件

步驟一:建立支援算力分配的節點池

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇節點管理 > 節點池

  3. 節點池頁面右側,單擊建立節點池

    部分參數配置說明如下,關於配置項的詳細說明,請參見節點池配置

    配置項

    說明

    節點池名稱

    設定節點池名稱。本文配置為gpu-core

    期望節點數

    設定節點池初始節點數量。若您不需要建立節點,請填寫為0

    ECS標籤

    為ECS執行個體添加標籤。

    節點標籤

    為叢集節點添加標籤。本文配置如下,關於節點標籤的更多資訊,請參見ACK調度GPU使用的節點標籤說明

    • 開啟節點GPU顯存和算力隔離能力:單擊添加節點標籤,輸入第一個節點標籤的ack.node.gpu.schedulecore_mem

    • 在節點上使用Binpack演算法為Pod選擇GPU卡:單擊添加節點標籤,輸入第二個節點標籤的ack.node.gpu.placementbinpack

    重要

    如果您需要將叢集中已存在的GPU節點切換為算力隔離模式,請先將該節點從叢集中移除,然後重新加入支援算力隔離的節點池。不支援直接使用kubectl label nodes <NODE_NAME> ack.node.gpu.schedule=core_mem命令將該GPU節點切換為算力隔離模式。

步驟二:查看節點池是否開啟算力分配功能

執行以下命令,查看節點池的節點是否開啟算力分配功能。

kubectl get nodes <NODE_NAME> -o yaml

預期輸出:

#省略其他欄位。
status:
  #省略其他欄位。
  allocatable:
    #節點共有400%的算力,4張GPU卡,每張卡提供100%算力。
    aliyun.com/gpu-core.percentage: "400"
    aliyun.com/gpu-count: "4"
    #節點共有60 GiB顯存,4張GPU卡,每張卡提供15 GiB顯存。
    aliyun.com/gpu-mem: "60"
  capacity:
    aliyun.com/gpu-core.percentage: "400"
    aliyun.com/gpu-count: "4"
    aliyun.com/gpu-mem: "60"

預期輸出表明,存在aliyun.com/gpu-core.percentage欄位,即算力分配功能已開啟。

步驟三:使用算力分配功能

未使用算力分配功能前,一張GPU卡的總顯存為15 GiB,Pod可以100%使用該GPU卡的算力。本文以同時申請顯存和算力任務為例,申請2 GiB顯存、一張GPU卡的30%算力,介紹如何使用GPU顯存算力分配功能。

  1. 使用以下YAML內容,建立申請GPU顯存和算力的任務。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: cuda-sample
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: cuda-sample
        spec:
          containers:
          - name: cuda-sample
            image:  registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3
            command:
            - bash
            - run.sh
            - --num_batches=500000000
            - --batch_size=8
            resources:
              limits:
                # 單位為GiB,該Pod總共申請了2 GiB顯存。
                aliyun.com/gpu-mem: 2
                #申請一張GPU卡的30%算力。
                aliyun.com/gpu-core.percentage: 30
            workingDir: /root
          restartPolicy: Never
  2. 執行以下命令,部署cuda-sample.yaml檔案提交cuda-sample任務。

    kubectl apply -f /tmp/cuda-sample.yaml
    說明

    任務所使用的鏡像較大,拉取鏡像需要一定的時間,請耐心等待。

  3. 執行以下命令,查看cuda-sample任務的運行狀態。

    kubectl get po -l app=cuda-sample

    預期輸出:

    NAME                READY   STATUS    RESTARTS   AGE
    cuda-sample-m****   1/1     Running   0          15s

    預期輸出表明,STATUSRunning,即任務部署成功。

  4. 執行以下命令,查看顯存和算力的使用方式。

    kubectl exec -ti cuda-sample-m**** -- nvidia-smi

    預期輸出:

    Thu Dec 16 02:53:22 2021
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 450.102.04   Driver Version: 450.102.04   CUDA Version: 11.0     |
    |-------------------------------+----------------------+----------------------+
    | 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...  On   | 00000000:00:08.0 Off |                    0 |
    | N/A   33C    P0    56W / 300W |    337MiB /  2154MiB |     30%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+

    預期輸出表明:

    • 顯存:未開啟算力分配功能前,Pod能夠使用的總顯存為該GPU卡的總顯存,本文為15 GiB(在節點上執行nvidia-smi命令即可查詢GPU卡的總顯存)。開啟算力分配功能後,Pod當前已使用337 MiB,能夠使用的總顯存為2154 MiB(約為2 GiB),說明顯存隔離生效。

    • 算力:未開啟算力分配功能前,Pod啟動並執行任務能夠100%使用GPU卡(您可以將申請的算力設定為100進行驗證)。開啟算力分配功能後,Pod已使用GPU卡的30%算力,說明算力隔離生效。

    說明

    如果有n個任務,假設每個任務申請30%算力(n≤3,最多部署3個),n個任務運行在同一張GPU卡上,此時在每個Pod中執行nvidia-smi命令,可以看到算力為n*30%。nvidia-smi命令的查詢結果目前僅顯示以卡為單位的算力利用率,而不顯示以任務為單位的算力利用率。

  5. 使用以下命令,查看Pod日誌。

    kubectl logs cuda-sample-m**** -f

    預取輸出:

    [CUDA Bandwidth Test] - Starting...
    Running on...
    
     Device 0: Tesla V100-SXM2-16GB
     Quick Mode
    
    time: 2021-12-16/02:50:59,count: 0,memSize: 32000000,succeed to copy data from host to gpu
    time: 2021-12-16/02:51:01,count: 1,memSize: 32000000,succeed to copy data from host to gpu
    time: 2021-12-16/02:51:02,count: 2,memSize: 32000000,succeed to copy data from host to gpu
    time: 2021-12-16/02:51:03,count: 3,memSize: 32000000,succeed to copy data from host to gpu

    由預期輸出得到,使用算力分配功能後,Pod日誌重新整理較慢,此時算力被限制在該GPU卡的30%左右。

  6. 可選:執行以下命令,刪除cuda-sample任務。

    驗證完畢後,您可以對任務進行刪除操作。

    kubectl delete job cuda-sample