训练容器生命周期
概述
在ModelArts Standard平台执行训练作业时,平台将每个子任务封装为 Kubernetes Pod,并持续监控 Pod 健康。在机器节点发生故障时,平台将自动完成「故障驱逐 → 节点补足 → 作业续训」的完整闭环,保证训练作业的连续性,用户无需手动干预。
作业与容器结构
用户创建的训练作业称为Job,如果为分布式作业,会根据用户选择的实例数产生多个Task;Task在机器节点上的执行单元即为Pod。
它们的关系如下图所示:
故障恢复
在训练作业的运行中,除了作业自身的逻辑问题,也可能因平台侧计算资源的异常状况而导致任务失败。训练平台会不断观测承载作业的资源的各项状态,当发现影响到作业执行的软硬件问题时(例如加速卡的各类故障),会采取必要手段将用户的训练作业暂停,重新分配到可用的计算节点上重新拉起执行。
Job重调度策略是在作业故障时,将用户作业涉及到的所有Pod关停,并将Job实例完全重建,其过程如下图所示:
如果用户的训练作业已经适配了断点续训,那么可以采用Pod重调度策略来加速恢复过程。
相比于Job重调度直接重新删除创建整个Job,Pod重调度中会保留现有的Job实例不变,而仅重新创建故障Pod。
用户作业视角
从用户的训练进程视角来看,每个Task会随着重调度经历不同的状态。如下所示,作业先经过Job重调度,三个Task所在Pod均被停止之后重新调度。接着在Pod重调度中,Task0与Task1中用户进程会被终止,而容器环境则保留;直到Task2所在Pod被重新调度后,三个Task重新开始运行,此时Task0与Task1中的用户进程也会被重新启动。
ModelArts平台会为用户进程注入环境变量,以标识作业经历过的生命周期。其中MA_SCHEDULE_CNT代表Task所在Pod被调度的次数,MA_PROC_START_CNT代表用户进程被启动的次数。
例如在上图中,在Pod重调度后的这个时间点上,Task0所在Pod被启动两次,在最后一次Pod容器启动后,其中的用户进程被启动两次;Task2所在的Pod被启动了三次,在最后一次Pod容器启动后,其中的用户进程被启动一次。