全部產品
Search
文件中心

Container Service for Kubernetes:在ACK Edge叢集中使用共用GPU調度能力

更新時間:Jun 12, 2025

通過共用GPU調度能力,您可以將多個Pod調度到同一張GPU卡上,以共用GPU的計算資源,從而提高GPU的利用率並節省成本。在實現GPU共用調度的同時,確保運行在同一張GPU上的多個容器之間能夠互相隔離,並根據各自申請的資源使用量運行,避免某個容器的資源使用量超標,進而影響其他容器的正常工作。本文介紹如何在ACK Edge叢集中使用共用GPU調度能力。

前提條件

使用限制

  • ACK Edge叢集的雲端節點支援完整的共用GPU調度和顯存隔離以及算力隔離能力。

  • ACK Edge叢集的邊緣節點池僅支援共用GPU調度,不支援顯存隔離、算力隔離的能力。

注意事項

針對納入K8s叢集管理的GPU節點,為業務應用申請和使用GPU資源時,請關注以下注意事項。

  • 請勿直接在節點上運行GPU應用程式。

  • 請勿通過dockerpodmannerdctl等工具命令建立容器並為容器申請GPU資源。例如,執行docker run --gpus alldocker run -e NVIDIA_VISIBLE_DEVICES=all並運行GPU程式。

  • 請勿在Pod YAML的env中直接添加環境變數NVIDIA_VISIBLE_DEVICES=allNVIDIA_VISIBLE_DEVICES=<GPU ID>等,通過容器的環境變數NVIDIA_VISIBLE_DEVICES直接為Pod申請GPU資源,並運行GPU程式。

  • 在Pod YAML中未設定環境變數NVIDIA_VISIBLE_DEVICES,製作Pod所使用的鏡像時,請勿將環境變數預設配置為NVIDIA_VISIBLE_DEVICES=all,並運行GPU程式。

  • 請勿在Pod的securityContext中配置privileged: true,並運行GPU程式。

通過以上非標方式為業務應用申請的GPU資源,將存在如下安全隱患。

  • 通過以上方式為業務應用申請的GPU資源,並未在調度器的裝置資源賬本中統計,有可能造成節點GPU資源的分配情況與調度器裝置資源賬本中記錄的值不一致。調度器仍然會調度某些申請GPU資源的Pod到這個節點上,導致使用者業務因為在同一張GPU卡上出現資源爭搶(比如GPU顯存申請)而運行失敗的情況。

  • 非標操作可能引發其他未知問題,例如NVIDIA社區的已知報錯

步驟一:安裝共用GPU組件

未部署雲原生AI套件

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

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

  3. 雲原生AI套件頁面,單擊一鍵部署

  4. 在一鍵部署雲原生AI套件頁面,選中調度策略擴充(批量任務調度、GPU共用、GPU拓撲感知)。

  5. (可選)單擊調度策略擴充(批量任務調度、GPU共用、GPU拓撲感知)右側的進階配置。在彈出的參數配置視窗,修改cGPU的policy欄位。修改完成後,單擊確定

    如果對cGPU算力共用無特殊要求,建議使用預設policy: 5,即原生調度。cGPU支援的policy,請參見安裝並使用cGPU服務image

  6. 雲原生AI套件頁面最下方,單擊部署雲原生AI套件

    組件安裝成功後,在雲原生AI套件頁面的組件列表中能看到已安裝的共用GPU組件ack-ai-installer

已部署雲原生AI套件

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

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

  3. 在調度組件ack-ai-installer所在行,單擊操作列的部署

  4. (可選)在彈出的參數配置視窗,修改cGPU的policy欄位。

    如果對cGPU算力共用無特殊要求,建議使用預設policy: 5,即原生調度。cGPU支援的policy,請參見安裝並使用cGPU服務image

  5. 修改完成後,單擊確定

    組件安裝完成後,ack-ai-installer狀態已部署

步驟二:建立GPU節點池

  • 建立雲端GPU節點池,以開啟GPU共用調度能力、顯存隔離和算力共用能力。

  • 建立邊緣GPU節點池,以開啟GPU共用調度能力。

