Создайте каталог для файла журнала перед вызовом slurm sbatch - PullRequest
0 голосов
/ 25 января 2019

Slurm sbatch направляет stdout и stderr к файлам, указанным флагами -o и -e, но не может этого сделать, если путь к файлу содержит каталоги, которые не существуют. Есть ли какой-нибудь способ автоматического создания каталогов для моих файлов журнала?

  • Создание этих каталогов вручную каждый раз неэффективно, потому что я запускаю каждую отправку sbatch десятки раз.
  • Разрешение разброса имен заданий в именах файлов, а не в каталогах, создает огромный, плохо организованный беспорядок в журналах, которые мне приходится разбирать, когда мне нужно проверить, как мои задания выполнялись.

Единственный способ, который я нашел, - это обернуть мои вызовы sbatch внутри bash-скриптов, которые во много раз длиннее, чем кажется необходимым для такой маленькой вещи. Ниже приведен сокращенный пример.

#!/bin/bash
# Set up and run job array for my_script.py, which takes as positional
# arguments a config file (passed via $1) and an array index.

#SBATCH --array=1-100
#SBATCH -n 1
#SBATCH -t 12:00:00
#SBATCH -p short
#SBATCH -J sim_sumstats
#SBATCH --mem=1600

# Initialize variables used for script control flow
sub_or_main='sub'

# Parse options
while getopts ":A" opt; do
    case $opt in
        A)
            sub_or_main='main'
            ;;
        \?)
            # Capture invalid options
            echo "Invalid option: -$OPTARG" >&2
            exit 1
            ;;
    esac
done

shift $((OPTIND - 1))

# Either run the submit script or the main array
if [ $sub_or_main == 'sub' ]; then
    # Submit script creates folders for log files, then calls sbatch on this
    # script in main mode.
    now=$(date +"%y%m%d-%H%M")
    name=$(basename $1 .json)
    logpath="log/my_script_name/$name/$now"
    mkdir -p $logpath
    sbatch \
        -o $logpath/%a.out \
        -e $logpath/%a.out \
        $0 -A $1
else
    # Main loop. Just calls my_script.py with the array ID.
    python ./my_script.py $1 ${SLURM_ARRAY_TASK_ID}
fi

Наличие такого сценария работает, но выглядит ужасно расточительно: я увеличил длину моего сценария отправки в sbatch более чем в два раза только для организации файлов журналов. Кроме того, большая часть добавленного кода будет похожа между сценариями пакетной отправки для других заданий, например вызов my_script2.py и т. д., так что это делает много дублирования кода. Не могу не думать, что должен быть лучший путь.

1 Ответ

0 голосов
/ 02 февраля 2019

Вы можете самостоятельно перенаправить вывод вашего скрипта Python в свой скрипт отправки и либо отказаться от записи журнала Slurm, либо записать в журнал Slurm интересную информацию о задании в целях отслеживания происхождения и воспроизводимости.

Сценарий отправки может выглядеть следующим образом:

#!/bin/bash
# Set up and run job array for my_script.py, which takes as positional
# arguments a config file (passed via $1) and an array index.

#SBATCH --array=1-100
#SBATCH -n 1
#SBATCH -t 12:00:00
#SBATCH -p short
#SBATCH -J sim_sumstats
#SBATCH --mem=1600

now=$(date +"%y%m%d-%H%M")
name=$(basename $1 .json)
logpath="log/my_script_name/$name/$now"
mkdir -p $logpath
logfile="$logpath/${SLURM_ARRAY_TASK_ID}.out"

echo "Writing to ${logfile}"
scontrol show -dd job $SLURM_JOB_ID
printenv

python ./my_script.py $1 ${SLURM_ARRAY_TASK_ID} > ${logfile}

Таким образом, выходные данные из сценария Python будут там, где вы хотите, и родительский каталог будет создан до того, как файл журнала будетсоздал.

Кроме того, у вас будет стандартный выходной файл, созданный Slurm, со схемой именования по умолчанию, содержащий информацию о задании (из scontrol) и из среды (с printenv).

Но если вы хотите, чтобы Slurm не пытался создать выходной файл, установите --output=/dev/null.

...