提交批处理任务在工作站提交批处理任务需要编写 SLURM 脚本,以便明确申请的资源以及所要运行的程序。 查看可用资源在提交任务之前,务必检查一下各个节点的状态,例如资源是否充足,当前有多少正在执 行的任务等。 [liuhy@admin playground]$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST cpu* up 7-00:00:00 1 mix comput2 cpu* up 7-00:00:00 1 alloc comput1 cpu* up 7-00:00:00 2 idle comput[3-4] gpu up 7-00:00:00 1 idle comput6 如上所示,使用 sinfo 可粗略查看所有分区的节点信息,注意 ‘‘STATE’’ 一栏的输出 若为 ‘‘idle’’ 表示该节点处于闲置状态,若为 ‘‘alloc’’ 表示该节点已经没有多余的 资源了,若为 ‘‘mix’’ 表示该节点有人在占用,但是仍然有剩余资源。 小提示 对于 gpu 分区的节点 comput6,如果显示 ‘‘mix’’ 表示部分资源被占用,可能出现 GPU 卡都被占用但是有空闲 CPU 核心的情况。此时我们需要这个节点更详细的信息。可以使用 scontrol show node <节点名> 命令。 [liuhy@admin playground]$ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST cpu* up 7-00:00:00 4 idle comput[1-4] gpu up 7-00:00:00 1 mix comput6 [liuhy@admin playground]$ scontrol show node comput6 NodeName=comput6 Arch=x86_64 CoresPerSocket=14 CPUAlloc=4 CPUErr=0 CPUTot=56 CPULoad=0.00 AvailableFeatures=(null) ActiveFeatures=(null) Gres=gpu:2 NodeAddr=comput6 NodeHostName=comput6 Version=17.11 OS=Linux 2.6.32-696.18.7.el6.x86_64 #1 SMP Thu Jan 4 17:31:22 UTC 2018 RealMemory=128000 AllocMem=8800 FreeMem=105593 Sockets=2 Boards=1 State=MIXED ThreadsPerCore=2 TmpDisk=0 Weight=1 Owner=N/A MCS_label=N/A Partitions=gpu BootTime=2018-01-12T12:55:53 SlurmdStartTime=2018-01-20T16:04:26 CfgTRES=cpu=56,mem=125G,billing=56,gres/gpu=2 AllocTRES=cpu=4,mem=8800M,gres/gpu=2 CapWatts=n/a CurrentWatts=0 LowestJoules=0 ConsumedJoules=0 ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s 如上所示,sinfo 显示 gpu 分区的 comput6 状态是 ‘‘mix’’,但是使用 scontrol 命令查看发现已经占用的资源为 AllocTRES=cpu=4,mem=8800M,gres/gpu=2,即占用 了 4 个 CPU 核心,8800 MB 内存和 2 块 GPU 卡。GPU 卡已经全部占用,这个节点将 无法运行需要 GPU 的任务。但仍然可运行纯 CPU 任务。 此外,管理员还提供了两个有用的命令 snode 和 sjob 用于查看各个节点的状态 与集群所有任务的运行情况。 liuhy@admin ~]$ snode NODE CPU LOAD MEM GPU JOBID =========================================================================== comput1 6/48 6.00 15/128G 0/0 [938 zhanghaix] [937 zhanghaix] comput2 48/48 31.83 124/128G 0/0 [946 tsen] [935 zhanghaix] comput3 30/48 28.85 78/128G 0/0 [936 zhanghaix] comput4 0/48 0.00 0/128G 0/0 comput6 0/56 0.00 0/128G 0/2 [liuhy@admin ~]$ sjob JOBID USER ACCOUNT CPUS GRES NODELIST TIME_LEFT TIME_LIMIT PRIORITY STATE REASON 946 tsen wenzw 16 (null comput2 6:43:39 10:00:00 244 RUNNING None 938 zhanghai dongbin 4 (null comput1 6-15:03:17 7-00:00:00 100 RUNNING None 937 zhanghai dongbin 2 (null comput1 6-14:59:11 7-00:00:00 100 RUNNING None 936 zhanghai dongbin 30 (null comput3 6-14:46:27 7-00:00:00 100 RUNNING None 935 zhanghai dongbin 32 (null comput2 6-01:43:56 7-00:00:00 100 RUNNING None 编写 SLURM 脚本你需要编写一个 SLURM 脚本来完成任务提交的设置。SLURM 脚本可以在本地编写后上传, 也可以直接在工作站服务器上编辑。 一个 SLURM 脚本可设置很多内容,下面的模板列出了常用的选项。 run.slurm
#!/bin/bash #SBATCH -J test # 作业名为 test #SBATCH -o test.out # 屏幕上的输出文件重定向到 test.out #SBATCH -p gpu # 作业提交的分区为 cpu #SBATCH --qos=debug # 作业使用的 QoS 为 debug #SBATCH -N 1 # 作业申请 1 个节点 #SBATCH --ntasks-per-node=1 # 单节点启动的进程数为 1 #SBATCH --cpus-per-task=4 # 单任务使用的 CPU 核心数为 4 #SBATCH -t 1:00:00 # 任务运行的最长时间为 1 小时 #SBATCH --gres=gpu:1 # 单个节点使用 1 块 GPU 卡 #SBATCh -w comput6 # 指定运行作业的节点是 comput6,若不填写系统自动分配节点 # 设置运行环境 module add anaconda/3-5.0.0.1 # 添加 anaconda/3-5.0.0.1 模块 # 输入要执行的命令,例如 ./hello 或 python test.py 等 python test.py # 执行命令 其中,第一行是固定的,表示使用 /bin/bash 来执行脚本。其余的说明如下
以上的所有 #SBATCH 属性均可以不设置,当缺少某属性时,系统将使用默认值。 请在使用时估计自己任务的开销,适量申请计算资源,避免造成资源的浪费。 常见的计算软件/软件库的启动命令以下列出服务器中常见的软件启动命令,可以作为手动编写 SLURM 脚本的参考,也可以 作为交互式计算的使用参考。 以命令行模式运行 MATLAB $ matlab -nodesktop -nosplash -nodisplay 使用 MATLAB 运行 m 脚本 $ matlab -nodesktop -nosplash -nodisplay -r "MATLAB 脚本名,不带 m 后缀" 注意:MATLAB 脚本不能像其他语言(如 python,bash)等使用 shebang 来指定解释器, 因此执行一个 M 文件需要使用 MATLAB 内置命令。-r 参数的含义其实并不是“执行 一个脚本”,而是因为在 MATLAB 的命令行中,输入命令可以等效于执行同名的脚本, 因此才使用这种方式。 使用 R 运行 R 脚本 $ Rscript <脚本名> 使用 python 运行 py 脚本 $ python <脚本名> 提交任务将 SLURM 脚本编写完毕并上传工作站后(或直接在工作站编辑),进入 SLURM 脚本的 目录,使用 $ sbatch <SLURM 脚本文件名> 即可提交任务。 注意,如果参数设置不当 sbatch 命令会提交失败,此时需要检查你的参数并修改成正 确的版本。用户需要使用 squeue 检查作业运行情况,若作业是因为参数不当而没有 运行,则需要修改 SLURM 脚本。 例如,执行 sbatch 后发现如下内容: [liuhy@admin playground]$ sbatch run.slurm sbatch: error: Batch job submission failed: Requested node configuration is not available 说明指定的分区内没有所需的资源,检查 SLURM 脚本: run.slurm
#!/bin/bash #SBATCH -J test #SBATCH -p cpu #SBATCH --cpus-per-task=4 #SBATCH --gres=gpu:2 #SBATCH -N 1 #SBATCH -t 5:00 nvidia-smi echo $CUDA_VISIBLE_DEVICES hostname sleep 60 发现分区写成了 cpu,并同时申请了 GPU 卡。但 CPU 分区是没有 GPU 卡的,因此提交 失败。若提交违反了当前 QoS 的最大限定,任务也会被拒绝。如果违反了目标分区的 最大限定,任务虽然会成功提交但永远不会运行。 有时 sbatch 命令会显示正常提交,但是任务始终无法运行,此时需要使用 squeue 查看任务排队的详细情况。 [liuhy@admin playground]$ sbatch run.slurm Submitted batch job 55 [liuhy@admin playground]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 55 cpu test liuhy PD 0:00 1 (PartitionTimeLimit) 此时 55 号作业的状态为 PD(Pending),即“被挂起”,最后一列显示了原因是 PartitionTimeLimit,即申请的运行时间已经超过了该分区允许运行的最大时间,任务 永远不会运行。此时需要先使用 scancel 命令(详见下面的说明)取消任务,然后 修改 SLURM 脚本使得参数正确。 快速提交 MATLAB 任务除了手动编写 SLURM 脚本之外,我们可以使用管理员编写的脚本一键提交 MATLAB 任务。 为此你只需要准备好所有的程序文件,然后运行一次命令即可,非常方便。 $ matslm.rb [-c <使用 CPU 数>][-t <脚本运行时间>][-o <输出文件名>][-p <分区名>][-q <QoS 名>] MATLAB 脚本 此命令的详细用法如下:
一个例子(申请 12 个 CPU 核心和 2 小时的运行时间,脚本名为 test.m): $ matslm.rb -c 12 -t 2:00:00 test.m 程序执行完毕后,产生的标准输出在名为 SLURM_MATLAB_<提交任务时间>_<脚本名(不带.m后缀)> 的文件夹中。 注意:m 脚本文件必须在当前目录中。 查看任务状态作业提交完毕后,可使用 squeue 命令查看任务状态。 [liuhy@admin playground]$ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 55 cpu test liuhy PD 0:00 1 (PartitionTimeLimit) 54 cpu test liuhy R 0:15 1 comput1 如上所示,可显示目前任务号,所在分区,任务状态,已经运行时间,以及运行的节点。 如果任务处于挂起(PD)状态,则显示任务被挂起的原因。用户可以根据这个原因来判断 自己的作业脚本是否写对了。 除此之外,使用 squeue 配合不同参数可以过滤显示的内容,以便能看到你感兴趣的 结果。某些参数可以相互组合。
删除任务
注意:用户只能删除自己的作业,不能删除别人的作业。 |