雲端節點池

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

  2. 節點池頁面,單擊建立節點池。參見建立和管理節點池完成相關配置。

  3. 建立節點池頁面,設定建立節點池的配置項,然後單擊確認配置。重要配置項及其說明如下:

    配置項

    說明

    期望節點數

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

    節點標籤

    標籤的值需根據您的業務需求添加。關於節點標籤的詳細說明,請參見GPU節點卡型及調度標籤說明

    下文以標籤值cgpu為例,該值表示節點開啟共用GPU調度能力,每個Pod僅需申請GPU顯存資源,多個Pod在一張卡上實行顯存隔離和算力共用。

    單擊節點標籤節點標籤,設定ack.node.gpu.schedulecgpu

    重要

邊緣節點池

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

  2. 節點池頁面,單擊建立邊緣節點池

  3. 建立節點池頁面,設定建立節點池的配置項,然後單擊確認配置。此處僅介紹主要配置項,其餘配置項請參見邊緣節點池屬性

    節點標籤:單擊節點標籤節點標籤,設定ack.node.gpu.scheduleshare。僅開啟GPU共用調度能力。關於節點標籤的更多資訊,請參見GPU節點調度屬性標籤說明

步驟三:添加GPU節點

分別在雲端節點池和邊緣節點池中添加GPU節點。

雲端節點

說明

如果您添加節點池時已經建立GPU節點,可以跳過此步驟。

完成建立節點池後,您還可以在節點池中添加GPU節點。添加GPU節點時,您需要指定執行個體規格的架構為GPU雲端服務器。具體操作,請參見添加已有節點建立和管理節點池

邊緣節點

在邊緣節點池中添加GPU節點的具體操作,請參見添加GPU節點

步驟四:在雲端節點安裝和使用GPU資源查詢工具

  1. 下載kubectl-inspect-cgpu。需將執行檔案下載至PATH環境變數包含目錄下,本文以/usr/local/bin/為例。

    • 如果您使用的是Linux系統,您可以通過以下命令下載kubectl-inspect-cgpu。

      wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-linux -O /usr/local/bin/kubectl-inspect-cgpu
    • 如果您使用的是macOS系統,您可以通過以下命令下載kubectl-inspect-cgpu。

      wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-darwin -O /usr/local/bin/kubectl-inspect-cgpu
  2. 執行以下命令,為kubectl-inspect-cgpu添加執行許可權。

    chmod +x /usr/local/bin/kubectl-inspect-cgpu
  3. 執行以下命令,查看叢集GPU使用方式。

    kubectl inspect cgpu

    預期輸出:

    NAME                       IPADDRESS      GPU0(Allocated/Total)  GPU Memory(GiB)
    cn-shanghai.192.168.6.104  192.168.6.104  0/15                   0/15
    ----------------------------------------------------------------------
    Allocated/Total GPU Memory In Cluster:
    0/15 (0%)

步驟五:部署共用GPU調度樣本

雲端節點池

  1. 執行以下命令查詢叢集的GPU共用能力。

    kubectl inspect cgpu
    NAME                     IPADDRESS    GPU0(Allocated/Total)  GPU1(Allocated/Total)  GPU Memory(GiB)
    cn-shanghai.192.168.0.4  192.168.0.4  0/7                    0/7                    0/14
    ---------------------------------------------------------------------
    Allocated/Total GPU Memory In Cluster:
    0/14 (0%)
    說明

    您可以執行命令kubectl inspect cgpu -d,查詢GPU共用能力詳細資料。

  2. 部署共用GPU樣本應用,該樣本應用申請3 GiB顯存。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gpu-share-sample
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: gpu-share-sample
        spec:
          nodeSelector:
            alibabacloud.com/nodepool-id: npxxxxxxxxxxxxxx # 此處需替換為您建立的雲端節點池ID。
          containers:
          - name: gpu-share-sample
            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 # 設定GPU顯存大小。
            workingDir: /root
          restartPolicy: Never

邊緣節點池

部署共用GPU樣本應用,該樣本應用申請4 GiB顯存。

