如何让AzureML作业在附加Kubernetes集群等待GPU可用而非失败
问题描述
我在附加的Kubernetes计算集群上运行AzureML作业,使用的是自定义实例类型,该类型要求2个GPU资源。当触发作业时,由于其他作业占用了GPU,集群仅剩余1个GPU可用。我期望作业进入排队状态,等2个GPU可用后再启动,但作业标签中出现了如下错误:
retry-reason-1 : 03/08/2023 10:45:05 +00:00, FailureMsg: PodPattern matched: {"reason":"UnexpectedAdmissionError","message":"Pod Allocate failed due to requested number of devices unavailable for nvidia.com/gpu. Requested: 2, Available: 1, which is unexpected"}, FailureCode: -1006
作业会重试10次后直接失败。我能否修改这个行为?比如设置最长等待时间,让作业排队更久,避免快速失败。
触发作业的az CLI命令:
az ml job create -f myjob.yaml
作业YAML定义:
$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json experiment_name: my-experiment command: | python myscript.py code: . environment: azureml:my-environment:1 compute: azureml:my-onprem-compute resources: instance_type: myinstancetypewith2gpus
解决方法
1. 自定义作业重试与超时配置
在作业YAML中添加retry_settings字段,调整重试次数、间隔以及作业总超时时间,让作业有更长时间等待资源:
$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json experiment_name: my-experiment command: | python myscript.py code: . environment: azureml:my-environment:1 compute: azureml:my-onprem-compute resources: instance_type: myinstancetypewith2gpus # 新增重试与超时配置 retry_settings: max_retries: 50 # 大幅增加重试次数 retry_interval: 300 # 重试间隔设为5分钟(单位:秒) timeout: 86400 # 作业总时长上限设为24小时(含排队+运行时间)
2. 优化Kubernetes调度策略
要让资源不足时Pod进入Pending状态而非直接触发准入错误,需调整Kubernetes层面的配置:
- 确保
nvidia-device-plugin未启用资源耗尽时直接拒绝的策略,允许Pod等待资源释放。 - 启用
PodPriorityAndFairness特性,配置作业优先级,避免低优先级作业抢占资源,同时让高优先级作业能长期排队等待。
3. 集群资源扩容优化(可选)
如果集群支持自动缩放,可开启AzureML计算集群的节点自动缩放功能:
- 在AzureML工作室中找到目标Kubernetes计算集群,开启自动缩放,设置最小/最大节点数,当GPU资源不足时自动扩容节点,从根源解决资源短缺问题。
- 也可在作业中指定
priority字段,确保关键作业优先获得资源:
priority: high # 优先级可选值:low/medium/high
注意事项
timeout参数控制作业从提交到终止的总时长,需根据实际需求设置足够大的值,避免因排队时间过长被强制终止。- 单纯调整重试参数是治标方法,优化Kubernetes调度策略才能让Pod真正进入排队状态等待资源,而非反复重试失败。
内容的提问来源于stack exchange,提问作者ouphi
相关产品推荐
相关产品推荐

