使用 提交作业时sbatch,我的可执行文件的副本是否会被带到计算节点?或者它只是执行来自的文件/home/user/?有时,当我杂乱无章时,我会提交一个作业,然后更改源并重新编译以提交另一个作业。这似乎不是一个好主意,特别是当作业仍在队列中时。同时,似乎应该允许这样做,如果在调用sbatch源代码时制作了副本,则会安全得多。
我运行了一些测试,证实(毫不奇怪)一旦作业运行,重新编译源代码就没有效果。但当工作在队列中时,我不确定。测试起来很困难。
编辑:man sbatch除了说该作业“立即”提交给 Slurm 控制器之外,似乎没有提供太多见解。
文档中作业依赖关系的格式如下:
sbatch --dependency=<type:job_id[:job_id][,type:job_id[:job_id]]> ...
是否可以使用作业名称而不是作业 ID 来建立作业依赖关系?
我有一个R脚本(abc.R):
#!/usr/bin/env Rscript
print("HELLO")
Run Code Online (Sandbox Code Playgroud)
还有一个包含R脚本(example.sh)的批处理脚本:
#!/bin/bash
module load Rstats
module load RstatsPackages
Rscript /home1/R_scripts/abc.R > "result.txt"
Run Code Online (Sandbox Code Playgroud)
还有另一个批处理脚本(multiple.sh),它调用上述脚本:
#!/bin/sh
for((i=1;i<=10;i++))
do
sbatch -p normal -t 4:00:00 -N 1 -n 4 example.sh $i
done
sh multiple.sh
Run Code Online (Sandbox Code Playgroud)
该脚本调用上述脚本十次,因此我的Rscript将运行十次。它运行10次,但仅生成一个result.txt。不过,我想多个结果文件,如result1.txt,result2.txt,result3.txt等等。
我有一组数组作业如下:
sbatch --array=1:100%5 ...
Run Code Online (Sandbox Code Playgroud)
这会将同时运行的任务数量限制为 5。作业现在正在运行,我想将此数字更改为 10(即我希望我运行sbatch --array=1:100%10 ...)。
阵列作业的文档提到您可以scontrol在作业开始后使用更改选项。不幸的是,目前还不清楚该选项的变量名是什么,我不认为这是sbatch命令的文档中列出这里。
任何指针都受到好评。
我有一个包含 100 个元组的列表tuplelist,用作外部函数的输入。外部函数返回一个值,并且该值被附加到一个数组中,如下所示 ( MainFile.py):
from ExternalPythonFile import ExternalFunction
valuelist = []
for a,b in tuplelist:
value = ExternalFunction(a,b)
# more functions here
valuelist.append(value)
print(len(valuelist))
Run Code Online (Sandbox Code Playgroud)
print(len(valuelist))使用上面的 for 循环时的输出是(100,)。
现在,由于元组的顺序以及它们的附加方式在我的情况下并不重要,因此我想并行化 for 循环,因为处理 100 个元组需要大约 10 分钟,并且我希望扩展该数字。我尝试了下面的 joblib 实现(MainFileJoblib.py):
from ExternalPythonFile import ExternalFunction
from joblib import Parallel, delayed, parallel_backend
import multiprocessing
valuelist = []
def TupleFunction(a,b):
value = ExternalFunction(a,b)
# more functions here
valuelist.append(value)
with parallel_backend('multiprocessing'):
Parallel(n_jobs=10)(delayed(TupleFunction)(a,b) for a,b in tuplelist)
print(len(valuelist))
Run Code Online (Sandbox Code Playgroud)
我在 unix …
我想将参数传递到 sbatch 命令行。
#!/bin/bash
#SBATCH -o job-%A_task.out
#SBATCH --job-name=paral_cor
#SBATCH --partition=normal
#SBATCH --time=1-00:00:00
#SBATCH --mem=200G
#SBATCH --cpus-per-task=16
#SBATCH --array=1-10
#Set up whatever package we need to run with
module load gcc/8.1.0 openblas/0.3.3 R
# SET UP DIRECTORIES
OUTPUT="$HOME"/PROJET_M2/data/$(date +"%Y%m%d")_parallel_nodes_test
mkdir -p "$OUTPUT"
export FILENAME="$HOME"/vipailler/PROJET_M2/bin/RHO_COR.R
subset=$((SLURM_ARRAY_TASK_ID))
file="$HOME"/PROJET_M2/raw/truelength2.prok2.uniref2.rares.tsv
#Run the program
echo "Start job :"`date` >> "$OUTPUT"/"$SLURM_ARRAY_TASK_ID".txt
echo "Start job :"`date`
echo PWD $PWD
Rscript $FILENAME --file $file --subset $subset > "$OUTPUT"/"$SLURM_ARRAY_TASK_ID"
wait
echo "Stop job : "`date` >> "$OUTPUT"/"$SLURM_ARRAY_TASK_ID".txt
echo …Run Code Online (Sandbox Code Playgroud) 我一直在尝试寻找有关如何使用以下选项来实现作业依赖项的示例-d, --dependency=<dependency_list>。
在文档中,语法显示为after:job_id[[+time][:jobid[+time]...]]
但我无法找到任何示例,而且说实话,我发现语法的表示令人困惑。
我已经尝试过sbatch --dependency=after:123456[+5] myjob.slurmand sbatch --dependency=after:123456+5 myjob.slurm,但这会产生错误
sbatch: error: Batch job submission failed: Job dependency problem。
如何添加依赖项以Job B使其在Job A启动后 X 分钟启动?
我使用 MPI 并行化了三个嵌套循环。当我运行代码时,弹出一个错误,显示“srun:错误:无法为作业 20258899 创建步骤:请求的处理器数量超过允许的数量”
这是我用来提交作业的脚本。
#!/bin/bash
#SBATCH --partition=workq
#SBATCH --job-name="code"
#SBATCH --nodes=2
#SBATCH --time=1:00:00
#SBATCH --exclusive
#SBATCH --err=std.err
#SBATCH --output=std.out
#---#
module switch PrgEnv-cray PrgEnv-intel
export OMP_NUM_THREADS=1
#---#
echo "The job "${SLURM_JOB_ID}" is running on "${SLURM_JOB_NODELIST}
#---#
srun --ntasks=1000 --cpus-per-task=${OMP_NUM_THREADS} --hint=nomultithread ./example_parallel
Run Code Online (Sandbox Code Playgroud)
我在下面粘贴我的代码。有人可以告诉我我的代码有什么问题吗?是不是我使用的MPI错误?非常感谢。
PROGRAM THREEDIMENSION
USE MPI
IMPLICIT NONE
INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(p=15,r=14)
INTEGER :: i, j, k, le(3)
REAL (KIND=dp), ALLOCATABLE :: kp(:,:,:,:), kpt(:,:), col1(:), col2(:)
REAL (KIND=dp) :: su, co, tot
INTEGER :: world_size, world_rank, …Run Code Online (Sandbox Code Playgroud) 我在远程集群的单个节点上运行并行 Matlab 作业。集群的每个节点有 2 个处理器,每个处理器有 24 个内核,每个节点总共有 48 个内核。该作业包含一些顺序代码,后跟一个parfor循环。我使用slurmbash 脚本运行它。
bash脚本test.sh是:
#!/bin/bash
#
########## Begin Slurm header ##########
#
# Give job a reasonable name
#SBATCH -J test_1
#
# Request number of nodes and CPU cores per node for job
#SBATCH --nodes=1
# Request number of tasks/process per nodes
# (determines number of workers in processed based parpool)
#SBATCH --tasks-per-node=48
# Estimated wallclock time for job
#SBATCH -t 1-00
#
# …Run Code Online (Sandbox Code Playgroud) R我想知道如何使用该函数运行 500 个并行作业Rscript。我目前有一个R文件的标题位于顶部:
args <- commandArgs(TRUE)
B <- as.numeric(args[1])
Num.Cores <- as.numeric(args[2])
Run Code Online (Sandbox Code Playgroud)
在 R 文件之外,我希望传递要运行的 500 个作业中的哪一个,由B. 另外,我想控制每个作业可用的核心/CPU 数量,Num.Cores。
我想知道是否有软件或指南可以实现这一点。我目前有一台 CentOS 7/Linux 服务器,我知道一种方法是安装 Slurm。然而,这很麻烦,我想知道是否有办法用队列执行 500 个作业。谢谢。