提交作业

提交作业

提交作业的命令主要有salloc、sbatch与srun,其多数参数、输入输出变量等都是 一样的。

1. 主要参数

参数 描述
-A,--account=<­­account> 指定此作业的责任资源为账户,即账单(与计算费对应)记哪个名下,只有账户属于多个账单组才有权指定。
­­--accel-­bind= srun特有,控制如何绑定作业到GPU、网络等特定资源, 支持同时多个选项,支持的选项如下:
– g:绑定到离分配的CPU最近的GPU;
– m:绑定到离分配的CPU最近的MIC;
– n:绑定到离分配的CPU最近的网卡;
– v:详细模式,显示如何绑定GPU和网卡等等信息。
­­--acctg-­freq 指定作业记账和剖面信息采样间隔。支持的格式为--­­acctg-­freq==, 其中=指定了任务抽样间隔或剖面抽样间隔。多个=可 以采用,分隔(默认为30秒):
– task=:以秒为单位的任务抽样(需要jobacct_gather插件启用)和任务剖面(需要acct_gather_profile插件启用)间隔。
– energy=:以秒为单位的能源剖面抽样间隔,需要acct_gather_energy插 件启用。
– network=:以秒为单位的InfiniBand网络剖面抽样间隔,需要acct_gather_infiniband 插件启用。
– filesystem=:以秒为单位的文件系统剖面抽样间隔,需要acct_gather_filesystem插件启用。
­-B ­­--extra­-node-info= 选择满足的节点,*表示对应选项不做限制。对应限制可以采用下面对应选项:
– --sockets­per­node=
– --cores­per­socket=
– --­­threads­per­core=
-A,--account=<­­account> 指定此作业的责任资源为账户,即账单(与计算费对应)记哪个名下,只有账户属于多个账单组才有权指定。
­­--accel-­bind= srun特有,控制如何绑定作业到GPU、网络等特定资源, 支持同时多个选项,支持的选项如下:
– g:绑定到离分配的CPU最近的GPU;
– m:绑定到离分配的CPU最近的MIC;
– n:绑定到离分配的CPU最近的网卡;
– v:详细模式,显示如何绑定GPU和网卡等等信息。
­­--acctg-­freq 指定作业记账和剖面信息采样间隔。支持的格式为--­­acctg-­freq==, 其中=指定了任务抽样间隔或剖面抽样间隔。多个=可 以采用,分隔(默认为30秒):
– task=:以秒为单位的任务抽样(需要jobacct_gather插件启用)和任务剖面(需要acct_gather_profile插件启用)间隔。
– energy=:以秒为单位的能源剖面抽样间隔,需要acct_gather_energy插 件启用。
– network=:以秒为单位的InfiniBand网络剖面抽样间隔,需要acct_gather_infiniband 插件启用。
– filesystem=:以秒为单位的文件系统剖面抽样间隔,需要acct_gather_filesystem插件启用。
­-B ­­--extra­-node-info= 选择满足的节点,*表示对应选项不做限制。对应限制可以采用下面对应选项:
– --sockets­per­node=
– --cores­per­socket=
– --­­threads­per­core=
­­--bcast[=] srun特有,复制可执行程序到分配的计算节点的[]目录。如指定了,则复制可执行程序到此;如没指定则复制到当前工作目录下的“slurmbcast.”。如srun ­­--bcast=/tmp/mine ­N3 a.out将从当前目录复制a.out到每个分配的节点的/tmp/min并执行。
--­­begin= 设定开始分配资源运行的时间。时间格式可为HH:MM:SS,或添加AM、PM等,也可采用MMDDYY、MM/DD/YY或YYYY­MM­DD格式指定日期,含有日期及时间的格式为:YYYY­MM­DD[THH:MM[:SS]],也可以采用类似now+时间单位的方式,时间单位可以为seconds(默认)、minutes、hours、days和weeks、today、tomorrow等,例如:
– --­­begin=16:00:16:00开始。
– --begin=now+1hour:1小时后开始。
– --begin=now+60:60秒后开始(默认单位为秒)。
– --begin=2017­02­20T12:34:00:2017­02­20T12:34:00开始。
­­--bell 分配资源时终端响铃,参见­­no­bell。
­­--cpu-bind=[quiet,verbose,]type srun特有,设定CPU绑定模式。
­--comment= 作业说明
­­--contiguous 需分配到连续节点,一般来说连续节点之间网络会快一点,如在同 一个IB交换机内,但有可能导致开始运行时间推迟(需等待足够多的连续节点)。
­­--cores­-per-­socket= 分配的节点需要每颗CPU至少CPU核。
­­--cpus-­per­-gpu= 每颗GPU需个CPU核,与­­--cpus-­per­-task不兼容。
­-c, --­­cpus­-per-­task= 每个进程需颗CPU核,一般运行OpenMP等多线程程序时需,普通MPI程序不需。
­­--deadline= 如果在此deadline(start > (deadline ­- time[-­min])之前没有结束,那么移除此作业。默认没有deadline,有效的时间格式为:
- HH:MM[:SS] [AM/PM]
- MMDD[YY]或MM/DD[/YY]或MM.DD[.YY]
- MM/DD[/YY]­HH:MM[:SS]
- YYYY­MM­DD[THH:MM[:SS]]]
­-d,--dependency= 满足依赖条件后开始分配。 可以为 。依赖条件如果用,分隔,则各依赖条件都需要满足;如果采用?分隔,那么只要任意条件满足即可。可以为:
- after:job_id[:jobid...]:当指定作业号的作业结束后开始运行。
- afterany:job_id[:jobid...]:当指定作业号的任意作业结束后开始运行。
- aftercorr:job_id[:jobid...]:当相应任务号任务结束后,此作业组中的开始运行。
- afternotok:job_id[:jobid...]:当指定作业号的作业结束时具有异常状态(非零退出码、节点失效、超时等)时。
- afterok:job_id[:jobid...]:当指定的作业正常结束(退出码为0)时开始运行。
- expand:job_id:分配给此作业的资源将扩展给指定作业。
- singleton:等任意通账户的相同作业名的前置作业结束时。
-D, ­­--chdir= 在切换到工作目录后执行命令。
­-e, ­­--error= 设定标准错误如何重定向。非交互模式下,默认srun重定向标准错误到与标准输出同样的文件(如指定)。此参数可以指定重定向到不同文件。如果指定的文件已经存在,那么将被覆盖。参见IO重定向。salloc无此选项。
­­--epilog= srun特有,作业结束后执行程序做相应处理。
­-E,--preserve­env 将环境变量SLURM_NNODES和SLURM_NTASKS传递给可执行文件,而无需通过计算命令行参数。
­--exclusive[=user/mcs] 排他性运行,独占性运行,此节点不允许其他[user]用户 或mcs选项的作业共享运行作业。
­­--export=<[ALL,]environment variables/ALL/NONE> sbatch与srun特有,将环境变量传递给应用程序。
- ALL:复制所有提交节点的环境变量,为默认选项。
- NONE:所有环境变量都不被传递,可执行程序必须采用绝对路径。一般用于当提交时使用的集群与运行集群不同时。
- [ALL,]environment variables:复制全部环境变量及特定的环境变量及其值, 可以有多个以,分隔的变量。如:“­­--export=EDITOR,ARG1=test”。
­--export­file= sbatch特有,将特定文件中的变量设置传递到计算节点,这允许在定义环境变量时有特殊字符。
­-F,-- ­­nodefile= 类似­­nodelist指定需要运行的节点,但在一个文件中含有节点列表。
­-G, ­­--gpus=[:] 设定使用的GPU类型及数目,如­­gpus=v100:2。
­­--gpus-­per-node=[:] 设定单个节点使用的GPU类型及数目。
­­--gpus-­per-socket=[:] 设定每个socket需要的GPU类型及数目。
­­--gpus-­per-task=[:] 设定每个任务需要的GPU类型及数目。
­­--gres= 设定通用消费资源,可以以,分隔。每个格式为“name[[:type]:count]”。 name是可消费资源;count是资源个数,默认为1;
-H, ­­--hold 设定作业将被提交为挂起状态。挂起的作业可以利用scontrol release 使其排队运行。
­-h, ­­--help 显示帮助信息。
­­--hint= 绑定任务到应用提示:
- compute_bound:选择设定计算边界应用:采用每个socket的所有CPU核,每颗CPU核一个进程。
- memory_bound:选择设定内存边界应用:仅采用每个socket的1颗CPU核,每颗CPU核一个进程。
- no multithread:在in­core multi­threading是否采用额外的线程,对通信密集型应用有益。仅当task/affinity插件启用时。
- help:显示帮助信息。
­-I, ­­--immediate[=] salloc与srun特有,在秒内资源未满足的话立即退出。格式可以为“-­I 60”,但不能之间有空格是“-­I 60”。
­­--ignore-­pbs sbatch特有,忽略批处理脚本中的“#PBS”选项。
­-i, ­­--input= sbatch与srun特有,指定标准输入如何重定向。默认,srun对所有任务重定向标准输入为从终端。参见IO重定向。
­-J, --job­-name= 设定作业名,默认为命令名。
­­--jobid= srun特有,初始作业步到某个已分配的作业号下的作业下,类似设置了SLURM_JOB_ID环境变量。仅对作业步申请有效。
­-K, ­­--kill-­command[=signal] salloc特有,设定需要终止时的signal,默认,如没指定,则对于交互式作业为SIGHUP,对于非交互式作业为SIGTERM。格式类似可以为“­K1”,但不能包含空格为“­-K1”。
­-K, –kill-­on­-bad-­exit[=0/1] srun特有,设定是否任何一个任务退出码为非0时,是否终止作业步。
­-k,-- ­­no-­kill 如果分配的节点失效,那么不会自动终止。
­-L, --­­licenses= 设定使用的
­-l, --­­label srun特有,在标注正常输出或标准错误输出的行前面添加作业号。
­­--mem= 设定每个节点的内存大小,后缀可以为[K/M/G/T],默认为MB。
­­--mem­-per-­cpu= 设定分配的每颗CPU对应最小内存,后缀可以为[K/M/G/T],默认为MB。
­­--mem-­per-­gpu= 设定分配的每颗GPU对应最小内存,后缀可以为[K/ M/G/T],默认为MB。
­­--mincpus= 设定每个节点最小的逻辑CPU核/处理器。
--mpi= srun特有,指定使用的MPI环境,可以主要为:
- list:列出可用的MPI以便选择。
- pmi2:启用PMI2支持。
- pmix:启用PMIx支持。
- none:默认选项,多种其它MPI实现有效。
­­--multi-­prog srun特有,让不同任务运行不同的程序及参数,需指定一个配置文件,参见MULTIPLE PROGRAM CONFIGURATION。
­-N, ­­--nodes= 采用特定节点数运行作业,如没指定maxnodes则需特定节点数,注意,这里是节点数,不是CPU核数,实际分配的是节点数×每节点CPU核数。
--nice[=adjustment] 设定NICE调整值。负值提高优先级,正值降低优先级。调整范围为:+/­ 2147483645。
­-n, ­­--ntasks= 设定所需要的任务总数。默认是每个节点1个任务,注意是节点,不是CPU核。仅对作业起作用,不对作业步起作用。­­--cpus­-per-­task选项可以改变此默认选项。
­­--ntasks-­per-­core= 每颗CPU核运行个任务,需与­n,­--ntasks=配合,并自动绑定个任务到每个CPU核。仅对作业起作用,不对作业步起作用。
­­--ntasks­-per­-node= 每个节点运行个任务,需与­n,--ntasks=配合。仅对作业起作用,不对作业步起作用。
­­--ntasks-­per­-socket= 每颗CPU运行个任务,需与­n,--ntasks=配合,并绑定个任务到每颗CPU。仅对作业起作用,不对作业步起作用。
­­--no-­bell salloc特有,资源分配时不终端响铃。参见­­bell。
­­--no­-shell salloc特有,分配资源后立即退出,而不运行命令。但Slurm作业仍旧被生成,在其激活期间,且保留这些激活的资源。用户会获得一个没有附带进程和任务的作业号,用户可以采用提交srun命令到这些资源。
­-o, ­­--output= sbatch与srun特有,指定标准输出重定向。在非交互模式中, 默认srun收集各任务的标准输出,并发送到吸附的终端上。采用--­­output可以将其重定向到同一个文件、每个任务一个文件或/dev/null等。参见IO重定向。
­­--open-­mode= sbtach与srun特有,对标准输出和标准错误输出采用追加模式还是覆盖模式。
­-O, ­­--overcommit 采用此选项可以使得每颗CPU运行不止一个任务。
­­--open­mode= 标准输出和标准错误输出打开文件的方式:
- append:追加。
- truncate:截断覆盖。
-p, --partition= 使用队列。
­­--prolog= srun特有,作业开始运行前执行程序,做相应处理。
­-Q, --­­quiet 采用安静模式运行,一般信息将不显示,但错误信息仍将被显示。
­­--qos= 需要特定的服务质量(QS)。
­--quit­-on­-interrupt srun特有,当SIGINT (Ctrl­-C)时立即退出。
­-r, -- ­­relative= srun特有,在当前分配的第n节点上运行作业步。该选项可用于分配一些作业步到当前作业占用的节点外的节点,节点号从0开始。-­r选项不能与-­w或-­x同时使用。仅对作业步有效。
­­--reservation= 预留资源分配。
–requeue sbtach特有,当非配的节点失效或被更高级作业抢占资源后,重新运行 该作业。相当于重新运行批处理脚本,小心已运行的结果被覆盖等。
­­--no-­requeue 任何情况下都不重新运行。
-S, ­­--core-­spec= 指定预留的不被作业使用的各节点CPU核数。但也会被记入费用。
--signal=<sig_num>[@] 设定到其终止时间前信号时间秒时的信号。由于Slurm事件处理的时间精度,信号有可能比设定时间早60秒。信号可以为10或USER1,信号时间sig_time必须在0到65535之间,如没指定,则默认为60秒。
­­--sockets-­per-­node= 设定每个节点的CPU颗数。
­-T, ­­--threads= srun特有,限制从srun进程发送到分配节点上的并发线程数。
­-t, ­­--time= 作业最大运行总时间
­­--task­-epilog= srun特有,任务终止后立即执行,对应于作业步分配。
­­--task-­prolog= srun特有,任务开始前立即执行,对应于作业步分配。
­­--test­-only sbatch与srun特有,测试批处理脚本,并预计将被执行的时间,但并不际执行脚本。
­--­thread-­spec= 设定指定预留的不被作业使用的各节点线程数。
­­--threads-­per-­core= 每颗CPU核运行个线程。
­­--time­-min= 设定作业分配的最小时间,设定后作业的运行时间将使得­time设定的时间不少于­­time­min设定的。时间格式为:minutes、minutes:seconds、hours:minutes:seconds、days-­hours、days-­hours:minutes和days­-hours:minutes:seconds。
­­--usage 显示简略帮助信息。
­­--tmp= 设定/tmp目录最小磁盘空间,后缀可以为[K/M/G/T],默认为MB。
­-u, --­­usage 显示简要帮助信息。
­-u, --unbuffered srun特有,该选项使得输出可以不被缓存立即显示出来。默认应用的标准输出被glibc缓存,除非被刷新(flush)或输出被设定为步缓存。
­­--use-­min­-nodes 设定如果给了一个节点数范围,分配时,选择较小的数。
­-V, ­­--version 显示版本信息。
­-v, ­­--verbose 显示详细信息,多个v会显示更详细的详细。
­-W, ­­--wait= 设定在第一个任务结束后多久结束全部任务。
­-w, ­­--nodelist= 在特定节点或filename文件中指定的节点上运行。
­­--wait­-all­-nodes= salloc与sbatch特有,控制当节点准备好时何时运行命令。默认,当分配的资源准备好后salloc命令立即返回。可以为:
- 0:当分配的资源可以分配时立即执行,比如有节点以重启好。
- 1:只有当分配的所有节点都准备好时才执行。
­-X, ­­--disable­status srun特有,禁止在srun收到SIGINT (Ctrl­C)时显示任务状态。
­-x, ­­--exclude= 在特定节点或filename文件中指定的节点之外的节点上运行。

