繁体   English   中英

Slurm + drake:空闲作业数组工作者的免费资源用于动态分支

[英]Slurm + drake: free resources of idle job array workers for dynamic branching

编辑:在发现所描述的行为不是源于 SLURM 而是源于 R package {drake} 后,对问题标题和标签进行了调整,后者用作执行 SLURM 数组作业的代理。

我有以下情况:

  • 一个n=70的 Slurm 作业数组,每个作业有 X CPU 和 Y Mem
  • 120个任务要运行
  • 每个任务需要相同的 CPU + 内存,但需要不同的时间来完成

这会导致以下情况:

对于任务 71-120(完成 1-70 之后),我有 50 个活跃的工人和 20 个空闲的工人。 空闲的工人将不再做任何工作,只是等待活动的工人完成。

现在随着时间的推移,越来越多的工人完成工作,在某些时候我有 5 个活跃的工人和 65 个闲置的工人。 假设最后 5 个任务需要相当长的时间才能完成。 在这段时间里,空闲的worker阻塞了集群上的资源,并不断的将以下内容打印到各自的日志文件中

2021-04-03 19:41:41.866282 | > WORKER_WAIT (0.000s wait)
2021-04-03 19:41:41.868709 | waiting 1.70s
2021-04-03 19:41:43.571948 | > WORKER_WAIT (0.000s wait)

[...]

在没有更多任务分配后,有没有办法关闭这些空闲的工作人员并释放资源? 目前他们等到所有工作人员都完成后才释放资源。

感谢@Michael Schubert 的评论,我发现在使用 R package {drake} 及其动态分支功能时会发生这种行为(静态目标可以很好地关闭)。

在这里,“目标”可以具有动态“子目标”,可以通过 SLURM 将其计算为单独的数组作业。 在计算完所有子目标之后,这些子目标将被组合起来。 在此聚合步骤发生之前,所有工作人员都保持在“等待”state 中,其中他们 output 上面显示的WORKER_WAIT状态。

大胆猜测:由于 {drake} 中动态目标的设计,这可能无法避免,因为要聚合所有子目标,这些子目标首先需要存在。 因此,必须将各个子目标保存/保存在临时 state 中,直到所有子目标都可用。

以下 {drake} R 代码可与 SLURM 集群结合使用,以重现解释的行为:

  list_time = c(30,60),
  test_dynamic = target(
    Sys.sleep(time = list_time),
    dynamic = map(list_time)
  ),

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM