Slurm Array Job: возможен ли выходной файл на том же узле?

У меня есть вычислительный кластер с четырьмя узлами A, B, C и D и Slurm Version 17.11.7. Я борюсь с работой с массивом Slurm. У меня есть следующий скрипт bash:

#!/bin/bash -l
#SBATCH --job-name testjob
#SBATCH --output output_%A_%a.txt
#SBATCH --error error_%A_%a.txt
#SBATCH --nodes=1
#SBATCH --time=10:00
#SBATCH --mem-per-cpu=50000

FOLDER=/home/user/slurm_array_jobs/
mkdir -p $FOLDER
cd ${FOLDER}

echo $SLURM_ARRAY_TASK_ID > ${SLURM_ARRAY_TASK_ID}

Скрипт генерирует следующие файлы:

  • output_ *.txt,
  • error_ *.txt,
  • файлы с именами в соответствии с ${SLURM_ARRAY_TASK_ID}

Я запускаю скрипт bash на моем узле вычислительного кластера A следующим образом

sbatch --array=1-500 example_job.sh

500 заданий распределены между узлами AD. Также выходные файлы хранятся на узлах AD, где выполнялось соответствующее задание массива. В этом случае, например, приблизительно 125 файлов "output_" отдельно хранятся в A, B, C и D.

Есть ли способ сохранить все выходные файлы на узле, куда я отправляю скрипт, в данном случае на узле A? То есть мне нравится хранить все 500 файлов "output_" на узле A.

2 ответа

Решение

Slurm не обрабатывает передачу файлов ввода / вывода и предполагает, что текущий рабочий каталог является сетевой файловой системой, такой как, например, NFS для простейшего случая. Но GlusterFS, BeeGFS или Luster - другие популярные варианты Slurm.

Используйте сценарий эпилога, чтобы скопировать выходные данные туда, куда был отправлен сценарий, а затем удалите их.

Добавьте в slurm.conf:

      Epilog=/etc/slurm-llnl/slurm.epilog

Скрипт slurm.epilog выполняет копирование (сделайте его исполняемым с помощью chmod +x):

      #!/bin/bash

userId=`scontrol show job ${SLURM_JOB_ID} | grep -i UserId | cut -f2 -d '=' | grep -i -o ^[^\(]*`
stdOut=`scontrol show job ${SLURM_JOB_ID} | grep -i StdOut | cut -f2 -d '='`
stdErr=`scontrol show job ${SLURM_JOB_ID} | grep -i StdErr | cut -f2 -d '='`
host=`scontrol show job ${SLURM_JOB_ID} | grep -i AllocNode | cut -f3 -d '=' | cut -f1 -d ':'`
hostDir=`scontrol show job ${SLURM_JOB_ID} | grep -i Command | cut -f2 -d '=' | xargs dirname`
hostPath=$host:$hostDir/

runuser -l $userId -c "scp $stdOut $stdErr $hostPath"
rm -rf $stdOut
rm -rf $stdErr

(Переключение с PBS на Slurm без NFS или аналогичных общих каталогов — это боль.)

Другие вопросы по тегам