机器学习平台支持用户为自定义任务(以及在线服务)设定优先级,根据优先级的高低进行负载的调度。具体的配置方法详见发起单机/分布式训练任务。优先级越高代表该任务越重要,越希望尽早获得资源完成任务的运行。反之,优先级低的任务获得资源的机会相对靠后,但这不是绝对的,下文将详细介绍平台基于优先级实现的调度策略。
优先级的数字越大越有可能尽早地被调度,当优先级相同时创建时间越早的任务越有可能早地被调用。
场景举例:
当满足了高优、创建时间早的条件后,负载能享有尽早被调度的权利,但这并不是绝对的。平台默认的调度策略是资源利用率最大化,即尽可能地将空闲资源用尽,所以资源需求量小的任务在被调度的顺序上有先天优势。
场景举例:
上文提到为避免小资源量任务被高优的大资源量任务 “饿死”,当队列的空闲资源较少时,优先级更低的小资源量任务有可能先于大任务被调度。当小任务数量较多时有可能出现另一种极端现象 —— 小任务 “饿死” 大任务。为解决该问题平台支持为某个任务预留资源,开启该功能后,优先级低于该任务的将会持续排队直至该任务运行,优先级高于/等于该任务的则不受影响。同时,使用闲时资源的负载在调度时也不受资源预留任务影响。
场景举例:
自定义任务支持在同一资源组维度下,使用其它队列的空闲资源提交成闲时任务,用于应对各队列忙闲不均导致整体资源利用率低的问题(支持异构队列间资源共享,例如ml.gni3队列的闲时任务可调用ml.pni2队列的闲时资源)。
当队列中出现非闲时任务排队时,平台会在整个资源组的范围内寻找适当的闲时任务并将其停止,将释放出来的资源用于调度非闲时任务。由此可见,与任务本身优先级及创建时间无关,非闲时任务获得资源的优先级始终高于闲时任务(尽管非闲时任务的优先级数字可能比闲时任务的小)。
假设队列中同时存在优先级、创建时间均不同的非闲时任务和闲时任务,调度顺序如下(从上到下依次调度):
任务名称 | 闲时 / 非闲时 | 优先级 | 创建时间 |
|---|---|---|---|
任务 A | 非闲时任务 | 9 | 10 点 |
任务 B | 非闲时任务 | 9 | 11 点 |
任务 C | 非闲时任务 | 2 | 10 点 |
任务 D | 闲时任务 | 4 | 10 点 |
任务 E | 闲时任务 | 4 | 11 点 |
任务 F | 闲时任务 | 2 | 10 点 |
开启了自动重试的自定义任务会在中断时自动生成一个相同的任务,并在设定的重试间隔后提交至队列。重试间隔期间任务可以选择重试保留资源,不释放资源,这样可以快速重启任务,提升执行效率。
如需重新分配资源的任务,为避免被打断的任务需要花很久的时间重新排队,平台为重试的任务开通了高优入队的通道。当队列的空闲资源仅满足重试任务(已创建成功)和普通任务其中之一时,无论普通任务的优先级多高,已创建成功的重试任务将优先于普通任务获得资源。
除此之外,需要强调的是闲时任务触发重试后,是在整个资源组范围内的闲时任务中处于高优入队的地位,而非闲时任务触发重试后只是在本队列内的非闲时任务中做高优入队。
场景举例: