我正在尝试将GNU并行与SLURM一起使用来运行具有不同输入参数的同一脚本的多个实例。为此,我通过 SLURM 分配 3 个节点,然后通过 GNU Parallel 创建多个线程,这些线程运行 Python 脚本,每个线程仅使用一个 CPU 核心。
此外,脚本非常占用内存,因此如果由于 RAM 不足而失败,我需要能够重新启动作业。为此,我求助于使用
--retry-failed
和 --retries
标志。
我的问题是,除了最后一个节点上的作业之外的所有作业都会以以下输出完成:
/bin/bash: 0: command not found
/bin/bash: 1: command not found
/bin/bash: 2: command not found
/bin/bash: 3: command not found
/bin/bash: 4: command not found
/bin/bash: 5: command not found
/bin/bash: 6: command not found
显然,我的输入在某种程度上被误解了,但我不知道如何解释,因为我不是 GNU Parallel 的经验丰富的用户。
我的工作脚本如下所示:
#!/usr/bin/env bash
#SBATCH --job-name job-name
#SBATCH --cpus-per-task=1
#SBATCH --array=0-2
[ -z "$PARALLEL_SEQ" ] && { exec parallel --retry-failed --retries 5 --joblog joblog.txt -a numtasks $0 ; }
TASKS_PER_NODE=`cat numtasks | wc -l`
IDX=$(( ${TASKS_PER_NODE} * ${SLURM_ARRAY_TASK_ID} + ${PARALLEL_SEQ} - 1 ))
mkdir "res-${IDX}"
cd "res-${IDX}"
source ${HOME}/.bashrc
conda activate myenv
cp ../myscript.py .
python3 ./myscript.py ${IDX}
我认为你应该编辑你的作业脚本以正确地将
${IDX}
的值作为参数传递给你的 Python 脚本!
类似这样的:
#!/usr/bin/env bash
#SBATCH --job-name job-name
#SBATCH --cpus-per-task=1
#SBATCH --array=0-2
[ -z "$PARALLEL_SEQ" ] && { exec parallel --retry-failed --retries 5 --joblog joblog.txt -a numtasks $0 ; }
TASKS_PER_NODE=$(cat numtasks | wc -l)
IDX=$(( ${TASKS_PER_NODE} * ${SLURM_ARRAY_TASK_ID} + ${PARALLEL_SEQ} - 1 ))
mkdir "res-${IDX}"
cd "res-${IDX}"
source ${HOME}/.bashrc
conda activate myenv
cp ../myscript.py .
python3 ./myscript.py "${IDX}"