2. 交互式提交并行作业:srun

srun可以交互式提交运行并行作业,提交后,作业等待运行,等运行完毕后,才返 回终端。语法为:

srun \[OPTIONS...\] executable \[args...\]

常见例子

示例一:使用8个CPU核(­n8)运行作业,并在标准输出上显示任务号(­l):

srun -p pocg ­-n8 -­l hostname

输出结果:

0:node0
1:node0
2:node1
3:node1
4:node2
5:node2
6:node3
7:node3

示例二:在脚本中使用-­r2参数使其在第2号(分配的节点号从0开始)开始的两个节点上运行,并采用实时分配模式而不是批处理模式运行:

脚本test.sh内容:

 \#!/bin/sh
 echo $SLURM\_NODELIST
 srun -lN2 -r2 hostname
 srun -lN2 hostname

运行:

salloc -p pocg ­-N4 test.sh

输出结果:

 dev\[7-10\]
 0: node9
 1: node10
 0: node7
 1: node8

示例三:在分配的节点上并行运行两个作业步:

脚本test.sh内容:

\#!/bin/bash
srun -lN2 -n4 -r 2 sleep 60 &
srun -lN2 -r 0 sleep 60 &
sleep 1 squeue
squeue -s
wait

运行:

salloc -p pocg -­N4 test.sh

