故障GPU的Pod自动驱逐功能
GPU卡故障是指由于硬件损坏、驱动异常、通信失败或环境因素等原因,导致GPU无法正常提供计算服务的现象。当GPU卡发生故障时,可能导致Pod启动失败、任务中断、资源浪费等问题,对AI任务和高性能应用影响尤为显著。为了最小化GPU卡故障对业务的影响,CCE提供了故障GPU的Pod自动驱逐功能。开启该功能后,如果CCE AI套件(NVIDIA GPU)插件检测到特定的GPU故障场景,则可以将具有特定标签的Pod驱逐,驱逐后的Pod将由用户或控制器决定是否重建并调度。这有助于降低业务中断时间,提升系统稳定性。
前提条件
- 已有Standard/Turbo集群,且版本在v1.27及以上。
- 集群中已有正常运行的NVIDIA GPU节点。
- 集群中已安装CCE AI套件(NVIDIA GPU)插件,插件版本要求如下:
- 集群版本为v1.27时,插件版本在2.2.1及以上。
- 集群版本为v1.28及以上时,插件版本在2.8.1及以上。
约束与限制
- 开启故障GPU的Pod自动驱逐功能后,仅当CCE AI套件(NVIDIA GPU)插件检测到特定类型的GPU故障时,才会触发自动驱逐Pod的机制。此外,不同故障类型的隔离策略不同,Pod的后续调度行为将根据故障GPU的隔离策略而定,具体如下。支持自动驱逐Pod的GPU故障类型以及各故障类型对应的隔离策略的详细信息,请参见表1。
- 若故障发生后,系统对GPU卡进行隔离(包括单点故障的GPU设备隔离和故障GPU节点的GPU设备隔离):在GPU卡恢复为正常状态之前,Pod被驱逐后不会再次调度到该卡上,以防止业务反复受到影响。
- 若故障发生后,系统不对GPU卡进行隔离:Pod被驱逐后在后续调度中仍可能再次分配到该卡上。
- 故障GPU的Pod自动驱逐功能仅适用于使用整卡调度和共享模式的Pod,暂不支持驱逐使用GPU虚拟化模式的Pod。
操作流程
|
操作步骤 |
步骤说明 |
|---|---|
|
在使用Pod自动驱逐功能时,需先在CCE AI套件(NVIDIA GPU)插件的device-plugin组件中启用对应开关。 |
|
|
开启故障GPU的Pod自动驱逐功能后,当检测到相关故障时,系统会将带有特定标签的Pod驱逐。因此,部署工作负载时需提前为Pod添加指定标签,以确保其能在故障发生时被正确识别并触发驱逐机制。 |
|
|
当故障发生时可以通过故障GPU所在节点的事件,验证Pod是否能够被驱逐。 |
|
|
非必选操作,请结合需求进行配置。 您可以根据业务需求,自定义哪些Xid错误类型属于“严重错误”,哪些属于“应用引发的错误”,二者不能重复。其中“严重错误”会对GPU卡进行隔离,而“应用引发的错误”则不会对GPU卡进行隔离。 Xid严重错误默认为74和79,Xid应用引发的错误默认为13、31、43、45、68和137。 |
步骤一:开启故障GPU的Pod自动驱逐功能
在使用Pod自动驱逐功能时,需首先在CCE AI套件(NVIDIA GPU)插件的device-plugin组件中启用对应开关,具体步骤如下:
- 登录CCE控制台,单击集群名称,进入集群“概览页”。
- 在左侧导航栏中选择“插件中心”,在右侧找到CCE AI套件(NVIDIA GPU)插件,单击“编辑”。
- 在“编辑插件”页面上方,单击“编辑YAML”。将YAML文件中的“enable_pod_eviction_on_gpu_error”值设置为true,以开启故障GPU的Pod自动驱逐功能。
... custom: annotations: {} compatible_with_legacy_api: false component_schedulername: kube-scheduler disable_mount_path_v1: false disable_nvidia_gsp: true driver_mount_paths: bin,lib64 enable_fault_isolation: true enable_health_monitoring: true enable_metrics_monitoring: true enable_simple_lib64_mount: true enable_xgpu: false enable_xgpu_burst: false gpu_driver_config: {} health_check_xids_v2: 74,79 # 与Xid应用引发的错误不能重复 install_nvidia_peermem: false is_driver_from_nvidia: true enable_pod_eviction_on_gpu_error: true ...- enable_pod_eviction_on_gpu_error用于控制是否开启故障GPU的Pod自动驱逐功能,取值如下:
- true:表示开启故障GPU的Pod自动驱逐功能。
- false:默认值,表示不开启故障GPU的Pod自动驱逐功能。
- enable_pod_eviction_on_gpu_error用于控制是否开启故障GPU的Pod自动驱逐功能,取值如下:
- 配置完成后,在右下角单击“确定”。此时,CCE AI套件(NVIDIA GPU)插件将自动升级,待插件状态变为“运行中”后,故障GPU的Pod自动驱逐功能即可生效。
步骤二:部署具有指定驱逐标签的工作负载
开启故障GPU的Pod自动驱逐功能后,当检测到相关故障时,系统会将带有特定标签的Pod驱逐。因此,部署工作负载时需提前为Pod添加指定标签,以确保其能在故障发生时被正确识别并触发驱逐机制。
- 返回CCE控制台,单击集群名称进入集群。在左侧导航栏单击“工作负载”,右上角单击“创建工作负载”。
- 在“容器配置 > 基本信息 >GPU配额”中选择“GPU整卡”或“共享模式”,并设置对应参数。
- GPU整卡:表示GPU整卡调度,即该容器将独立使用GPU卡,系统不会将该卡划分给其他容器使用。
- 共享模式:表示GPU共享调度,即多个容器可共享同一张物理GPU卡的计算资源和显存。
图1 GPU整卡
- 在“高级配置>标签与注解”中,增加标签“evict_on_gpu_error=true”。插件检测到GPU故障时,会对故障GPU上带有此标签的Pod下发驱逐命令。
图2 增加驱逐标签
- 其他参数请参考创建工作负载进行配置。参数配置完成后,在右下角单击“创建工作负载”。待工作负载变为运行中后,则表示创建成功。
以Job为例,其他类型工作负载在相同位置添加相同标签即可。
- 登录客户端机器,并通过kubectl连接集群。
- 执行以下命令,创建一个YAML文件,用于创建需要具有指定驱逐标签的Job。
vim k8-job.yaml文件内容如下,为负载添加驱逐标签evict_on_gpu_error: "true"。
apiVersion: batch/v1 kind: Job metadata: name: k8-job spec: completions: 2 parallelism: 2 template: metadata: # 手动为负载添加特定标签。 labels: evict_on_gpu_error: "true" # 插件检测到GPU故障时,会对故障GPU上带有此标签的Pod下发驱逐命令 spec: restartPolicy: Never schedulerName: volcano containers: - name: k8-job image: pytorch:latest # 替换为您镜像 imagePullPolicy: IfNotPresent command: ["/bin/bash", "-c", "python /etc/scripts/run.py"] # 替换为您的应用命令 resources: limits: nvidia.com/gpu: 1 requests: nvidia.com/gpu: 1
- 执行以下命令,创建工作负载。
kubectl apply -f k8-job.yaml回显结果如下,则说明工作负载已创建。
job.batch/k8-job created
- 执行以下命令,查看Pod是否创建成功。
kubectl get pod -n default回显结果如下,状态皆为Running,则说明创建成功。
NAME READY STATUS RESTARTS AGE k8-job1-jdjbb 1/1 Running 0 28s k8-job1-pr5m4 1/1 Running 0 28s
步骤三:验证Pod是否能够被驱逐
当故障发生时可以通过故障GPU所在节点的事件,验证Pod是否能够被驱逐。
- 登录CCE控制台,单击集群名称,进入集群“概览页”。
- 在左侧导航栏单击“节点列表,右侧切换至“节点”页签。
- 在故障GPU所在节点的操作列,单击“事件”。若出现如下事件,则说明相关Pod驱逐成功。
图3 Pod驱逐事件
