Скрипт SLURM sbatch не выполняет все команды srun в цикле while - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь отправить несколько заданий параллельно в качестве шага предварительной обработки в sbatch с использованием srun. L oop читает файл, содержащий 40 имен файлов, и использует «команду srun» для каждого файла. Однако не все файлы отсылаются с помощью srun, а остальная часть сценария sbatch продолжается после того, как те, которые действительно были отправлены, заканчиваются sh. Реальный сценарий sbatch более сложный, и я не могу использовать массивы с этим, чтобы он не работал. Эта часть должна быть довольно простой.

Я сделал этот простой тестовый пример как проверку работоспособности, и он делает то же самое. Для каждого имени файла в списке файлов (40) создается новый файл, содержащий «foo». Каждый раз, когда я отправляю скрипт с помощью sbatch, это приводит к тому, что с помощью srun отправляется разное количество файлов.

#!/bin/sh
#SBATCH --job-name=loop
#SBATCH --nodes=5
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --time=00:10:00
#SBATCH --mem-per-cpu=1G
#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/test.%J.err
#SBATCH --output=/home/exacloud/lustre1/zheng_lab/users/eggerj/Dissertation/splice_net_prototype/beatAML_data/splicing_quantification/test_build_parallel/log_files/test.%J.out

DIR=/home/exacloud/lustre1/zheng_lab/users/eggerj/Dissertation/splice_net_prototype/beatAML_data/splicing_quantification/test_build_parallel
SAMPLES=$DIR/samples.txt
OUT_DIR=$DIR/test_out
FOO_FILE=$DIR/foo.txt

# Create output directory
srun -N 1 -n 1 -c 1 mkdir $OUT_DIR

# How many files to run
num_files=$(srun -N 1 -n 1 -c 1 wc -l $SAMPLES)
echo "Number of input files: " $num_files

# Create a new file for every file in listing (run 5 at a time, 1 for each node)
while read F  ;
do
    fn="$(rev <<< "$F" | cut -d'/' -f 1 | rev)" # Remove path for writing output to new directory
    echo $fn
    srun -N 1 -n 1 -c 1 cat $FOO_FILE > $OUT_DIR/$fn.out &
done <$SAMPLES
wait

# How many files actually got created
finished=$(srun -N 1 -n 1 -c 1 ls -lh $OUT_DIR/*out | wc -l)
echo "Number of files submitted: " $finished

Вот мой выходной файл журнала, когда я в последний раз пытался его запустить:

Number of input files:  40 /home/exacloud/lustre1/zheng_lab/users/eggerj/Dissertation/splice_net_prototype/beatAML_data/splicing_quantification/test_build_parallel/samples.txt
sample1
sample2
sample3
sample4
sample5
sample6
sample7
sample8
Number of files submitted:  8

1 Ответ

0 голосов
/ 06 февраля 2020

Проблема заключается в том, что srun перенаправляет свой stdin на запускаемые задачи, и поэтому содержимое $SAMPLES непредсказуемым образом используется всеми запускаемыми командами cat.

Попробуйте с

srun --input none -N 1 -n 1 -c 1 cat $FOO_FILE > $OUT_DIR/$fn.out &

Параметр --input none скажет srun не связываться с stdin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...