如何让我的 Slurm 脚本在文件名列表上循环?

问题描述 投票:0回答:1

我有一个 slurm 脚本来运行我的 python 代码:

#!/bin/bash -l                                                                                                    
#SBATCH --nodes=1                                                                                                 
#SBATCH --ntasks=1                                                                                                
#SBATCH --cpus-per-task=1                                                                                         
#SBATCH --mem=10G                                                                                                 
#SBATCH --account=my_account                                                                                 
#SBATCH --qos=default                                                                                           
#SBATCH --time=2-00:00:00                                                                                         
###Array setup here                                                                                               
#SBATCH --array=1                                                                                                 
#SBATCH --open-mode=truncate                                                                                      
#SBATCH --output=out_files/output.o                                                                              

module purge
module load my_cluster
module load Miniconda3/4.9.2

eval "$(${EBROOTMINICONDA3}/bin/conda shell.bash hook)"

conda activate my_conda_env

cd /my_directory

python my_python_code.py -filename file_a.txt

这可行,但目前,它只启动 1 个作业并使用

file_a.txt
作为参数。

如何同时启动 10 个作业?我知道我可以使用:

#SBATCH --array=1-10  

但我想使用

file_a.txt
作为工作 1 的参数,
file_b.txt
作为工作 2 的参数等..

如果可能,我想将文件名列表作为单独的文本文件提供,由 slurm 脚本读取。

python shell slurm
1个回答
2
投票

根据 docs

SLURM_ARRAY_TASK_ID
环境变量将设置为(1 索引)任务 ID。我们可以将此环境变量与
sed
一起使用来从文件列表中获取第 N 行

my_files.txt

file_a.txt
file_b.txt
file_c.txt

归功于这个答案

sed -n "xp"
命令。

my_slurm_job.sh

#!/bin/bash -l                                                                                                    
#SBATCH --nodes=1                                                                                                 
#SBATCH --ntasks=1                                                                                                
#SBATCH --cpus-per-task=1                                                                                         
#SBATCH --mem=10G                                                                                                 
#SBATCH --account=my_account                                                                                 
#SBATCH --qos=default                                                                                           
#SBATCH --time=2-00:00:00                                                                                         
###Array setup here                                                                                               
#SBATCH --array=1                                                                                                 
#SBATCH --open-mode=truncate                                                                                      
#SBATCH --output=out_files/%a_output.o                                                                              

module purge
module load my_cluster
module load Miniconda3/4.9.2

eval "$(${EBROOTMINICONDA3}/bin/conda shell.bash hook)"

conda activate my_conda_env

cd /my_directory

# Get the Nth line from my_files.txt
file_name=sed -n "${SLURM_ARRAY_TASK_ID}p" < my_files.txt

python my_python_code.py -filename ${file_name}

已编辑,根据 FlyingTeller 的评论和 Slurm docs 将任务 ID 添加到输出文件名。

© www.soinside.com 2019 - 2024. All rights reserved.