输出结果:

JOBID PARTITION NAME USER ST TIME NODES NODELIST65641 batch test.sh grondo R 0:01 4 dev\[7-10\]
STEPID PARTITION USER TIME NODELIST
65641.0 batch grondo 0:01 dev\[7-8\]
65641.1 batch grondo 0:01 dev\[9-10\]

示例四:运行MPICH作业:

脚本test.sh内容:

\#!/bin/sh
MACHINEFILE="nodes.$SLURM_JOB_ID"
\#生成MPICH所需的包含节点名的machinfile文件
srun -l /bin/hostname \| sort -n \| awk ’{print $2}’ &gt; $MACHINEFILE
\#运行MPICH作业
mpirun -np $SLURM\_NTASKS -machinefile $MACHINEFILE mpi-app
rm $MACHINEFILE

采用2个节点(­-N2)共4个CPU核(-­n4)运行:

salloc ­-p pocg -N2 ­-n4 test.sh

示例五:利用不同节点号(SLURM_NODEID)运行不同作业,节点号从0开始:

脚本test.sh内容:

case $SLURM\_NODEID in 
    0) echo "I am running on " 
        hostname ;; 
    1) hostname 
    echo "is where I am running" ;;
esac

运行:

srun -p pocg ­-N2 test.sh

输出结果:

