使用Kubernetes默认GPU调度
Standard/Turbo集群支持使用Kubernetes默认GPU调度模式。该模式基于Device Plugin机制,通过资源类型实现对GPU的标准化管理。当节点安装了CCE AI套件(NVIDIA GPU)插件后,CCE可以自动识别节点上的GPU数量,并在调度时通过resources.limits字段为Pod分配资源(如nvidia.com/gpu: 1)。nvidia.com/gpu支持设置为整数和小数:
- 当nvidia.com/gpu的值设置为正整数(如nvidia.com/gpu: 1)时,表示GPU整卡调度,即该容器将独占使用一张物理GPU卡,系统不会将该卡划分给其他容器使用,适用于对资源性能和隔离要求高的场景。
- 当nvidia.com/gpu的值设置为小数(如nvidia.com/gpu: 0.2)时,表示GPU共享调度,即多个容器可共享同一张物理GPU卡的计算资源和显存,适用于轻量级推理等对算力需求较低的场景。
本文将进一步为您介绍如何使用Kubernetes默认GPU调度模式。关于该模式的更多信息,请参见调度GPU。
前提条件
- 创建GPU类型节点,具体请参见创建节点。
- 集群中需要安装CCE AI套件(NVIDIA GPU)插件,且安装时注意要选择节点上GPU型号对应的驱动,具体请参见CCE AI套件(NVIDIA GPU)。
- 在v1.27及以下的集群中使用默认GPU调度能力时,CCE AI套件(NVIDIA GPU)插件会把驱动的目录挂载到/usr/local/nvidia/lib64,在容器中使用GPU资源需要将/usr/local/nvidia/lib64追加到LD_LIBRARY_PATH环境变量中。v1.28及以上的集群中则无需执行此步骤。
- 制作镜像的Dockerfile中配置LD_LIBRARY_PATH。(推荐)
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib64:$LD_LIBRARY_PATH
- 镜像的启动命令中配置LD_LIBRARY_PATH。
/bin/bash -c "export LD_LIBRARY_PATH=/usr/local/nvidia/lib64:$LD_LIBRARY_PATH && ..."
- 创建工作负载时定义LD_LIBRARY_PATH环境变量(需确保容器内未配置该变量,不然会被覆盖)。
... env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64 ...
- 制作镜像的Dockerfile中配置LD_LIBRARY_PATH。(推荐)
创建默认GPU调度工作负载
创建默认GPU调度工作负载时,支持使用控制台和kubectl命令行的方式,具体如下:
- 登录CCE控制台,单击集群名称进入集群。在左侧导航栏单击“工作负载”,右上角单击“创建工作负载”。
- 在“容器配置 > 基本信息 >GPU配额”中选择对应的调度方式,并在下方填写需要的资源量。默认GPU调度包括“GPU整卡”和“共享模式”,具体介绍如下:
- GPU整卡:表示GPU整卡调度,即该容器将独立使用GPU卡,系统不会将该卡划分给其他容器使用。
- 共享模式:表示GPU共享调度,即多个容器可共享同一张物理GPU卡的计算资源和显存。
图1 GPU整卡 - (可选步骤)如果需要为该工作负载指定GPU资源,请在“GPU显卡”处选择对应GPU资源。选择完成后,系统将根据资源类型让Pod与相关节点亲和,从而让Pod选择正确的节点。
- 其他参数请参考创建工作负载进行配置,参数配置完成后,在右下角单击“创建工作负载”。待工作负载变为运行中后,则表示创建成功。
- 使用kubectl连接集群。
- 执行以下命令,创建YAML文件,用于创建一个使用Kubernetes默认GPU调度的工作负载。
vim gpu-app.yaml
文件内容如下:
apiVersion: apps/v1 kind: Deployment metadata: name: gpu-test namespace: default spec: replicas: 1 selector: matchLabels: app: gpu-test template: metadata: labels: app: gpu-test spec: nodeSelector: accelerator: nvidia-t4 containers: - image: nginx:perl name: container-0 resources: requests: cpu: 250m memory: 512Mi nvidia.com/gpu: 1 # 非必填,填写时必须与limits.nvidia.com/gpu保持一致 limits: cpu: 250m memory: 512Mi nvidia.com/gpu: 1 # 用于指定GPU资源量 imagePullSecrets: - name: default-secret
- nodeSelector:可选参数,表示节点选择器。创建GPU节点后,系统将会为其加上对应资源标签。使用GPU资源时,可以根据标签让Pod与相关节点亲和,从而让Pod选择正确的节点。
kubectl get node -L accelerator
回显结果如下,加粗部分即为对应标签值:
NAME STATUS ROLES AGE VERSION ACCELERATOR 10.100.2.179 Ready <none> 8m43s v1.19.10-r0-CCE21.11.1.B006-21.11.1.B006 nvidia-t4
- resources.limits.nvidia.com/gpu:用于指定GPU资源量。
- 当nvidia.com/gpu的值设置为正整数(如nvidia.com/gpu: 1)时,表示GPU整卡调度,即该容器将独占使用一张物理GPU卡,系统不会将该卡划分给其他容器使用。
- 当nvidia.com/gpu的值设置为小数(如nvidia.com/gpu: 0.2)时,表示GPU共享调度,即多个容器可共享同一张物理GPU卡的计算资源和显存。
requests.nvidia.com/gpu为非必填项,填写时必须与limits.nvidia.com/gpu保持一致。
- nodeSelector:可选参数,表示节点选择器。创建GPU节点后,系统将会为其加上对应资源标签。使用GPU资源时,可以根据标签让Pod与相关节点亲和,从而让Pod选择正确的节点。
- 执行以下命令,创建工作负载。
kubectl apply -f gpu-app.yaml
回显结果如下,则说明工作负载已创建。
deployment.apps/gpu-test created
- 执行以下命令,查看已创建的Pod名称。
kubectl get pod -n default
回显结果如下:
NAME READY STATUS RESTARTS AGE gpu-test-6bdb4d7cb-pmtc2 1/1 Running 0 21s
- 执行以下命令,登录容器内部。
kubectl -n default exec -it gpu-test-6bdb4d7cb-pmtc2 -c container-0 -- /bin/bash
- 在容器内执行以下命令,查看GPU是否分配成功。
nvidia-smi
由回显结果可知,GPU分配成功。
常见问题
问题现象:工作负载创建失败,报错信息如下:
- 0/2 nodes are available: 2 Insufficient nvidia.com/gpu.
- 0/4 nodes are available: 1 InsufficientResourceOnSingleGPU, 3 Insufficient nvidia.com/gpu.
问题原因:对应的GPU资源不足。指定nvidia.com/gpu后,系统不会将负载调度到没有GPU的节点,当资源不足时,将会产生上述错误。
解决方案:购买对应的GPU节点,保证GPU资源充足。