机器学习平台支持用户为自定义任务(以及在线服务)设定优先级,根据优先级的高低进行负载的调度。具体的配置方法详见发起单机/分布式训练任务。优先级越高代表该任务越重要,越希望尽早获得资源完成任务的运行。反之,优先级低的任务获得资源的机会相对靠后,但这不是绝对的,下文将详细介绍平台基于优先级实现的调度策略。
优先级的数字越大越有可能尽早地被调度,当优先级相同时创建时间越早的任务越有可能早地被调用。
场景举例:
10:00:同一队列下的不同用户以相同的默认优先级创建自定义任务,排除下文中将提到的所有干扰因素,这些任务将根据创建时间从早到晚依次获得资源。
11:00:此时有一个任务的创建人认为排队太久会耽误进度,因此联系队列管理员申请调高自己任务的优先级,管理员认可后提升了该任务的优先级(甚至提到最高)。
11:05:被提升优先级的任务获得了资源,其它低优或者相同优先级中创建时间更晚的任务(或其它类型的负载)继续排队。
当满足了高优、创建时间早的条件后,负载能享有尽早被调度的权利,但这并不是绝对的。平台默认的调度策略是资源利用率最大化,即尽可能地将空闲资源用尽,所以资源需求量小的任务在被调度的顺序上有先天优势。
场景举例:
10:00:存在两个任务 A、B,它们除了创建时间和资源量之外,所有配置均相同(包括优先级)。A 的创建时间早于 B。B 是一个小资源量(4c8g)的任务,A 的资源需求较大(8c16g),此时队列的空闲资源为 1c2g,所以任务 A、B 均排队等等资源。
11:00:队列的空闲资源随着一系列负载的运行结束逐渐增加到 4c8g。从优先级和创建时间的角度来看,虽然任务 A 要先于 B 做调度,但此时空闲资源仅够任务 B 运行,为了资源利用率最大化,任务 B 将等于任务 A 运行。
上文提到为避免小资源量任务被高优的大资源量任务 “饿死”,当队列的空闲资源较少时,优先级更低的小资源量任务有可能先于大任务被调度。当小任务数量较多时有可能出现另一种极端现象 —— 小任务 “饿死” 大任务。为解决该问题平台支持为某个任务预留资源,开启该功能后,优先级低于该任务的将会持续排队直至该任务运行,优先级高于/等于该任务的则不受影响。
场景举例:
10:00:队列空闲资源为 0,任务 A(4c8g,优先级为 6)、B(1c2g,优先级为 4)、C(2c4g,优先级为 4)、D(1c2g,优先级为 2) 均处于排队状态,除此之外无其它排队任务。
11:00:队列中有任务运行结束,空闲资源变为 1c2g,因无法满足任务 A 的资源诉求,所以更低优的任务 B 被调度。队列空闲资源再次变为0,此时任务 A、C、D 继续排队。
11:05:队列管理员为任务 A 启动资源预留,此时任务 A、C、D 继续排队。
11:10:队列空闲资源变为 2c4g,由于任务 A 启动了资源预留,这 2c4g 无法用于任务 C 的调度。
11:15:队列空闲资源变为 4c8g,任务 A 终于攒够了资源被成功调度。队列空闲资源再次变为0,此时任务 C、D 继续排队。
11:20:队列空闲资源变为 1c2g,此时继续以资源利用率最大化的策略做调度,所以优先级为 4 的任务 C 继续排队,优先级为 2 的优先 D 被提前调度。
针对闲时任务,当资源组中有高优先级任务开启资源预留后,优先会保证开启资源预留的任务完成调度,随后根据资源组中剩余可用配额进行闲时任务的调度。
场景举例:
自定义任务支持在同一资源组维度下,使用其它队列的空闲资源提交成闲时任务,用于应对各队列忙闲不均导致整体资源利用率低的问题。
当队列中出现非闲时任务排队时,平台会在整个资源组的范围内寻找适当的闲时任务并将其停止,将释放出来的资源用于调度非闲时任务。由此可见,与任务本身优先级及创建时间无关,非闲时任务获得资源的优先级始终高于闲时任务(尽管非闲时任务的优先级数字可能比闲时任务的小)。
假设队列中同时存在优先级、创建时间均不同的非闲时任务和闲时任务,调度顺序如下(从上到下依次调度):
任务名称 | 闲时 / 非闲时 | 优先级 | 创建时间 |
---|---|---|---|
任务 A | 非闲时任务 | 9 | 10 点 |
任务 B | 非闲时任务 | 9 | 11 点 |
任务 C | 非闲时任务 | 2 | 10 点 |
任务 D | 闲时任务 | 4 | 10 点 |
任务 E | 闲时任务 | 4 | 11 点 |
任务 F | 闲时任务 | 2 | 10 点 |
开启了自动重试的自定义任务会在中断时自动生成一个相同的任务。为避免被打断的任务需要花很久的时间重新排队,平台为重试的任务开通了高优入队的通道。当队列的空闲资源仅满足重试任务(已创建成功)和普通任务其中之一时,无论普通任务的优先级多高,已创建成功的重试任务将优先于普通任务获得资源。
除此之外,需要强调的是闲时任务触发重试后,是在整个资源组范围内的闲时任务中处于高优入队的地位,而非闲时任务触发重试后只是在本队列内的非闲时任务中做高优入队。
场景举例:
10:00:存在任务 A(资源量为 2c4g,开启了自动重试)和任务 B(资源量为 2c4g),两个任务的优先级相同。此时任务 A 正常运行中,任务 B 排队,队列空闲资源为 0。
11:00:队列空闲资源为 0,任务 B 仍然排队中,任务 A 被中断(释放出了 2c4g 的资源量)同时自动生成了新的任务 A1。此时任务 A1 因为享有高优入队的权利,于是任务 A1 正常运行,任务 B 继续排队。