SLURM:并行运行作业而不是按数组运行?

时间:2018-07-16 21:13:03

标签: arrays slurm

我有一个大文件要使用“水母查询”进行分析,该文件不是多线程的。我已将大文件分为29个可管理的片段,以在SLURM上作为数组运行。但是,这些文件在工作负载队列中放置了很长时间,而如果我可以请求整个节点(32 cpus),则它们将进入一个单独的队列,从而具有更快的可用性。有没有办法告诉SLURM在一个节点上的所有CPU上并行地在这些片段上运行命令,而不是以串行数组的形式运行?

3 个答案:

答案 0 :(得分:0)

我建议您运行一个python脚本为该线程多线程,然后提交SLURM作业以运行python脚本。

from multiprocessing import Pool
import subprocess

num_threads = 29

def sample_function(input_file):
    return subprocess.run(["cat", input_file], check=True).stdout

input_file_list = ['one','two','three']

pool = Pool(processes=num_threads)
[pool.apply_async(sample_function, args=(input_file,)) for input_file in input_file_list]

pool.close()
pool.join()

这假定您具有文件“一个”,“两个”和“三个”。显然,您需要替换:

  1. 输入文件列表
  2. 您要与subprocess一起运行的
  3. 职位

答案 1 :(得分:0)

您可以请求29个任务,每个任务1 cpu(您将从一个节点上的29 cpus到29个不同节点上的1 cpu),在slurm脚本中,应使用srun开始演算,告诉srun分配每个块一个任务/ CPU。

.
.
.
#SBATCH --ntasks=29
#SBATCH --cpus-per-task=1
.
.
.

for n in {1..29}
do
    srun -n 1 <your_script> $n &
done
wait

答案 2 :(得分:0)

感谢您的建议!我发现了一种不太优雅但仍然实用的方法:

#SBATCH --nodes=1
#SBATCH --ntasks=32
#SBATCH --cpus-per-task=1

jellyfish query...fragment 1 &
jellyfish query...fragment 2 &
...
jellyfish query...fragment 29 
wait