本文介紹如何通過部署建立GPU共用容器的YAML檔案,利用cGPU顯存隔離能力,高效利用GPU裝置資源。
索引
前提條件
注意事項
針對納入K8s叢集管理的GPU節點,為業務應用申請和使用GPU資源時,請關注以下注意事項。
請勿直接在節點上運行GPU應用程式。
請勿通過
docker
、podman
、nerdctl
等工具命令建立容器並為容器申請GPU資源。例如,執行docker run --gpus all
或docker run -e NVIDIA_VISIBLE_DEVICES=all
並運行GPU程式。請勿在Pod YAML的
env
中直接添加環境變數NVIDIA_VISIBLE_DEVICES=all
或NVIDIA_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共用能力。
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共用能力詳細資料。
部署共用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
執行以下命令,查看叢集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顯存隔離能力是否生效。
登入目標Master節點。
執行以下命令,查看已部署應用的日誌,驗證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。
執行以下命令,登入容器查看容器被分配顯存總量。
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 。
登入帶有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分配給容器。