dev0
is where I am running
I am running on
ev1

示例六: 利用多核选项控制任务执行:

采用2个节点(­N2),每节点4颗CPU每颗CPU 2颗CPU核(­B 4­4:2­2),运行作业:

srun ­-p pocg -N2 ­-B 4­-4:2-­2 a.out

示例七:运行GPU作业:

脚本gpu.script内容:

#!/bin/bash
srun -n1 -p GPU-V100 -{}-gres=gpu:v100:2 prog1 &
wait

-­p GPU­V-100指定采用GPU队列GPU-­V100,--­­gres=gpu:v100:2指明每个节点使用2块NVIDIA V100 GPU卡。

示例八:排它性独占运行作业:

脚本my.script内容:

\#!/bin/bash
srun -{}-exclusive -n4 prog1 &
srun -{}-exclusive -n3 prog2 &
srun -{}-exclusive -n1 prog3 &
srun -{}-exclusive -n1 prog4 &
wait

3. 批处理方式提交作业:sbatch

Slurm支持利用sbatch命令采用批处理方式运行作业,sbatch命令在脚本正确传递给作业调度系统后立即退出,同时获取到一个作业号。作业等所需资源满足后开始运行。

sbatch提交一个批处理作业脚本到Slurm。批处理脚本名可以在命令行上通过传递0给sbatch,如没有指定文件名,则sbatch从标准输入中获取脚本内容。

