使用故障重调度需要在下发vcjob的yaml中增加“fault-scheduling”,"terminationGracePeriodSeconds","maxRetry"参数,具体说明如下所示:
序号 |
值 |
含义 |
|---|---|---|
1 |
grace |
任务使用重调度,并在过程中先优雅删除原pod,15分钟(配置可参考Volcano配置)后若还未成功,使用强制删除原pod。若使用临终遗言方案,则需要使用该项配置。 |
2 |
force |
任务使用重调度,并在过程中强制删除原pod。 |
3 |
off |
该任务不使用故障重调度特性。k8s的maxRetry仍然生效。 |
4 |
无(无fault-scheduling) |
同off。 |
5 |
其他值 |
同off。 |
序号 |
值 |
含义 |
|---|---|---|
1 |
0< terminationGracePeriodSeconds <"grace-over-time”参数的值 |
容器收到停止信号到被K8s强制停止经历的时间;该时间需要大于0且小于volcano-*.yaml文件中“grace-over-time”参数的值,同时还需要保证能够保存完ckpt文件,请根据实际情况修改。具体说明请参考K8s官网容器生命周期回调。 |
此外还要使用"maxRetry"机制,以yaml模板为例,具体如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: rings-config-mindx-dls-test
namespace: vcjob
labels:
ring-controller.atlas: ascend-910
data:
hccl.json: |
{
"status":"initializing"
}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: fault-config-mindx-dls-test
namespace: vcjob
data:
fault-npus: |
{
"status":"initializing"
}
---
apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: mindx-dls-test #注意和 ConfigMap的name的对应关系
namespace: vcjob #根据实际需要选择合适的namespace(ConfigMap, Job需要保持一致)
labels:
ring-controller.atlas: ascend-910 #hccl_controller 根据该标签来区分配置Ascend910和非Ascend910的场景
fault-scheduling: "force"
spec:
minAvailable: 1
schedulerName: volcano #使用volcano调度器调度任务
policies:
- event: PodEvicted
action: RestartJob
plugins:
ssh: []
env: []
svc: []
maxRetry: 3
...
spec:
containers:
- image: mindspore:b035 # 训练框架镜像,可修改
imagePullPolicy: IfNotPresent
name: mindspore
...
command:
- "/bin/bash"
- "-c"
- "cd /job/code/resnet/scripts; chmod +x train_start.sh; ./train_start.sh;" # 训练脚本执行命令。确保Docker上存在相关命令和路径。
#args: [ "while true; do sleep 30000; done;" ] # 注释掉上一行并启用该行。用户可以在容器中手动运行训练脚本方便调试。
# 命令为'kubectl exec -it -n {namespace} {podname} bash'
lifecycle: #使用临终遗言功能需要添加加粗代码
preStop:
exec:
command: ["/bin/bash", "-c", "cd /job/code/resnet/scripts; bash pre_stop.sh"]
resources:
requests:
huawei.com/Ascend910: 1 # 请求的NPU数量,最大值为8。用户可在下方添加行配置内存、CPU等资源
limits:
huawei.com/Ascend910: 1 # 数值与请求数量保持一致
...