Запуск одновременных задач, сопровождаемых одной задачей в одном скрипте - PullRequest
0 голосов
/ 28 января 2020

Мне нужен сценарий Slurm для выполнения следующих действий:

  1. Создание каталога на пустом месте для временного хранения (запрашивается с помощью диска sbatch --gres: 1024)
  2. Запуск samtools сортировка по сотням файлов bam и хранение отсортированных копий в пустом месте (столько раз, сколько возможно)
  3. После сортировки запустите индекс samtools для отсортированных файлов в пустом месте (как можно больше одновременно)
  4. После индексирования запустите одну (большую) задачу, используя все отсортированные / проиндексированные файлы bam (чем больше процессоров, тем лучше)
  5. Скопируйте необходимые файлы обратно в основную систему хранения и удалите оставшиеся файлы (включая отсортированный bam и index файлы)

Использование массивов заданий basi c, похоже, не работает, поскольку отбрасывает шаги, которые нужно выполнить только один раз. В единственной задаче в конце говорится, что файлов там нет, поэтому я предполагаю, что скрипт опережал себя и удалял все до того, как другие закончили (возможно, запускает rm столько раз, сколько используются массивы), поэтому пробую что-то другое.

Следующий скрипт выдает мне ошибки от samtools о том, что при создании отсортированных файлов bam такого файла или каталога не существует.

[E::hts_open_format] Failed to open file /mnt/scratch/parallel_build/Sample_13-00145.bam
samtools sort: failed to create "/mnt/scratch/parallel_build/Sample_13-00145.bam": No such file or directory

Если я сбрасываю --nodes до 1, сортировка samtools работает нормально, однако она работает только последовательно, и после примерно 50 файлов или около того, она переходит вперед, запускает часть 2, какие файлы есть, и один задача в конце не может найти остальные файлы (работает нормально, если используется менее 30 файлов).

Любая помощь в том, как я могу сделать это правильно, была бы великолепна. Я хотел бы разместить как можно больше задач на всех узлах, когда станет доступно пространство для частей 1 и 2. Часть 3 должна находиться на одном узле, но при этом значительно выигрывает от многих процессоров, поэтому было бы неплохо выделить больше процессоров, чем небольшие параллельные задачи, предшествующие этому (у них может быть меньше процессоров, если это означает, что одновременно выполняется больше задач). Имейте в виду, мне нужно сделать все это в одном процессе, так как пространство для царапин требуется по разным причинам.

#!/bin/sh
#SBATCH --job-name=majiq_build
#SBATCH --nodes=5
#SBATCH --tasks-per-node=4 # 4 tasks, would like more
#SBATCH --cpus-per-task=8
#SBATCH --time=30:00:00
#SBATCH --mem-per-cpu=4G
#SBATCH -A zheng_lab
#SBATCH -p exacloud
#SBATCH --error=/home/exacloud/lustre1/zheng_lab/users/eggerj/Dissertation/splice_net_prototype/beatAML_data/splicing_quantification/test_build_parallel/log_files/build_parallel.x80.%J.err
#SBATCH --output=/home/exacloud/lustre1/zheng_lab/users/eggerj/Dissertation/splice_net_prototype/beatAML_data/splicing_quantification/test_build_parallel/log_files/build_parallel.x80.%J.out

# Set variables
DIR=/home/exacloud/lustre1/zheng_lab/users/eggerj
TMP=/mnt/scratch/parallel_build
WORK=$DIR/Dissertation/splice_net_prototype/beatAML_data/splicing_quantification

# Create temporary directory in requested scratch space to store files
mkdir $TMP
mkdir $TMP/majiq_out

##################################################################################################################
#
# PART 1: Sort bam files (in parallel) and store in scratch space
#         (wait until all are finished before part 2)
#
##################################################################################################################
while read F  ;
do
    fn="$(rev <<< "$F" | cut -d'/' -f 1 | rev)"
    echo $fn
    srun -N 1 -n 1 -c $SLURM_CPUS_PER_TASK --exclusive /opt/installed/samtools-1.6/bin/samtools sort -@ $SLURM_CPUS_PER_TASK -m 4G -o $TMP/$fn $F &
done <$WORK/test_bams/test_bam_list_x80.txt
wait

##################################################################################################################
#
# PART 2: Index bam files (in parallel) in scratch space
#         (wait until all are finished before part 3)
#
##################################################################################################################
for file in $TMP/*bam ;
do
    srun -N 1 -n 1 -c $SLURM_CPUS_PER_TASK --exclusive /opt/installed/samtools-1.6/bin/samtools index -@ $SLURM_CPUS_PER_TASK $file &
done
wait

# Check files actually made it before running MAJIQ
ls -lh $TMP

##################################################################################################################
#
# PART 3: Run MAJIQ build (single task) using all bam files (after all have been indexed)
#
##################################################################################################################

# Activate majiq virtual environment
source $DIR/majiq/bin/activate

# Run MAJIQ build using all bam files (.ini file indicates that bam files are in temp directory)
srun -N 1 -n 1 -c $SLURM_CPUS_PER_TASK --exclusive majiq build $WORK/gtfs/Homo_sapiens.GRCh37.75.gff3 -c $WORK/test_build_parallel/settings.x80.parallel.ini \
                                                          -j $SLURM_CPUS_PER_TASK --output $TMP/majiq_out --min-experiments 0.25
wait

# Move majiq output files from tmp directory to output directory on Lustre and remove
cp $TMP/majiq_out/* $WORK/test_build_parallel/majiq_out_x80/
rm -r $TMP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...