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