apiVersion: batch/v1
kind: Job
metadata:
  name: tensorflow-mnist-share
spec:
  parallelism: 1
  template:
    metadata:
      labels:
        app: tensorflow-mnist-share
    spec:
      nodeSelector:
        alibabacloud.com/nodepool-id: npxxxxxxxxxxxxxx # 此處需替換為您建立的邊緣節點池ID。 
      containers:
      - name: tensorflow-mnist-share
        image: registry.cn-beijing.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:
            aliyun.com/gpu-mem: 4 # 總共申請4 GiB顯存。
        workingDir: /root
      restartPolicy: Never

步驟六:結果驗證

雲端節點池

  1. 登入目標Master節點。

  2. 執行以下命令,查看已部署應用的日誌,驗證cGPU顯存隔離是否部署成功。

    kubectl logs gpu-share-sample --tail=1

    預期輸出:

    2023-08-07 09:08:13.931003: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1326] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 2832 MB memory) -> physical GPU (device: 0, name: Tesla T4, pci bus id: 0000:00:07.0, compute capability: 7.5)

    預期輸出表明,容器申請的顯存為2832 MB。

  3. 執行以下命令,登入容器查看容器被分配顯存總量。

    kubectl exec -it gpu-share-sample nvidia-smi

    預期輸出:

    Mon Aug 7 08:52:18 2023
    +-----------------------------------------------------------------------------+
    | 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 T4            On   | 00000000:00:07.0 Off |                    0 |
    | N/A   41C    P0    26W /  70W |   3043MiB /  3231MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+

    預期輸出表明,該容器被分配顯存總量為3231 MiB 。

  4. 登入帶有GPU裝置的節點,查看樣本應用所在節點的GPU顯存總量。

    nvidia-smi

    預期輸出:

    Mon Aug  7 09:18:26 2023 
    +-----------------------------------------------------------------------------+
    | 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 T4            On   | 00000000:00:07.0 Off |                    0 |
    | N/A   40C    P0    26W /  70W |   3053MiB / 15079MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |    0      8796      C   python3                                     3043MiB |
    +-----------------------------------------------------------------------------+
    
                            

    預期輸出表明,主機上的顯存總量為15079 MiB,其中3053 MiB分配給容器。

邊緣節點池

  1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 容器組

  2. 在建立的容器所在行(例如tensorflow-mnist-share-xxxxx),單擊操作列的終端。然後從下拉式清單中選擇需要登入的容器,執行如下命令。

    nvidia-smi

    預期輸出:

    Fri May 23 06:20:01 2025       
    +---------------------------------------------------------------------------------------+
    | NVIDIA-SMI 535.161.07             Driver Version: 535.161.07   CUDA Version: 12.2     |
    |-----------------------------------------+----------------------+----------------------+
    | 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-16GB           On  | 00000000:00:08.0 Off |                    0 |
    | N/A   35C    P0              56W / 300W |    326MiB / 16384MiB |      0%      Default |
    |                                         |                      |                  N/A |
    +-----------------------------------------+----------------------+----------------------+
                                                                                             
    +---------------------------------------------------------------------------------------+
    | Processes:                                                                            |
    |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
    |        ID   ID                                                             Usage      |
    |=======================================================================================|
    +---------------------------------------------------------------------------------------+

    Pod內部能夠發現整張GPU卡的總顯存16384 MiB(本文樣本使用GPU卡為V100),而在有隔離模組參與的情境下,該值與Pod申請值一致(本文樣本為4 GiB),說明配置生效。

  3. 業務應用需要從兩個環境變數中讀取該業務能夠使用的顯存值。在容器中執行env查看環境變數。

    ALIYUN_COM_GPU_MEM_CONTAINER=4 # 該Pod能夠使用的顯存值。
    ALIYUN_COM_GPU_MEM_DEV=16 # 每張GPU卡總共的顯存值。

    如果應用需要的是顯存的百分比,可以使用上述兩個環境變數計算:

    percetange = ALIYUN_COM_GPU_MEM_CONTAINER / ALIYUN_COM_GPU_MEM_DEV = 4 / 16 = 0.25

相關文檔