脚本文件基本格式:

  • 第一行以#!/bin/sh等指定该脚本的解释程序,/bin/sh可以变为/bin/bash、/bin/csh等。

  • 在可执行命令之前的每行“#SBATCH”前缀后跟的参数作为作业调度系统参数。在任何非注释及空白之后的“#SBATCH”将不再作为Slurm参数处理。

默认,标准输出和标准出错都定向到同一个文件slurm­%j.out,“%j”将被作业号代替。

脚本myscript内容:

#!/bin/sh
#SBATCH -{}-time=1
#SBATCH -p pocgt
srun hostname |sort

采用4个节点(­N4)运行:

sbatch ­-p pocg -­N4 myscript

在这里,虽然脚本中利用“#SBATCH ­-p pocgt”指定了使用pocgt队列,但命令行中的-­p pocg优先级更高,因此实际提交到pocg队列。

提交成功后有类似输出:

salloc: Granted job allocation 65537

其中65537为分配的作业号。

程序结束后的作业日志文件slurm­65537.out显示:

node1
node2
node3
node4

常见例子

示例一:串行作业提交

对于串行程序,用户可类似下面两者之一:

1、直接采用sbatch -­n1 -­o job­%j.log -­e job­-%.err yourprog方式运行。

2、编写命名为pocg_job.sh(此脚本名可以按照用户喜好命名)的串行作业脚本,其 内容如下:

