【问题标题】:How to process a list of files with SLURM如何使用 SLURM 处理文件列表
【发布时间】:2018-01-16 16:52:11
【问题描述】:

我是 SLURM 的新手。我想并行处理文件列表assembled_reads/*.sorted.bam。使用下面的代码,但是只有一个进程被反复使用。

#!/bin/bash
#
#SBATCH --job-name=****
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=24
#SBATCH --partition=short
#SBATCH --time=12:00:00
#SBATCH --array=1-100
#SBATCH --mem-per-cpu=16000
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=****@***.edu
srun hostname

for FILE in assembled_reads/*.sorted.bam; do
  echo ${FILE}
  OUTFILE=$(basename ${FILE} .sorted.bam).raw.snps.indels.g.vcf
  PLDY=$(awk -F "," '$1=="$FILE"{print $4}' metadata.csv)
  PLDYNUM=$( [[$PLDY = "haploid" ]] && echo "1" || echo "2")

  srun java -Djava.io.tmpdir="tmp" -jar GenomeAnalysisTK.jar \
  -R scaffs_HAPSgracilaria92_50REF.fasta \
  -T HaplotypeCaller \
  -I ${${SLURM_ARRAY_TASK_ID}} \
  --emitRefConfidence GVCF \
  -ploidy $PLDYNUM \
  -nt 1 \
  -nct 24 \
  -o $OUTFILE
  sleep 1 # pause to be kind to the scheduler
done

【问题讨论】:

  • 见下面 damienfrancois 的回答。您可能可以使用确定文件数量的包装脚本,然后使用--array 参数提交他的答案中显示的脚本,以指定包装脚本中确定的文件数量。
  • 您应该使用可以提交到 SLURM 的工作流管理器。我会推荐Nextflow。 SLURM 文档 herehere。如果您尝试仅使用 SLURM 执行此操作,您的分析管道将很快变得过于复杂而无法管理和/或您将破坏集群的性能。
  • 此外,快速的 Google 搜索将显示运行 GATK 的示例 Nextflow 管道,有些甚至可能已经带有基本的 SLURM 配置。有些列出了here

标签: bash parallel-processing slurm


【解决方案1】:

您正在创建一个作业数组,但没有使用它。您应该将 for 循环替换为基于 slurm 作业数组 id 的文件索引:

#!/bin/bash
#
#SBATCH --job-name=****
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=24
#SBATCH --partition=short
#SBATCH --time=12:00:00
#SBATCH --array=0-99
#SBATCH --mem-per-cpu=16000
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=****@***.edu
srun hostname
FILES=(assembled_reads/*.sorted.bam)    
FILE=${FILES[$SLURM_ARRAY_TASK_ID]}

echo ${FILE}
OUTFILE=$(basename ${FILE} .sorted.bam).raw.snps.indels.g.vcf
PLDY=$(awk -F "," '$1=="$FILE"{print $4}' metadata.csv)
PLDYNUM=$( [[$PLDY = "haploid" ]] && echo "1" || echo "2")

srun java -Djava.io.tmpdir="tmp" -jar GenomeAnalysisTK.jar \
  -R scaffs_HAPSgracilaria92_50REF.fasta \
  -T HaplotypeCaller \
  -I ${${SLURM_ARRAY_TASK_ID}} \
  --emitRefConfidence GVCF \
  -ploidy $PLDYNUM \
  -nt 1 \
  -nct 24 \
  -o $OUTFILE

只需确保将--array 的值调整为等于要处理的文件数即可。

【讨论】:

  • 哇。我记得有几次使用 LSF 作业数组并且必须在文件名中包含连续的数字。这更加灵活!
  • 有了这个相同的文件作为输入传递给每次迭代。我需要几天时间才能完成我回复这么晚的原因
  • 我认为这有点错误, --array=0-99 实际上会处理 100 个文件。然后 ${FILES[$SLURM_ARRAY_TASK_ID]} 将正确地为 0-99 并索引所有 100 个文件。否则它将离开第一个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
相关资源
最近更新 更多