分配式提交作业:salloc¶
salloc将获取作业的分配后执行命令,当命令结束后释放分配的资源。其基本语法为:
salloc [options] [<command> [command args]]
command可以是任何是用户想要用的程序,典型的为xterm或包含srun命令的shell。如果后面没有跟命令,那么将执行Slurm系统slurm.conf配置文件中通过SallocDefaultCommand设定的命令。如果SallocDefaultCommand没有设定,那么将执行用户的默认shell。
注意:salloc逻辑上包括支持保存和存储终端行设置,并且设计为采用前台方式执行。如果需要后台执行salloc,可以设定标准输入为某个文件,如:salloc -n 16 a.out </dev/null &。
salloc主要选项¶
常见主要选项参见提交作业命令共同说明。
salloc主要输入环境变量¶
SALLOC_ACCOUNT:类似-A, --accountSALLOC_ACCTG_FREQ:类似--acctg-freqSALLOC_BELL:类似--bellSALLOC_CLUSTERS、SLURM_CLUSTERS:类似--clusters。SALLOC_CONSTRAINT:类似-C, --constraint。SALLOC_CORE_SPEC:类似 --core-spec。SALLOC_CPUS_PER_GPU:类似 --cpus-per-gpu。SALLOC_DEBUG:类似-v, --verbose。SALLOC_EXCLUSIVE:类似--exclusive。SALLOC_GEOMETRY:类似-g, --geometry。SALLOC_GPUS:类似 -G, --gpus。SALLOC_GPU_BIND:类似 --gpu-bind。SALLOC_GPU_FREQ:类似 --gpu-freq。SALLOC_GPUS_PER_NODE:类似 --gpus-per-node。SALLOC_GPUS_PER_TASK:类似 --gpus-per-task。SALLOC_GRES:类似 --gres。SALLOC_GRES_FLAGS:类似--gres-flags。SALLOC_HINT、SLURM_HINT:类似--hint。SALLOC_IMMEDIATE:类似-I, --immediate。SALLOC_KILL_CMD:类似-K, --kill-command。SALLOC_MEM_BIND:类似--mem-bind。SALLOC_MEM_PER_CPU:类似 --mem-per-cpu。SALLOC_MEM_PER_GPU:类似 --mem-per-gpuSALLOC_MEM_PER_NODE:类似 --mem。SALLOC_NETWORK:类似--network。SALLOC_NO_BELL:类似--no-bell。SALLOC_OVERCOMMIT:类似-O, --overcommit。SALLOC_PARTITION:类似-p, --partition。SALLOC_PROFILE:类似--profile。SALLOC_QOS:类似--qos。SALLOC_RESERVATION:类似--reservation。SALLOC_SIGNAL:类似--signal。SALLOC_SPREAD_JOB:类似--spread-job。SALLOC_THREAD_SPEC:类似--thread-spec。SALLOC_TIMELIMIT:类似-t, --time。SALLOC_USE_MIN_NODES:类似--use-min-nodes。SALLOC_WAIT_ALL_NODES:类似--wait-all-nodes。SLURM_EXIT_ERROR:错误退出代码。SLURM_EXIT_IMMEDIATE:当--immediate选项时指定的立即退出代码。
salloc主要输出环境变量¶
SLURM_CLUSTER_NAME:集群名。SLURM_CPUS_PER_GPU:每颗GPU分配的CPU数。SLURM_CPUS_PER_TASK:每个任务分配的CPU数。SLURM_DISTRIBUTION:类似-m, --distribution。SLURM_GPUS:需要的GPU颗数,仅提交时有-G, --gpus时。SLURM_GPU_BIND:指定绑定任务到GPU,仅提交时具有--gpu-bind参数时。SLURM_GPU_FREQ:需求的GPU频率,仅提交时具有--gpu-freq参数时。SLURM_GPUS_PER_NODE:需要的每个节点的GPU颗数,仅提交时具有--gpus-per-node参数时。SLURM_GPUS_PER_SOCKET:需要的每个socket的GPU颗数,仅提交时具有--gpus-per-socket参数时。SLURM_GPUS_PER_TASK:需要的每个任务的GPU颗数,仅提交时具有--gpus-per-task参数时。SLURM_JOB_ACCOUNT:账户名。SLURM_JOB_ID(SLURM_JOBID为向后兼容):作业号。SLURM_JOB_CPUS_PER_NODE:分配的每个节点CPU数。SLURM_JOB_NODELIST(SLURM_NODELIST为向后兼容):分配的节点名列表。SLURM_JOB_NUM_NODES(SLURM_NNODES为向后兼容):作业分配的节点数。SLURM_JOB_PARTITION:作业使用的队列名。SLURM_JOB_QOS:作业的QOS。SLURM_JOB_RESERVATION:预留的作业资源。SLURM_MEM_BIND:--mem-bind选项设定。SLURM_MEM_BIND_VERBOSE:如--mem-bind选项包含verbose选项时,则由其设定。SLURM_MEM_BIND_LIST:内存绑定时设定的bit掩码。SLURM_MEM_BIND_PREFER:--mem-bin prefer优先权。SLURM_MEM_BIND_TYPE:由--mem-bind选项设定。SLURM_MEM_PER_CPU:类似--mem。SLURM_MEM_PER_GPU:每颗GPU需要的内存,仅提交时有--mem-per-gpu参数时。SLURM_MEM_PER_NODE:类似--mem。SLURM_SUBMIT_DIR:运行salloc时的目录,或提交时由-D, --chdir参数指定。SLURM_SUBMIT_HOST:运行salloc时的节点名。SLURM_NODE_ALIASES:分配的节点名、通信地址和主机名,格式类似SLURM_NODE_ALIASES=ec0:1.2.3.4:foo,ec1:1.2.3.5:bar。SLURM_NTASKS:类似-n, --ntasks。SLURM_NTASKS_PER_CORE:--ntasks-per-core选项设定的值。SLURM_NTASKS_PER_NODE:--ntasks-per-node选项设定的值。SLURM_NTASKS_PER_SOCKET:--ntasks-per-socket选项设定的值。SLURM_PROFILE:类似--profile。SLURM_TASKS_PER_NODE:每个节点的任务数。值以,分隔,并与SLURM_NODELIST顺序一致。如果连续的节点有相同的任务数,那么数后面跟有“(x#)”,其中“#”是重复次数。如:SLURM_TASKS_PER_NODE =2(x3),1。
例子¶
申请计算节点资源并远程连接¶
salloc -p cpu -N1 -n6 -q normal -t 2:00:00
则可以在集群 cpu 队列中申请 1 个节点的 6 个核,占用 2 h。
将输出:
salloc: Granted job allocation 369188
salloc: Waiting for resource configuration
salloc: Nodes cu026 are ready for job
随后自动启动一个新的终端,通过 squeue 可以看到在 cu026 节点上创建了一个新的作业任务 369188:
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
369188 cpu interact ypliucat R 0:50 1 cu026
因此,用户可以通过 ssh cu026 到该节点上交互式地执行相关命令。
当任务结束后,请在打开的 SSH 连接中输入 exit 退出,并主动取消创建的任务,例如:
scancel 369188
以确保不会产生额外的费用。
获取资源以运行并行应用¶
例如想要申请5个节点,每个节点申请1个核,并通过 srun 并行地运行 myprogram,则:
salloc -p cpu -N5 srun -n5 myprogram