本文介绍如何通过部署创建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分配给容器。