#!/bin/sh
#An example for serial job.
#SBATCH -J job\_name\#SBATCH -o job-%j.log
#SBATCH -e job-%j.errecho Running on hosts
echo Time is \`date\`
echo Directory is $PWD
echo This job runs on the following nodes:
echo $SLURM\_JOB\_NODELIST
module load intel/2019.update5
echo This job has allocated 1 cpu core.
./yourprog

必要时需在脚本文件中利用module命令设置所需的环境,如上面的module load intel/2019.update5

作业脚本编写完成后,可以按照下面命令提交作业:

hmli@login01:~/work$ sbatch ­-n1 -­p pocg pocg\_job.sh

示例二:OpenMP共享内存并行作业提交

对于OpenMP共享内存并行程序,可编写命名为omp_job.sh的作业脚本,内容如下:

#!/bin/sh
#An example for serial job.
#SBATCH -J job\_name
#SBATCH -o job-%j.log
#SBATCH -e job-%j.err
#SBATCH -­p pocg -N 1 -n 8
echo Running on hosts
echo Time is \`date\`
echo Directory is $PWD
echo This job runs on the following nodes:
echo $SLURM\_JOB\_NODELIST
module load intel/2016.3.210
echo This job has allocated 1 cpu core.
export OMP\_NUM\_THREADS=8
./yourprog

相对于串行作业脚本,主要增加export OMP_NUM_THREADS=8和#SBATCH -N 1 -n 8,表示使用一个节点内部的八个核,从而保证是在同一个节点内部, 需几个核就设置-­n为几。­-n后跟的不能超过单节点内CPU核数。

作业脚本编写完成后,可以按照下面命令提交作业:

hmli@login01:~/work$ sbatch omp\_job.sh

示例二:MPI并行作业提交

与串行作业类似,对于MPI并行作业,则需编写类似下面脚本mpi_job.sh:

#!/bin/sh
#An example for MPI job.
#SBATCH -J job\_name
#SBATCH -o job-%j.log
#SBATCH -e job-%j.err
#SBATCH -p pocg -N 1 -n 8echo Time is \`date\`
echo Directory is $PWD
echo This job runs on the following nodes:
echo $SLURM\_JOB\_NODELIST
echo This job has allocated $SLURM\_JOB\_CPUS\_PER\_NODE cpu cores.
module load intelmpi/5.1.3.210
#module load mpich/3.2/intel/2016.3.210
#module load openmpi/2.0.0/intel/2016.3.210
MPIRUN=mpirun \#Intel mpi and Open MPI
#MPIRUN=mpiexec \#MPICH
MPIOPT="-env I\_MPI\_FABRICS shm:ofa" \#Intel MPI 2018
#MPIOPT="-env I\_MPI\_FABRICS shm:ofi" \#Intel MPI 2019
#MPIOPT="-{}-mca plm\_rsh\_agent ssh -{}-mca btl self,openib,sm" \#Open MPI
#MPIOPT="-iface ib0" \#MPICH3
#目前新版的MPI可以自己找寻高速网络配置,可以设置MPIOPT为空,如去掉下行的
# MPIOPT=
$MPIRUN $MPIOPT ./yourprog

与串行程序的脚本相比,主要不同之处在于需采用mpirun或mpiexec的命令格式提 交并行可执行程序。采用不同MPI提交时,需要打开上述对应的选项。

与串行作业类似,可使用下面方式提交:

hmli@login01:~/work$ sbatch mpi\_job.sh

示例三:GPU作业提交

运行GPU作业,需要提交时利用­­gres=gpu等指明需要的GPU资源并用­p指明采用的GPU队列。

脚本gpu_job.sh内容:

#!/bin/sh
#An example for gpu job.
#SBATCH -J job\_name
#SBATCH -o job-%j.log
#SBATCH -e job-%j.err
#SBATCH -N 1 -n 8 -p GPU-V100 -{}-gres=gpu:v100:2./your-gpu-prog
wait

上面­p GPU-­V100 指定采用GPU队列GPU­-V100,--­­gres=gpu:v100:2指明每个节点使用2块NVIDIA V100 GPU卡。

示例四:作业获取的节点名及对应CPU核数解析

作业调度系统主要负责分配节点及该节点分配的CPU核数等, 在Slurm作业脚本中利用环境变量可以获取分配到的节点名(SLURM_JOB_NODELIST及对应核数(SLURM_JOB_CPUS_PER_NODE)或对应的任务数(SLURM_TASKS_PER_NODE),然后根据自己程序原始的命令在Slurm脚本中进行修改就成。

SLURM_JOB_NODELIST及SLURM_TASKS_PER_NODE有一定的格式,以下为一个参考解析脚本,可以在自己的Slurm脚本中参考获取自己的节点等信息。

#!/bin/bash
#Auther HM\_Li
#SLURM\_JOB\_NODELIST=cnode\[001-003,005,440-441\]
BASENAME=${SLURM\_JOB\_NODELIST%\[\*}
LIST=${SLURM\_JOB\_NODELIST\#\*\[}
LIST=${LIST%\]}
IDLIST=''
for i in \`echo $LIST \| tr ',' ' '\`
do 
   if \[\[ $i =~ '-' \]\]; then 
       IDLIST=$IDLIST' '\`seq -w \`echo $i\| tr '-' ' '\`\` 
   else
       IDLIST=$IDLIST' '$i 
   fi
done
NODELIST=''
for i in $IDLIST
do
   NODELIST=$NODELIST" $BASENAME"$i
done
echo -e "Node list: \n\t"$NODELIST

#SLURM\_TASKS\_PER\_NODE='40\(x3\),23,20\(x2\)' 
#SLURM\_JOB\_CPUS\_PER\_NODE='40\(x3\),23,20\(x2\)'
CORELIST=''
for i in \`echo $SLURM\_JOB\_CUPS\_PER\_NODE\| tr ',' ' '\`
do
   if \[\[ $i =~ 'x' \]\]; then
       read CORES NODES &lt;&lt;&lt;\`echo $i\| tr '\(x\)' ' '\` 
       for n in \`seq 1 $NODES\` 
       do 
           CORELIST=$CORELIST' '$CORES 
       done 
   else 
       CORELIST=$CORELIST' '$i 
   fi
done
echo -e "\nCPU Core list: \n\t$CORELIST"

echo -e "\nNode list with corresponding CPU Cores: "
CARR=\(${CORELIST}\)
i=0
for n in $NODELIST
do
    echo -e "\t"$n: ${CARR\[$i\]}
    i=$\(\($i+1\)\)
done

上面只是例子,要加在自己的Slurm脚本中,而不是先提交上面这个脚本获取节点名后放到slurm脚本中,其原因在于除非提交时指定节点名,否则每次提交后获取的节点名等是有可能变的。比如针对star­-cmm+软件,原来的方式是:

/STATCMM+PATH/bin/starccm+ ­-rsh ssh ­-batch ­-power -­on cnode400:40,cnode432:40 FireAndSmokeResampled.sim >residual.log

则可以改为下面脚本:

#!/bin/sh
#An example for MPI job.
#SBATCH -J job\_name
#SBATCH -o job-%j.log
#SBATCH -e job-%j.err
echo This job runs on the following nodes:
echo $SLURM\_JOB\_NODELIST
echo This job has allocated $SLURM\_JOB\_CPUS\_PER\_NODE cpu cores.

BASENAME=${SLURM\_JOB\_NODELIST%\[\*}
LIST=${SLURM\_JOB\_NODELIST\#\*\[}
LIST=${LIST%\]}
IDLIST=''
for i in \`echo $LIST \| tr ',' ' '\`
do 
    if \[\[ $i =~ '-' \]\]; then
        T=\`echo $i\| tr '-' ' '\` 
        IDLIST=$IDLIST' '\`seq -w $T\` 
    else 
        IDLIST=$IDLIST' '$i 
    fi
done
NODEOPT=''
for i in $IDLIST
do 
    NODEOPT=$NODEOPT,$BASENAME$i:40
done
NODEOPT=${NODEOPT:1} \#trim the first ,

/STARCMM+PATH/bin/starccm+ -rsh ssh -batch -power -on $NODEOPT  FireAndSmokeResampled.sim &gt; residual.log

4. 分配式提交作业:salloc

salloc将获取作业的分配后执行命令,当命令结束后释放分配的资源。其基本语法为:

salloc \[options\] \[&lt;command&gt; \[command args\]\]

command可以是任何是用户想要用的程序,典型的为xterm或包含srun命令的shell。 如果后面没有跟命令,那么将执行Slurm系统slurm.conf配置文件中通过SallocDefaultCommand 设定的命令。如果SallocDefaultCommand没有设定,那么将执行用户的默认shell。 注意:salloc逻辑上包括支持保存和存储终端行设置,并且设计为采用前台方式执行。如果需要后台执行salloc,可以设定标准输入为某个文件,如:salloc -­n16 a.out </dev/null &。

常见例子

示例一:获取分配,并打开csh,以便srun可以交互式输入:

salloc ­-p pocg -N16 csh

将输出:

salloc: Granted job allocation 65537
(在此,将等待用户输入,csh退出后结束)
salloc: Relinquishing job allocation 65537

示例二:获取分配并并行运行应用:

salloc -p pocg ­-N5 srun ­-n10 myprogram

示例三:生成三个不同组件的异构作业,每个都是独立节点:

salloc ­-p pocg w node\[2­3\] : ­w node4 : ­w node\[5­7\] bash

将输出:

salloc: job 32294 queued and waiting for resources
salloc: job 32294 has been allocated resources
salloc: Granted job allocation 32294

个结果匹配 ""

    无结果匹配 ""