我需要提交一个 slurm 数组,该数组将运行相同的脚本 18000 次(对于独立基因),并且我想以一种不会给我的大学集群造成问题的方式来执行此操作。
目前管理员设置的
MaxArraySize
是2048
。我打算手动设置我的选项,例如:
第一个数组脚本:
#SBATCH --array=2-2000%300
注意:这应该从 2 开始,因为我想跳过正在使用数组读取的文件的第一行。
下一个脚本:
#SBATCH --array=2001-4000%300
等等...
但是 slurm 不喜欢数组中大于 2048 的值。
还有另一种方法可以做到这一点,它不只涉及 for 循环提交单个基因的脚本吗?
(我能想到的都是for循环,但是后来我失去了slurm [
%300
]的约束选项,以避免阻塞调度程序。)
您可以使用
提交两项工作#SBATCH --array=1-2000%300
并且在脚本中,基于
SLURM_ARRAY_TASK_ID
构建行索引,而不是直接使用它。第一份工作:
ROWINDEX=$((SLURM_ARRAY_TASK_ID+1))
在第二份工作中:
ROWINDEX=$((SLURM_ARRAY_TASK_ID+2001))
等等。
然后使用 ROWINDEX 在输入文件中选择所需的行。
首先,“scontrol show config”将显示所有系统范围的配置设置。 当然,每个关联(用户和帐户的某种组合)设置了许多限制。
作为大型集群管理员,我恳求您考虑一下您正在做的事情。 是的,您有很多独立的工作单位。 我们喜欢那个! 关键是它们可能不应该是单独的作业 - 请记住作业数组只是提交作业的简写。 每个 jobarray 成员都是一个完整的作业,会给集群带来相同的成本 - 因此较短的 jobarray 成员与较短的单个作业一样可耻。
不要思考:我有 18k 个“工作”,我如何击败 BOFH 管理员并让他们运行,而是思考“运行单个单元最有效的资源配置是什么,平均需要多长时间,以及如何我可以期望一次从集群中消耗很多资源,那么我应该如何将这些工作单元布置到单独的作业中?”
衡量您的工作单位。 我的真正意思是衡量规模和资源需求。 每个都是连续的吗? 测量他们的 CPU 百分比,测量他们需要多少内存。 哎呀,他们做了多少IO? 如果您使用大量内存但只有一个核心来运行它们,并且 %CPU 不是 100%,那么您可能正在等待 IO。 您应该知道一个单元的平均 CPU 百分比、所需的内存以及作业执行的 IO 量。 您还应该了解工作负载的任何并行扩展(将其视为串行是一个完美的初始假设)。
您实际期望消耗哪些资源? 您可能不被允许使用集群的所有节点。 您可能会因 CPU 和内存占用而“付费”。 集群的IO能力肯定是有限的,那么到底能用多少呢?
现在进行健全性检查:您的总资源需求是多少,您实际上可以期望获取多少资源?您可以对内核和 IO 进行此计算。 这个练习将告诉您是否需要提高工作流程效率(也许优化作业,以便它们可以共享输入、进行节点本地缓存、调整每个任务的核心数量等)。
将批量工作单元安排到您可用的资源单元上。 例如,您可以简单地运行 180 个作业,每个作业有 100 个工作单元。 如果在集群限制内 100 个单位花费的时间是有意义的。 如果您的工作单元速度很快,则每个此类作业可能只是这 100 个单元的序列。 如果您的集群仅允许全节点作业,那么您几乎肯定会希望使用 GNU Parallel 之类的工具一次运行多个工作单元。
现在还要考虑一下您消耗资源的率:例如,如果您的自我调度有效,那么并发作业创建的聚合 IO 会是多少? 在你的集群上可以实现吗? 同样,除非您自己拥有集群,否则您的所有工作可能不会立即开始,那么这会如何影响您的期望?
换句话说,你需要自我调度,而不仅仅是向集群扔作业。 您可以从一种愚蠢的配置开始(提交一个串行作业,一次运行 18k 个工作单元中的每一个)。 这将需要很长时间,因此,如果每个工作单元消耗 100% 的 cpu,请使用 GNU Parallel(甚至 xargs!)同时运行多个工作单元,仍在一个作业中(大概为该作业分配更多内核)。 进一步是将这 18k 分给几个这样的工作。 正确的布局完全取决于您的作业(其资源需求和高效配置)与集群策略(如核心或作业限制)的结合,并通过类似速率的容量(如 IO)进行“剪辑”。