我正在尝试使用我将 $SLURM_ARRAY_TASK_ID 传递给 Python 的 argparse 的作业数组提交多个作业,但 $SLURM_ARRAY_TASK_ID 不会打印或生成预期的作业文件。
这是我提交的批处理脚本:
#!/bin/bash
#SBATCH --time=01:59:00
#SBACTH --array=1-2
#SBATCH --job-name=job_array
#SBATCH --output=log/job-%A-%a.out
#SBATCH --error=log/job-%A-%a.err
#SBACTH --array=1
echo 'Running code'
echo "Starting task" $SLURM_ARRAY_TASK_ID
python -u parse_test.py --var $SLURM_ARRAY_TASK_ID
echo 'Code done.'
这个作业的输出是:
Running code
Starting task
Code done.
只有一个错误的文件。
我收到一个 argparse 错误,因为没有为“var”传递任何值。
我期望得到的是:
Running code
Starting task 1
Starting task 2
Code done.
连同两个格式化的 out 和 err 文件 job-###-$SLURM_ARRAY_TASK_ID.out(err) 以及我的 python 代码的输出(错误)。
我已经搜索了作业数组的文档,但我看不出这里有什么问题。非常感谢任何帮助。
你没有正确调用数组变量。在 Bash 中执行
echo $array
只会打印其中的第一个元素。
例子:
$ ARRAY_TASK_ID=("task 1" "task 2")
$ echo $ARRAY_TASK_ID
task 1
$ echo ${ARRAY_TASK_ID[@]}
task 1 task 2
$ for ((i=0;i<${#ARRAY_TASK_ID[@]};i++)); do echo ${ARRAY_TASK_ID[$i]}; done
task 1
task 2
尝试将您的 python 命令更新为以下内容:
python -u parse_test.py --var "${SLURM_ARRAY_TASK_ID[@]}"
虽然我仍然不知道为什么你的
echo "Starting task" $SLURM_ARRAY_TASK_ID
没有打印ID。它表明至少数组中的第一个元素是空的。尝试使用上面的示例检查整个数组。
将
#SBACTH --array=1
更改为#SBATCH --array=1
然后 echo 应该在结果中给你一些价值。