全部產品
Search
文件中心

Container Service for Kubernetes:運行共用GPU調度樣本

更新時間:Jun 19, 2024

本文介紹如何通過部署建立GPU共用容器的YAML檔案,利用cGPU顯存隔離能力,高效利用GPU裝置資源。

索引

前提條件

已安裝並使用共用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社區的已知報錯

操作步驟

  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:
          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

  3. 執行以下命令,查看叢集GPU顯存使用方式。

    kubectl inspect cgpu

    預期輸出:

    NAME                      IPADDRESS      GPU0(Allocated/Total)  GPU Memory(GiB)
    cn-beijing.192.168.1.105  192.168.1.105  3/14                   3/14
    ---------------------------------------------------------------------
    Allocated/Total GPU Memory In Cluster:
    3/14 (21%)

    預期輸出表明,節點cn-beijing.192.168.1.105共有14 GiB顯存,已指派3 GiB顯存。

結果驗證

您可以通過以下方式驗證節點GPU顯存隔離能力是否生效。

  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分配給容器。