我有一个问题,我需要启动相同的脚本但具有不同的输入参数.
假设我有一个脚本myscript.py -p <par_Val> -i <num_trial>,我需要考虑每个值的N不同par_values(之间x0和x1)和M个试验par_values.
M的每次试验几乎都达到我正在进行的集群的时间限制(我没有权利改变它).所以在实践中我需要NxM独立完成工作.
因为每个批处理作业具有相同的节点/ cpu配置,并且调用相同的python脚本,除了更改输入参数外,原则上,在伪语言中我应该有一个sbatch脚本应该执行以下操作:
#!/bin/bash
#SBATCH --job-name=cv_01
#SBATCH --output=cv_analysis_eis-%j.out
#SBATCH --error=cv_analysis_eis-%j.err
#SBATCH --partition=gpu2
#SBATCH --nodes=1
#SBATCH --cpus-per-task=4
for p1 in 0.05 0.075 0.1 0.25 0.5
do
for i in {0..150..5}
do
python myscript.py -p p1 -v i
done
done
Run Code Online (Sandbox Code Playgroud)
每次调用脚本本身就是一个批处理作业.看看sbatch doc,这个-a --array选项看起来很有希望.但在我的情况下,我需要更改我的每个脚本的输入参数NxM.我怎样才能做到这一点?我不想编写NxM批处理脚本,然后txt按照这篇文章的建议将它们列在一个文件中.这里提出的解决方案似乎也不是理想的,因为这是工作阵列的情况.此外,我想确保所有NxM脚本同时启动,并且调用上面的脚本立即终止,这样它就不会与时间限制冲突,我的整个工作将被系统和保持不完整(然而,由于每个NxM …
#!/bin/bash
#SBATCH -N 1 # nodes requested
#SBATCH -n 1 # tasks requested
#SBATCH -c 4 # cores requested
#SBATCH --mem=10 # memory in Mb
#SBATCH -o outfile # send stdout to outfile
#SBATCH -e errfile # send stderr to errfile
#SBATCH -t 0:01:00 # time requested in hour:minute:second
module load anaconda
python hello.py jobid
Run Code Online (Sandbox Code Playgroud)
假设我有这段代码,我想将 jobid 发送到 python,你如何获取 job id,所以当我这样做时
sbatch script.sh
Submitted batch job 10514
Run Code Online (Sandbox Code Playgroud)
如何获取数字 10514 并将其传递给 python?
我有一项待处理的工作,我想调整它的大小。我试过:
scontrol update job <jobid> NumNodes=128
Run Code Online (Sandbox Code Playgroud)
这是行不通的。
注意:我可以使用 更改walltime scontrol。但是当我尝试更改节点数时,它失败了。看来我可以根据此页面更改节点http://www.nersc.gov/users/computational-systems/cori/running-jobs/monitoring-jobs/。
我想在群集上运行脚本(SBATCH文件)。如何激活我的虚拟环境(路径/到/ env_name / bin /激活)。我是否只需要添加:
module load python/2.7.14
source "/pathto/Python_directory/ENV2.7_new/bin/activate"
Run Code Online (Sandbox Code Playgroud)
在my_script.sh文件中?
我正在使用 slurm 脚本在集群上运行数组以进行 Matlab 计算。每个脚本都使用一个数组来循环 matlab 参数。
1)是否可以创建一个shell脚本来循环另一个变量?
2) 我可以将变量传递给 slurm 脚本吗?
例如,我的 slurm 文件目前看起来像
#!/bin/bash
#SBATCH --array=1-128
...
matlab -nodesktop r "frame=[${SLURM_ARRAY_TASK_ID}]; filename=['Person24']; myfunction(frame, filename);";
Run Code Online (Sandbox Code Playgroud)
我经常需要运行这个数组来处理许多不同的文件。这意味着我将提交作业(sbatch exampleScript.slurm),编辑文件,将“Person24”更新为“Person25”,然后重新提交作业。当我有大量文件需要处理时,这是非常低效的。
我可以制作一个将变量传递给 slurm 脚本的 shell 脚本吗?例如,这样的事情:
Shell 脚本 (myshell.sh)
#!/bin/bash
for ((FNUM=24; FNUM<=30; FNUM+=1));
do
sbatch myscript.slurm >> SOMEHOW PASS ${FNUM} HERE (?)
done
Run Code Online (Sandbox Code Playgroud)
Slurm 脚本 (myscript.slurm)
#!/bin/bash
#SBATCH --array=1-128
...
matlab -nodesktop -nodisplay r "frame=[${SLURM_ARRAY_TASK_ID}]; filename=[${FNUM}]; myfunction(frame, filename);";
Run Code Online (Sandbox Code Playgroud)
我可以使用 sbatch myshell.sh 等高效提交所有作业
谢谢你!
在上一个问题中,我询问如何将作业 B 排队在作业 A 之后启动,这是通过
sbatch --dependency=after:123456:+5 jobB.slurm
其中123456是作业 A 的 id,:+5表示它将在作业 A 后五分钟开始。我现在需要对多个作业执行此操作。工作 B 应该依赖于工作 A,工作 C 依赖于 B,工作 D 依赖于 C。
sbatch jobA.slurm将返回Submitted batch job 123456,并且我需要将作业 id 传递给除第一个作业之外的所有作业的依赖项调用。由于我使用的是繁忙的集群,因此我不能依赖于将作业 ID 加一,因为有人可能会在其间排队作业。
因此,我想编写一个接受作业脚本的脚本(*.slurm)我想作为参数运行,例如
./run_jobs.sh jobA.slurm jobB.slurm jobC.slurm jobD.slurm
然后,对于传递给它的所有作业脚本,该脚本应该运行,
sbatch jobA.slurm # Submitted batch job 123456
sbatch --dependency=after:123456:+5 jobB.slurm # Submitted batch job 123457
sbatch --dependency=after:123457:+5 jobC.slurm # Submitted batch job 123458
sbatch --dependency=after:123458:+5 jobD.slurm # Submitted batch job …Run Code Online (Sandbox Code Playgroud) 我有一个 bash 脚本submit.sh,用于向 Slurm 服务器提交训练作业。其工作原理如下。正在做
bash submit.sh p1 8 config_file
Run Code Online (Sandbox Code Playgroud)
将提交一些对应于config_file分区 8 个 GPU 的任务p1。每个节点p1有 4 个 GPU,因此该命令请求 2 个节点。
内容submit.sh可以概括如下,其中我使用sbatch提交了一个Slurm脚本(train.slurm):
bash submit.sh p1 8 config_file
Run Code Online (Sandbox Code Playgroud)
现在,在 Slurm 脚本中train.slurm,我决定是在一个还是多个节点上启动训练 Python 脚本(这两种情况下启动方式不同):
#!/bin/bash
# submit.sh
PARTITION=$1
NGPUs=$2
CONFIG=$3
NGPUS_PER_NODE=4
NCPUS_PER_TASK=10
sbatch --partition ${PARTITION} \
--job-name=${CONFIG} \
--output=logs/${CONFIG}_%j.log \
--ntasks=${NGPUs} \
--ntasks-per-node=${NGPUS_PER_NODE} \
--cpus-per-task=${NCPUS_PER_TASK} \
--gres=gpu:${NGPUS_PER_NODE} \
--hint=nomultithread \
--time=10:00:00
--export=CONFIG=${CONFIG},NGPUs=${NGPUs},NGPUS_PER_NODE=${NGPUS_PER_NODE} \
train.slurm
Run Code Online (Sandbox Code Playgroud)
现在,如果我在单个节点(例如bash submit.sh …
我正在尝试找到一种方法来查看已完成作业的等待时间,直到它们在使用 SLURM 作为工作负载管理器的集群上启动为止。
我知道“sacct”命令可以打印有关已完成作业的大量信息,但我没有发现任何对我的任务有用的信息。
完美的是:
您有什么有用的提示吗?
我正在尝试向 Slurm 服务器提交大量作业(数百个),并希望避免为我想要运行的每个作业提交新的 shell 脚本。提交的代码是一个 Python 脚本,它在 shell 脚本中采用两个输入变量,这些变量是作业之间唯一发生变化的变量。适用于单个作业的简短 shell 脚本示例如下:
#!/bin/bash
#SBATCH -n 1
#SBATCH -t 01:00:00
srun python retrieve.py --start=0 --end=10
Run Code Online (Sandbox Code Playgroud)
我想要的是使用相同的 python 脚本提交大量作业,并且仅更改作业之间的“开始”和“结束”变量。我读到了一些关于增加所需核心数量('-n')并在每个 srun 命令后编写 & 符号的内容,但到目前为止我还无法让它工作。
如果有人知道快速执行此操作的方法,我将非常感谢您的帮助!
我想使用 sbatch 运行 python 脚本,但是,似乎使用 sbatch 运行 python 脚本的唯一方法是拥有一个 bash 脚本,然后运行 python 脚本。就像有batch_main.sh:
#!/bin/bash
#SBATCH --job-name=python_script
arg=argument
python python_batch_script.sh
Run Code Online (Sandbox Code Playgroud)
然后运行:
sbatch batch_main.sh
Run Code Online (Sandbox Code Playgroud)
问题是我希望有一个单独的参数配置文件(因为它通常不是单个数字或参数)并且还能够使用数组选项。另外,我通常同时运行多个不同的sbatch 作业(使用不同的配置),因此,如果更改配置文件不会使不同的 sbatch 运行相互妨碍(因为如果作业排队,然后配置文件稍后更改,它将运行最新的配置文件,而不是我运行 sbatch 时的配置副本)。为了解决这个问题,我发现当我运行 sbatch 脚本时,SLURM 实际上会将提交脚本复制到其内部数据库(我在询问后发现了这一点:在运行期间更改发送到 slurm 中的 bash 脚本是一个坏主意吗?)。因此,我实际上决定将配置硬编码到 bash 提交脚本中(本质上使提交脚本成为配置文件)。这样我只需编辑提交脚本,然后运行该文件。然而,我想阻止这个,因为这让我用 bash 编写,我想不惜一切代价避免。
理想情况下,我想运行一个直接运行 python 的 sbatch。
由于这可能不可能,我想知道还有哪些其他选项可以解决这个问题。例如,是否可以让 slurm 将不同的文件(如 python 配置文件)复制到其内部数据库,以便当它对作业进行排队时,它运行我确切想要运行的作业?(请注意,运行 sbatch 作业然后更改配置文件不是执行此操作的方法,因为这可能会在更改配置文件时导致问题,slrum 将读取配置的最新副本而不是配置的副本当作业运行时)。或者我还有什么其他选择?我真的坚持编写 bash 还是我可以做其他事情来处理 python 中的配置而不是其他一些奇怪的黑客?
总的来说,我还想知道人们在现实世界中为此做了什么,或者对此有什么好的实践/标准。
我在SLURM群集上运行管道,由于某种原因,许多较小的文件(大小在500到2000字节之间)沿slurm-XXXXXX.out(其中XXXXXX是数字)的行命名。我试图在SLURM网站上找到这些文件的内容,但找不到任何提及。我假设它们是系统在解析管道时使用的某种正在进行中的文件?
如果重要的话,我正在运行的管道正在使用snakemake。我知道我以前曾经见过这些类型的文件,但是没有snakemake,但那时我还没什么大问题。恐怕在工作流程的每一步之后清除这些文件的工作目录都会中断正在进行的步骤,因此我目前不对其进行任何处理。
这些文件是什么?如何抑制它们的输出,或者在对应的作业完成后将其删除?我是否以某种方式弄乱了我的工作流程,所以才创建它们?
我有一组数组作业如下:
sbatch --array=1:100%5 ...
Run Code Online (Sandbox Code Playgroud)
这会将同时运行的任务数量限制为 5。作业现在正在运行,我想将此数字更改为 10(即我希望我运行sbatch --array=1:100%10 ...)。
阵列作业的文档提到您可以scontrol在作业开始后使用更改选项。不幸的是,目前还不清楚该选项的变量名是什么,我不认为这是sbatch命令的文档中列出这里。
任何指针都受到好评。