【问题标题】:SLURM: run jobs in parallel instead of as array?SLURM:并行运行作业而不是数组?
【发布时间】:2018-12-24 11:52:47
【问题描述】:

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

【问题讨论】:

标签: arrays slurm


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以要求 29 个任务,每个任务 1 个 cpu(您将从一个节点上的 29 个 cpu 到 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
    

    【讨论】:

      【解决方案3】:

      我建议为您运行一个 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 运行的作业

      【讨论】:

        猜你喜欢
        • 2021-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-14
        • 2019-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多