srun

章节:Slurm 命令 (1)
更新:Slurm 命令
索引

 

名称

srun - 运行并行作业

 

概要

srun [OPTIONS(0)... [可执行文件(0) [参数(0)...]]] [ : [OPTIONS(N)...]] 可执行文件(N) [参数(N)...]

选项定义了在共同调度的异构作业中多个作业。 有关异构作业的更多详细信息,请参见文档
https://slurm.schedmd.com/heterogeneous_jobs.html

 

描述

在由 Slurm 管理的集群上运行并行作业。如果需要,srun 将 首先创建一个资源分配来运行并行作业。

以下文档描述了各种选项对作业和任务的 CPU 分配的影响。
https://slurm.schedmd.com/cpu_management.html

 

返回值

srun 将返回所有运行任务的最高退出代码或任何 以信号退出的任务的最高信号 (在 8 位整数中设置高位 - 例如 128 + 信号)。
值 253 保留用于内存不足错误。

 

可执行文件路径解析

可执行文件按以下顺序解析:

1. 如果可执行文件以“.”开头,则路径构造为: 当前工作目录 / 可执行文件
2. 如果可执行文件以“/”开头,则路径被视为绝对路径。
3. 如果可执行文件可以通过 PATH 解析。请参见 path_resolution(7)。
4. 如果可执行文件在当前工作目录中。

当前工作目录是调用进程的工作目录,除非传递了 --chdir 参数,这将覆盖当前工作目录。

 

选项

-A, --account=<账户>
将此作业使用的资源计费到指定账户。 账户是任意字符串。作业提交后,可以使用 scontrol 命令更改账户名称。此选项适用于作业分配。

--acctg-freq=<数据类型>=<间隔>[,<数据类型>=<间隔>...]
定义作业计费和分析采样间隔(以秒为单位)。 这可以用于覆盖 slurm.conf 文件中的 JobAcctGatherFrequency 参数。<数据类型>=<间隔> 指定 jobacct_gather 插件的任务 采样间隔或通过 acct_gather_profile 插件的分析类型的采样间隔。可以指定多个 以逗号分隔的 <数据类型>=<间隔> 对。支持的 数据类型 值包括:
task
jobacct_gather 插件的采样间隔和通过 acct_gather_profile 插件的任务 分析。
注意:此频率用于监控内存使用情况。如果强制执行内存限制,用户可以请求的最高频率是 slurm.conf 文件中配置的频率。它不能被禁用。

energy
使用 acct_gather_energy 插件进行能量分析的采样间隔。

network
使用 acct_gather_interconnect 插件进行 infiniband 分析的采样间隔。

filesystem
使用 acct_gather_filesystem 插件进行文件系统分析的采样间隔。

任务采样间隔的默认值为 30 秒。 所有其他间隔的默认值为 0。 间隔为 0 将禁用指定类型的采样。 如果任务采样间隔为 0,则仅在作业终止时收集计费 信息(减少 Slurm 对作业的干扰)。
较小(非零)值对作业性能的影响更大, 但对于任务少于 10,000 的应用程序,30 秒的值不太可能被注意到。此选项适用于作业 分配。

--bb=<规格>
突发缓冲区规格。规格的形式取决于系统。 另见 --bbf。此选项适用于作业分配。 当使用 --bb 选项时,Slurm 解析此选项并创建一个 临时突发缓冲区脚本文件,该文件由突发缓冲区 插件内部使用。有关更多信息和示例,请参见 Slurm 的突发缓冲区指南:
https://slurm.schedmd.com/burst_buffer.html

--bbf=<文件名>
包含突发缓冲区规格的文件路径。 规格的形式取决于系统。 另见 --bb。此选项适用于作业分配。 有关更多信息和示例,请参见 Slurm 的突发缓冲区指南:
https://slurm.schedmd.com/burst_buffer.html

--bcast[=<目标路径>]
将可执行文件复制到分配的计算节点。 如果指定了文件名,则将可执行文件复制到指定的目标 文件路径。 如果指定的路径以“/”结尾,则将其视为目标目录,目标文件名将为 slurm_bcast_<job_id>.<step_id>_<nodename>。 如果未指定目标路径,并且 slurm.conf 中的 BcastParameters DestDir 已配置,则使用该路径,文件名遵循 上述模式。如果没有指定任何内容,则使用 --chdir,文件名也遵循上述模式。 例如,“srun --bcast=/tmp/mine -N3 a.out”将把文件“a.out” 从当前目录复制到每个三个 分配的计算节点上的“/tmp/mine”文件,并执行该文件。此选项适用于步骤 分配。

--bcast-exclude={NONE|<exclude_path>[,<exclude_path>...]}
在自动检测和广播可执行共享对象依赖项时,逗号分隔的绝对目录路径列表 通过 --bcast 排除。如果配置了关键字 NONE,则不会排除任何目录路径。默认值为 slurm.conf 中的 BcastExclude,此选项会覆盖它。另见 --bcast--send-libs

-b, --begin=<时间>
推迟此作业的启动,直到指定的时间。 它接受 HH:MM:SS 形式的时间以在特定时间运行作业(秒是可选的)。 (如果该时间已经过去,则假定为第二天。) 您还可以指定 午夜中午十一点(上午 11 点)、咖啡时间(下午 3 点)或 下午茶时间(下午 4 点),并且您可以在早上或晚上运行时为时间加上 AMPM 后缀。 您还可以通过指定日期的形式 MMDDYYMM/DD/YY YYYY-MM-DD 来说明作业将在何时运行。结合日期和时间使用以下 格式 YYYY-MM-DD[THH:MM[:SS]]。您还可以 给出像 now + count time-units 的时间,其中时间单位 可以是 (默认)、分钟小时,并且您可以告诉 Slurm 在今天运行 作业,使用关键字 today,并在明天运行作业,使用关键字 tomorrow。 该值可以在作业提交后使用 scontrol 命令更改。 例如:
   --begin=16:00
   --begin=now+1hour
   --begin=now+60           (默认以秒为单位)
   --begin=2010-01-20T12:34:00

关于日期/时间规格的说明:
 - 尽管 HH:MM:SS 时间规格的 'seconds' 字段 在代码中允许,但请注意,Slurm 调度程序的轮询时间 不够精确,无法保证在确切的秒数上调度作业。作业将在指定时间后的下一个轮询中 开始。确切的轮询间隔取决于 Slurm 调度程序(例如,默认调度/内置为 60 秒)。
 - 如果未指定时间(HH:MM:SS),则默认值为(00:00:00)。
 - 如果指定了日期而没有年份(例如,MM/DD),则假定为当前 年份,除非 MM/DD 和 HH:MM:SS 的组合在该年份已经过去,在这种情况下使用下一年。
此选项适用于作业分配。

-D, --chdir=<路径>
让远程进程在开始执行之前切换到 路径。默认情况下,切换到 srun 进程的当前工作目录。路径可以指定为绝对路径或 相对路径到执行命令的目录。此选项适用于作业分配。

--cluster-constraint=<列表>
指定一个联邦集群必须具备的特性,以便向其提交兄弟作业。 如果集群至少具有指定的一个特性,Slurm 将尝试向该集群提交兄弟作业。

-M, --clusters=<字符串>
要发出命令的集群。多个集群名称可以用逗号分隔。 作业将提交到提供最早预期作业启动时间的集群。默认值为当前集群。值为 'all' 将查询在所有集群上运行。请注意 --export 选项以控制环境变量在 集群之间的导出。 此选项仅适用于作业分配。 请注意,slurmdbd 必须处于运行状态,以便此选项正常工作,除非 在配置了 FederationParameters=fed_display 的联邦中运行。

--comment=<字符串>
任意注释。此选项适用于作业分配。

--compress[=类型]
在将文件发送到计算主机之前进行压缩。 可选参数指定要使用的数据压缩库。 默认值为 BcastParameters Compression=(如果设置)或“lz4”。 支持的值为“lz4”。 某些压缩库可能在某些系统上不可用。 用于 --bcast 选项。此选项适用于步骤 分配。

-C, --constraint=<列表>
节点可以由 Slurm 管理员分配 特性。 用户可以使用约束选项指定其作业所需的这些 特性。 如果您正在寻找“软”约束,请参见 --prefer 以获取更多信息。 只有具有与作业约束匹配的特性的节点才能用于满足请求。 可以使用 AND、OR、匹配 OR、资源计数等指定多个约束(某些运算符在所有系统类型上不受支持)。

注意:可更改特性是由 NodeFeatures 插件定义的特性。

支持的 --constraint 选项包括:

单一名称
仅使用具有指定特性的节点。 例如,--constraint="intel"

节点计数
请求可以通过在特性名称后附加星号和计数来指定所需的节点数。 例如,--nodes=16 --constraint="graphics*4" 表示作业需要 16 个节点,并且至少四个节点必须具有“graphics”特性。 如果请求多个特性并使用节点计数,则请求必须用方括号括起来。

注意:此选项不被 NodeFeatures 插件支持。 可以使用异构作业代替。

AND
仅使用具有所有指定特性的节点。 使用与运算符的符号。 例如,--constraint="intel&gpu"

OR
仅使用具有至少一个指定特性的节点。 使用或运算符的符号。如果未请求可更改特性,则分配中的节点可以具有不同的特性。例如, salloc -N2 --constraint="intel|amd" 可能会导致作业分配 其中一个节点具有 intel 特性,另一个节点具有 amd 特性。 但是,如果表达式包含可更改特性,则所有 OR 运算符 将自动视为匹配 OR,以便作业 分配中的所有节点具有相同的特性集。例如, salloc -N2 --constraint="foo|bar&baz" 作业分配了两个节点,其中两个节点都具有 foo,或者 bar 和 baz(一个 或两个节点可以具有 foo、bar 和 baz)。NodeFeatures 插件将找到第一个与作业 分配中的所有节点匹配的节点特性;这些特性将作为活动特性设置在节点上,并传递给 RebootProgram(见 slurm.conf(5))和辅助脚本(见 helpers.conf(5))。在这种情况下,辅助插件使用第一个 “foo”或“bar,baz”来匹配作业分配中的两个节点。

匹配 OR
如果仅应对所有分配的节点使用一组可能的选项,则使用 OR 运算符并将选项括在方括号内。 例如,--constraint="[rack1|rack2|rack3|rack4]" 可能 用于指定所有节点必须在集群的单个机架上分配,但可以使用这四个机架中的任何一个。

多个计数
可以通过使用 AND 运算符并将选项括在方括号内来指定多个资源的特定计数。 例如,--constraint="[rack1*2&rack2*4]" 可能 用于指定必须从具有“rack1”特性的节点中分配两个节点,并且必须从具有“rack2”特性的节点中分配四个节点。

注意:此构造不支持多个 Intel KNL NUMA 或 MCDRAM 模式。例如,虽然 --constraint="[(knl&quad)*2&(knl&hemi)*4]" 不受支持,但 --constraint="[haswell*2&(knl&hemi)*4]" 是支持的。 指定多个 KNL 模式需要使用异构作业。

注意:此选项不被 NodeFeatures 插件支持。

注意:多个计数可能导致作业以非最佳的 网络布局分配。

方括号
方括号可用于指示您正在寻找具有不同要求的节点集。 例如,--constraint="[(rack1|rack2)*1&(rack3)*2]" 将为您获取一个具有 “rack1”或“rack2”特性的节点和两个具有“rack3”特性的节点。 如果请求多个特性并使用节点计数,则请求 必须用方括号括起来。

注意:方括号仅保留用于 多个计数匹配 OR 语法。 AND 运算符需要在方括号内为每个特性提供计数 (即“[quad*2&hemi*1]”)。Slurm 将仅允许每个作业一组括号约束。

注意:方括号不被 NodeFeatures 插件支持。可以通过使用 竖线字符请求匹配 OR,而不需要方括号,并且至少需要一个可更改的特性。

括号
括号可用于将相似的节点特性分组。例如, --constraint="[(knl&snc4&flat)*4&haswell*1]" 可能用于指定 需要四个具有“knl”、“snc4”和“flat”特性的节点以及一个具有“haswell”特性的节点。 括号也可用于分组操作。没有括号时,节点 特性是严格从左到右解析的。 例如, --constraint="foo&bar|baz" 请求具有 foo 和 bar,或 baz 的节点。 --constraint="foo|bar&baz" 请求具有 foo 和 baz,或 bar 和 baz 的节点(注意 baz 是与所有内容 AND 的)。 --constraint="foo&(bar|baz)" 请求具有 foo 和至少 一个 bar 或 baz 的节点。 注意:在 KNL NodeFeatures 插件中不应使用括号内的 OR,但在辅助 NodeFeatures 插件中是支持的。

警告:当从 salloc 或 sbatch 中执行 srun 时, 约束值只能包含单个特性名称。当前不支持其他运算符用于作业步骤。
此选项适用于作业和步骤分配。

--container=<容器路径>
OCI 容器包的绝对路径。

--container-id=<容器 ID>
OCI 容器的唯一名称。

--contiguous
如果设置,则分配的节点必须形成一个连续的集合。

注意:此选项仅适用于 topology/flat 插件。 其他拓扑插件会修改节点顺序,导致此选项无法生效。此选项适用于作业分配。

-S, --core-spec=<num>
作业为系统操作保留的每个节点的专用核心计数 而不被应用程序使用。 如果启用 AllowSpecResourcesUsage,作业可以使用此选项覆盖 其所有分配节点的 CoreSpecCount。 被覆盖的专用核心仍将保留给系统进程。 作业将获得对节点上其余核心的隐式 --exclusive 分配,导致作业的进程能够使用(并 为)除被覆盖的专用核心外的所有核心。 此选项不能与 --thread-spec 选项一起使用。

注意:显式设置作业的专用核心值隐式设置 --exclusive 选项。

注意:如果未指定 -n,此选项可能会隐式影响任务的数量。

此选项适用于作业分配。

--cores-per-socket=<核心数>
将节点选择限制为每个插槽至少具有指定数量的 核心。有关启用任务/亲和性插件时的更多信息,请参见 -B 选项。 此选项适用于作业 分配。

--cpu-bind=[{quiet|verbose},]<类型>
将任务绑定到 CPU。 仅在启用任务/亲和性插件时使用。 注意:要让 Slurm 始终报告在 shell 中执行的所有命令的选定 CPU 绑定,可以通过将 SLURM_CPU_BIND 环境变量值设置为“verbose”来启用详细模式。

使用 --cpu-bind 时设置以下信息环境变量:

        SLURM_CPU_BIND_VERBOSE
        SLURM_CPU_BIND_TYPE
        SLURM_CPU_BIND_LIST

有关各个 SLURM_CPU_BIND 变量的更详细描述,请参见 环境变量 部分。这些变量仅在配置了任务/亲和性插件时可用。

使用 --cpus-per-task 运行多线程任务时,请注意 CPU 绑定是从进程的父级继承的。这意味着多线程任务应该指定或清除 CPU 绑定 以避免多线程任务的所有线程使用与父级相同的掩码/CPU。或者,可以为任务使用 fat masks(指定多个 允许的 CPU 的掩码),以便为多线程任务提供多个 CPU。

请注意,作业步骤可以在每个节点上分配不同数量的 CPU 或分配不从零位置开始的 CPU。因此,建议使用自动生成任务绑定的选项之一。 显式指定的掩码或绑定仅在作业步骤已分配节点上的所有可用 CPU 时才会被尊重。

将任务绑定到 NUMA 本地性域意味着将任务绑定到属于 NUMA 本地性域或“NUMA 节点”的 CPU 集。 如果在没有 NUMA 支持的系统上使用 NUMA 本地性域选项,则 每个插槽被视为一个本地性域。

如果未使用 --cpu-bind 选项,则默认绑定模式将 取决于 Slurm 的配置和步骤的资源分配。 如果所有分配的节点具有相同配置的 CpuBind 模式,则将使用该模式。 否则,如果作业的分区具有配置的 CpuBind 模式,则将使用该模式。 否则,如果 Slurm 配置了 TaskPluginParam 值,则将使用该模式。 否则,将执行自动绑定,如下所述。

自动绑定
仅在启用任务/亲和性时适用。如果作业步骤分配包括 具有与任务数乘以每个任务 CPU 数相等的插槽、核心或线程的分配, 则任务将默认绑定到适当的资源(自动 绑定)。通过显式设置“--cpu-bind=none”禁用此操作模式。使用 TaskPluginParam=autobind=[threads|cores|sockets] 设置 默认 CPU 绑定,以防“自动绑定”未找到匹配项。

支持的选项包括:
q[uiet]
在任务运行之前静默绑定(默认)

v[erbose]
在任务运行之前详细报告绑定

no[ne]
不将任务绑定到 CPU(默认,除非应用了自动绑定)

map_cpu:<list>
通过在任务(或排名)上设置 CPU 掩码来绑定,如所指定的 <list> 是 <cpu_id_for_task_0>,<cpu_id_for_task_1>,... 如果任务(或排名)的数量超过此列表中的元素数量, 则列表中的元素将根据需要从头开始重用。 为了简化对大量任务计数的支持,列表可以遵循带有星号和重复计数的映射。 例如“map_cpu:0*4,3*4”。

mask_cpu:<list>
通过在任务(或排名)上设置 CPU 掩码来绑定,如所指定的 <list> 是 <cpu_mask_for_task_0>,<cpu_mask_for_task_1>,... 映射是为节点指定的,并且在每个节点上应用相同的映射(即每个节点上的最低任务 ID 映射到列表中指定的第一个掩码,依此类推)。 CPU 掩码 始终 解释为十六进制值,但可以加上可选的 '0x' 前缀。 如果任务(或排名)的数量超过此列表中的元素数量, 则列表中的元素将根据需要从头开始重用。 为了简化对大量任务计数的支持,列表可以遵循带有星号和重复计数的映射。 例如“mask_cpu:0x0f*4,0xf0*4”。

rank_ldom
按排名绑定到 NUMA 本地性域。除非整个 节点分配给作业,否则不支持。

map_ldom:<list>
通过将 NUMA 本地性域 ID 映射到任务来绑定,如所指定的 <list> 是 <ldom1>,<ldom2>,...<ldomN>。 本地性域 ID 被解释为十进制值,除非它们以 '0x' 开头,在这种情况下它们被解释为十六进制值。 除非整个节点分配给作业,否则不支持。

mask_ldom:<list>
通过在任务上设置 NUMA 本地性域掩码来绑定,如所指定的 <list> 是 <mask1>,<mask2>,...<maskN>。 NUMA 本地性域掩码 始终 解释为十六进制值,但可以加上可选的 '0x' 前缀。 除非整个节点分配给作业,否则不支持。

sockets
自动生成将任务绑定到插槽的掩码。 仅使用分配给作业的插槽上的 CPU。 如果任务数量与分配的插槽数量不同, 这可能会导致次优绑定。

cores
自动生成将任务绑定到核心的掩码。 如果任务数量与分配的核心数量不同, 这可能会导致次优绑定。

threads
自动生成将任务绑定到线程的掩码。 如果任务数量与分配的线程数量不同, 这可能会导致次优绑定。

ldoms
自动生成将任务绑定到 NUMA 本地性域的掩码。 如果任务数量与分配的本地性域数量不同, 这可能会导致次优绑定。

help
显示 cpu-bind 的帮助信息

此选项适用于作业和步骤分配。

--cpu-freq=<p1>[-p2][:p3]

请求此 srun 命令启动的作业步骤在选定的 CPU 上以某个请求的频率运行, 如果可能的话,在计算节点上。

p1 可以是 [#### | low | medium | high | highm1],这将设置 频率 scaling_speed 为相应值,并将频率 scaling_governor 设置为 UserSpace。请参见下面的值定义。

p1 可以是 [Conservative | OnDemand | Performance | PowerSave],这将 将 scaling_governor 设置为相应值。该治理者必须在 slurm.conf 选项 CpuFreqGovernors 中的列表中。

p2 存在时,p1 将是最小缩放频率,p2 将是最大缩放频率。在这种情况下,治理者 p3 或 CpuFreqDef 不能是 UserSpace,因为它不支持范围。

p2 可以是 [#### | medium | high | highm1]。p2 必须大于 p1,并且与 UserSpace 治理者不兼容。

p3 可以是 [Conservative | OnDemand | Performance | PowerSave | SchedUtil | UserSpace],这将把治理者设置为相应值。

如果 p3 是 UserSpace,则频率 scaling_speed、scaling_max_freq 和 scaling_min_freq 将静态设置为 p1 定义的值。

任何请求的频率低于可用的最小频率将被四舍五入到可用的最小频率。同样,任何请求的频率 高于可用的最大频率将被四舍五入到可用的最大频率。

slurm.conf 中的 CpuFreqDef 参数将用于在没有 p3 的情况下设置治理者。如果没有 CpuFreqDef,则默认治理者将使用每个 CPU 中设置的系统当前治理者。因此,不允许在没有 CpuFreqDef 或特定治理者的情况下指定范围。

目前可接受的值包括:

####
以千赫兹为单位的频率

最低可用频率

最高可用频率

高减一
(高减一)将选择下一个最高可用频率

尝试设置可用范围中间的频率

保守
尝试使用保守 CPU 治理者

按需
尝试使用按需 CPU 治理者(默认值)

性能
尝试使用性能 CPU 治理者

节能
尝试使用节能 CPU 治理者

用户空间
尝试使用用户空间 CPU 治理者

在请求 --cpu-freq 选项时,作业步骤中设置以下信息环境变量。
        SLURM_CPU_FREQ_REQ

如果在发出“srun”命令时设置了此环境变量,则还可以使用该值来提供 CPU 频率请求的值。 命令行上的 --cpu-freq 将覆盖 环境变量值。环境变量的形式 与命令行相同。 请参见 环境变量 部分以获取 SLURM_CPU_FREQ_REQ 变量的描述。

注意:此参数被视为请求,而不是要求。 如果作业步骤的节点不支持设置 CPU 频率,或者 请求的值超出了合法频率的范围,将记录错误,但允许作业步骤继续。

注意:仅为作业步骤的 CPU 设置频率意味着任务被限制在这些 CPU 上。如果未配置任务 限制(即启用任务/亲和性 TaskPlugin,或启用任务/cgroup TaskPlugin,并在 cgroup.conf 中设置“ConstrainCores=yes”),则忽略此参数。

注意:当步骤完成时,每个选定 CPU 的频率和治理者将重置为先前的值。

注意:使用 --cpu-freq 选项提交作业时 使用 linuxproc 作为 ProctrackType 可能导致作业运行过快,以至于计费无法轮询作业信息。因此,并非所有计费信息都将存在。

此选项适用于作业和步骤分配。

--cpus-per-gpu=<ncpus>
请求为每个分配的GPU分配ncpus个处理器。 此选项意味着--exact。 与--cpus-per-task选项不兼容。

此选项适用于作业和步骤分配。

-c, --cpus-per-task=<ncpus>
请求为每个进程分配ncpus。如果作业是多线程的,并且每个任务需要多个CPU以获得最佳性能,这可能会很有用。明确请求此选项意味着--exact。默认情况下,每个进程分配一个CPU,并不意味着--exact。 如果-c在没有-n的情况下指定,则将尽可能多地在每个节点上分配任务,同时满足-c限制。例如,在每个节点有8个CPU的集群上,4个节点和每个任务3个CPU的作业请求可能会根据其他作业的资源消耗分配每个节点3或6个CPU(每个节点1或2个任务)。这样的作业可能无法执行超过4个任务。

警告:有些配置和选项在作业和作业步骤请求中被不同解释,这可能导致此选项的不一致。例如srun -c2 --threads-per-core=1 prog可能会为作业分配两个核心,但如果每个核心包含两个线程,则作业分配将包括四个CPU。作业步骤分配将为每个CPU启动两个线程,总共两个任务。

警告:当srun在salloc或sbatch中执行时,有些配置和选项可能导致不一致的分配,当-c的值大于salloc或sbatch中的-c时。

注意:如果--mem-per-cpu也被指定,则如果超过MaxMemPerCPU,分配的CPU数量可以增加。如果未指定-n,任务数量可能会高于预期。

此选项适用于作业和步骤分配。

--deadline=<OPT>
如果在此截止日期之前无法结束作业,则删除作业(开始>(截止日期-时间[-分钟]))。 默认情况下没有截止日期。请注意,如果在作业所在的分区上未配置DefaultTimeMaxTime,则作业需要指定某种形式的时间限制(--time[-min]),如果要使用截止日期。

有效的时间格式为:
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]]]
now[+count[seconds(default)|minutes|hours|days|weeks]]

此选项仅适用于作业分配。

--delay-boot=<minutes>
如果作业在此时间段内有资格运行,则不重启节点以满足此作业的特性规范。 如果作业等待的时间少于指定的时间段,它将仅使用已经具有指定特性的节点。 参数以分钟为单位。 系统管理员可以使用slurm.conf文件中的delay_boot选项设置默认值,否则默认值为零(无延迟)。

此选项仅适用于作业分配。

-d, --dependency=<dependency_list>
在指定的依赖关系满足之前,推迟此作业的开始。一旦依赖关系满足,它将从作业中删除。 此选项不适用于作业步骤(在现有的salloc或sbatch分配中执行的srun),仅适用于作业分配。 <dependency_list>的形式为 <type:job_id[:job_id][,type:job_id[:job_id]]>或 <type:job_id[:job_id][?type:job_id[:jobid]]>。 如果使用“,”分隔符,则必须满足所有依赖关系。 如果使用“?”分隔符,则可以满足任何依赖关系。 只能使用一个分隔符。例如:
-d afterok:20:21,afterany:23
这意味着作业只能在作业20和21返回代码为0后运行,并且作业23完成。然而:
-d afterok:20:21?afterany:23
这意味着任何条件(afterok:20或afterok:21或afterany:23)都足以释放作业。 许多作业可以共享相同的依赖关系,这些作业甚至可以属于不同的用户。可以使用scontrol命令在作业提交后更改值。 在联邦中,允许对远程作业的依赖关系。 一旦由于前一个作业的终止状态而导致作业依赖关系失败,则依赖作业将永远不会运行,即使前一个作业被重新排队并在后续执行中具有不同的终止状态。此选项适用于作业分配。
after:job_id[[+time][:jobid[+time]...]]
在指定的作业开始或被取消后,以及从作业开始或取消后的“时间”以分钟为单位,此作业可以开始执行。如果没有给出“时间”,则在开始或取消后没有延迟。

afterany:job_id[:jobid...]
此作业可以在指定的作业终止后开始执行。 这是默认的依赖类型。

afterburstbuffer:job_id[:jobid...]
此作业可以在指定的作业终止后开始执行,并且任何相关的突发缓冲区阶段输出操作已完成。

aftercorr:job_id[:jobid...]
此作业数组的一个任务可以在指定作业中相应的任务ID成功完成后开始执行(以零退出代码完成)。

afternotok:job_id[:jobid...]
此作业可以在指定的作业以某种失败状态(非零退出代码、节点故障、超时等)终止后开始执行。 此作业必须在指定作业仍处于活动状态或在指定作业结束后的MinJobAge秒内提交。

afterok:job_id[:jobid...]
此作业可以在指定的作业成功执行(以零退出代码完成)后开始执行。 此作业必须在指定作业仍处于活动状态或在指定作业结束后的MinJobAge秒内提交。

singleton
此作业可以在任何先前启动的共享相同作业名称和用户的作业终止后开始执行。 换句话说,在任何时刻,只有一个由该名称和该用户拥有的作业可以正在运行或挂起。 在联邦中,必须在所有集群上满足单例依赖关系,除非在slurm.conf中使用DependencyParameters=disable_remote_singleton。

-X, --disable-status
禁用当srun接收到单个SIGINT(Ctrl-C)时的任务状态显示。 而是立即将SIGINT转发给正在运行的作业。 如果没有此选项,则需要在一秒内第二次按Ctrl-C以强制终止作业,srun将立即退出。也可以通过环境变量SLURM_DISABLE_STATUS设置。此选项适用于作业分配。

-m, --distribution={*|block|cyclic|arbitrary|plane=<size>}[:{*|block|cyclic|fcyclic}[:{*|block|cyclic|fcyclic}]][,{Pack|NoPack}]

指定远程进程的替代分配方法。 对于作业分配,这将设置环境变量,这些变量将被后续的srun请求使用。任务分配会影响在可用资源评估的最后阶段的作业分配。 因此,其他选项(例如--ntasks-per-node,--cpus-per-task)可能会在任务分配之前影响资源选择。 为了确保特定的任务分配,作业应访问整个节点,这可以通过使用--exclusive标志或请求节点上的所有资源来实现。

此选项控制将任务分配到已分配资源的节点,以及将这些资源分配给任务以进行绑定(任务亲和性)。第一个分配方法(在第一个“:”之前)控制将任务分配到节点。第二个分配方法(在第一个“:”之后)控制将分配的CPU跨插槽分配以绑定到任务。第三个分配方法(在第二个“:”之后)控制将分配的CPU跨核心分配以绑定到任务。第二和第三个分配仅在启用任务亲和性时适用。第三个分配仅在配置了任务/cgroup插件时支持。每种分配类型的默认值由*指定。

请注意,使用select/cons_tres时,分配给每个插槽和节点的CPU数量可能不同。有关资源分配、任务分配到节点以及任务绑定到CPU的更多信息,请参阅mc_support文档。

第一个分配方法(任务在节点之间的分配):

*
使用默认方法将任务分配到节点(块)。

block
块分配方法将任务分配到节点,使得连续任务共享一个节点。例如,考虑分配三个节点,每个节点有两个CPU。四任务块分配请求将把这些任务分配到节点上,任务一和二在第一个节点,任务三在第二个节点,任务四在第三个节点。如果任务数量超过分配的节点数量,则块分配是默认行为。

cyclic
循环分配方法将任务分配到节点,使得连续任务在连续节点上分配(以轮询方式)。例如,考虑分配三个节点,每个节点有两个CPU。四任务循环分配请求将把这些任务分配到节点上,任务一和四在第一个节点,任务二在第二个节点,任务三在第三个节点。 请注意,当SelectType为select/cons_tres时,可能不会在每个节点上分配相同数量的CPU。任务分配将在所有尚未分配给任务的节点之间进行轮询。如果任务数量不大于分配的节点数量,则循环分配是默认行为。

plane
任务以大小<size>的块分配。必须给出大小或设置SLURM_DIST_PLANESIZE。分配给每个节点的任务数量与循环分配相同,但分配给每个节点的任务ID取决于平面大小。此选项不能与其他分配规范结合使用。 有关更多详细信息(包括示例和图示),请参阅mc_support文档和https://slurm.schedmd.com/dist_plane.html

arbitrary
任意分配方法将按照环境变量SLURM_HOSTFILE指定的文件中的顺序分配进程。如果列出了此变量,它将覆盖任何指定的其他方法。如果未设置,则方法默认为块。 主机文件必须至少包含请求的主机数量,并且每行一个或用逗号分隔。如果指定任务计数(-n, --ntasks=<number>),您的任务将在节点上按文件顺序布局。
注意:作业分配上的任意分配选项仅控制分配给作业的节点,而不控制这些节点上CPU的分配。此选项主要用于控制srun命令在现有作业分配中的作业步骤的任务布局。
注意:如果给出了任务数量并且还给出了请求的节点列表,则如果列表中的节点数量大于任务数量,将减少从该列表中使用的节点数量以匹配任务数量。

第二个分配方法(CPU在插槽之间的分配以进行绑定):

*
使用默认方法在插槽之间分配CPU(循环)。

block
块分配方法将连续分配的CPU从同一插槽分配给任务,然后使用下一个连续插槽。

cyclic
循环分配方法将为给定任务连续分配从同一插槽分配的CPU,并为下一个任务从下一个连续插槽分配,以在插槽之间以轮询方式进行分配。 需要多个CPU的任务将尽可能在单个插槽上分配所有这些CPU。
注意:在启用超线程的节点中,不请求完整核心的任务可能会在插槽之间分配。可以通过指定--ntasks-per-core=1来避免这种情况,这会强制任务分配完整的核心。

fcyclic
fcyclic分配方法将为任务绑定从连续插槽分配的CPU以轮询方式在插槽之间进行分配。 需要多个CPU的任务将以循环方式在插槽之间分配每个CPU。

第三个分配方法(CPU在核心之间的分配以进行绑定):

*
使用默认方法在核心之间分配CPU(继承自第二个分配方法)。

block
块分配方法将连续分配的CPU从同一核心分配给任务,然后使用下一个连续核心。

cyclic
循环分配方法将为给定任务连续分配从同一核心分配的CPU,并为下一个任务从下一个连续核心分配,以在核心之间以轮询方式进行分配。

fcyclic
fcyclic分配方法将为任务绑定从连续核心分配的CPU以轮询方式在核心之间进行分配。

对节点上任务分配的可选控制:

Pack
而不是将作业步骤的任务均匀分配到其分配的节点上,将它们尽可能紧密地打包在节点上。 这仅在使用“块”任务分配方法时适用。

NoPack
而不是将作业步骤的任务尽可能紧密地打包在节点上,均匀分配它们。 此用户选项将优先于SelectTypeParameters CR_Pack_Nodes配置参数。

此选项适用于作业和步骤分配。

--epilog={none|<executable>}
srun将在作业步骤完成后运行executableexecutable的命令行参数将是作业步骤的命令和参数。如果指定none,则不会运行srun epilog。此参数覆盖slurm.conf中的SrunEpilog参数。此参数与slurm.conf中的Epilog参数完全独立。此选项适用于作业分配。

-e, --error=<filename_pattern>
指定如何重定向stderr。默认情况下,在交互模式下, srun 将stderr重定向到与stdout相同的文件(如果指定)。--error选项提供了将stdout和stderr重定向到不同位置的能力。 有关更多选项,请参见IO重定向。 如果指定的文件已存在,将被覆盖。此选项适用于作业和步骤分配。

--exact
允许步骤仅访问为该步骤请求的资源。 默认情况下,步骤分配中每个节点上的所有非GRES资源将被使用。此选项仅适用于步骤分配。
注意:并行步骤将在请求的步骤资源可用之前被阻塞或拒绝,除非指定--overlap。作业资源可以在srun命令完成后保持,而Slurm会进行作业清理。步骤epilog和/或SPANK插件可能会进一步延迟步骤资源的释放。

-x, --exclude={<host1[,<host2>...]|<filename>}
请求不将特定主机列表包含在分配给此作业的资源中。如果包含“/”字符,则将假定主机列表为文件名。此选项适用于作业和步骤分配。

--exclusive[={user|mcs|topo}]
此选项适用于作业和作业步骤分配,并且对每个选项有两个略有不同的含义。

当用于启动作业时,作业分配不能与其他正在运行的作业共享节点(或拓扑段与“=topo”)。如果未指定用户/mcs/topo(即作业分配不能与其他正在运行的作业共享节点),则作业分配在分配中的所有节点上分配所有CPU和GRES,但仅分配请求的内存。这是为了支持帮派调度,因为挂起的作业仍然驻留在内存中。要请求节点上的所有内存,请使用--mem=0。 默认的共享/独占行为取决于系统配置,分区的OverSubscribe选项优先于作业的选项。 注意:由于共享GRES(MPS)不能与共享GRES(GPU)同时分配,因此此选项仅分配所有共享GRES,而不分配任何底层共享GRES。

此选项也可以在现有资源分配中启动多个作业步骤时使用(默认),您希望为每个作业步骤专用处理器。作业步骤仅分配请求的GRES。如果没有足够的处理器可用于启动作业步骤,则将推迟。可以将其视为为作业在其分配内提供资源管理机制(隐含--exact)。 CPU的独占分配默认适用于作业步骤,但--exact不是默认值。换句话说,默认行为是:作业步骤不会共享CPU,但作业步骤将在分配给步骤的所有节点上分配所有可用CPU。

为了共享资源,请使用--overlap选项。

注意:此选项与--oversubscribe互斥。

请参见下面的示例

--export={[ALL,]<environment_variables>|ALL|NONE}
识别从提交环境传播到启动应用程序的环境变量。
--export=ALL
如果未指定--export,则为默认模式。将从调用者的环境加载用户的所有环境。

--export=NONE
用户环境将不被定义。用户必须使用要执行的二进制文件的绝对路径来定义环境。用户不能使用“NONE”指定显式环境变量。

此选项对于在一个集群上提交并在另一个集群上执行的作业(例如具有不同路径的作业)特别重要。 为了避免步骤从sbatch命令继承环境导出设置(例如“NONE”),可以设置--export=ALL或将环境变量SLURM_EXPORT_ENV设置为“All”。

--export=[ALL,]<environment_variables>
导出所有SLURM*环境变量以及显式定义的变量。多个环境变量名称应以逗号分隔。 可以指定环境变量名称以传播当前值(例如“--export=EDITOR”),或可以导出特定值(例如“--export=EDITOR=/bin/emacs”)。如果指定了“ALL”,则将加载所有用户环境变量,并优先于任何显式给定的环境变量。

示例:--export=EDITOR,ARG1=test
在此示例中,传播的环境将仅包含来自用户环境的变量EDITORSLURM_*环境变量和ARG1=test。

示例:--export=ALL,EDITOR=/bin/emacs
此示例有两个可能的结果。如果调用者定义了EDITOR环境变量,则作业的环境将从调用者的环境继承该变量。如果调用者没有为EDITOR定义环境变量,则作业的环境将使用--export给定的值。

--external-launcher
在一个或多个分配的节点上创建一个特殊步骤,该步骤不会消耗任何资源,但可以访问节点上作业的所有分配资源。

选项如--ntasks-per-*、--mem*、--cpus*、--tres*、--gres*将被忽略。

这用于需要自己启动器的MPI实现。 这将启动一个步骤,访问所有资源,并随后生成任何数量的用户进程,这些进程可以访问所有这些资源。

在此特殊步骤内的资源使用仍将被计入,如果启用了计费插件。此特殊步骤可以与任何其他步骤重叠。

注意:此选项不打算直接使用。

--extra=<string>
如果使用空格或某些特殊字符,则用单引号或双引号括起来的任意字符串。

如果启用SchedulerParameters=extra_constraints,则此字符串用于根据每个节点的Extra字段进行节点过滤。

-B, --extra-node-info=<sockets>[:cores[:threads]]
限制节点选择为至少具有指定数量的插槽、每个插槽的核心和/或每个核心的线程的节点。
注意:这些选项不指定资源分配大小。 每个指定的值被视为最小值。 可以使用星号(*)作为占位符,表示要利用该类型的所有可用资源。值也可以指定为最小-最大。各个级别也可以在单独的选项中指定:
    --sockets-per-node=<sockets>
    --cores-per-socket=<cores>
    --threads-per-core=<threads>
如果启用了任务/亲和性插件,则以这种方式指定分配还会在-B选项指定线程计数时设置默认--cpu-bind选项为threads,如果指定了核心计数,则设置为cores,否则设置为sockets。 如果SelectType配置为select/cons_tres,则必须具有CR_Core、CR_Core_Memory、CR_Socket或CR_Socket_Memory参数,以使此选项生效。 如果未指定,scontrol show job将显示'ReqS:C:T=*:*:*'。此选项适用于作业分配。
注意:此选项与--hint--threads-per-core--ntasks-per-core互斥。
注意:如果同时指定了插槽、核心和线程的数量,且指定了节点数量(作为固定数量,而不是范围),并且未指定任务数量,则srun将隐式计算任务数量为每个线程一个任务。

--gpu-bind=[verbose,]<type>
等同于--tres-bind=gres/gpu:[verbose,]<type>。 有关所有选项和文档,请参见--tres-bind

--gpu-freq=[<type]=value>[,<type=value>][,verbose]
请求为分配给作业的GPU配置特定频率值。 此选项可用于独立配置GPU及其内存频率。 作业完成后,所有受影响的GPU的频率将重置为最高可能值。 在某些情况下,系统功率上限可能会覆盖请求的值。 type字段可以是“memory”。 如果未指定type,则隐含GPU频率。 value字段可以是“low”、“medium”、“high”、“highm1”或以兆赫(MHz)为单位的数值。 如果指定的数值不可能,将使用尽可能接近的值。请参见下面的值定义。 verbose选项会记录当前GPU频率信息。 使用示例包括“--gpu-freq=medium,memory=high”和“--gpu-freq=450”。

支持的value定义:

low
最低可用频率。

medium
尝试设置在可用范围中间的频率。

high
最高可用频率。

highm1
(high减去1)将选择下一个最高可用频率。

-G, --gpus=[type:]<number>
指定作业所需的GPU总数。 可以提供可选的GPU类型规范。 另请参见--gpus-per-node--gpus-per-socket--gpus-per-task选项。
注意:分配必须在每个节点上至少包含一个GPU,或者如果使用类型,则每个节点上必须包含每种GPU类型之一。如果不同节点需要不同的GPU类型,请使用异构作业。

--gpus-per-node=[type:]<number>
指定作业在作业资源分配中每个节点所需的GPU数量。 可以提供可选的GPU类型规范。 例如“--gpus-per-node=volta:3”。 可以在逗号分隔的列表中请求多个选项,例如:“--gpus-per-node=volta:3,kepler:1”。 另请参见--gpus--gpus-per-socket--gpus-per-task选项。

--gpus-per-socket=[type:]<number>
指定作业在作业资源分配中每个插槽所需的GPU数量。 可以提供可选的GPU类型规范。 例如“--gpus-per-socket=volta:3”。 可以在逗号分隔的列表中请求多个选项,例如:“--gpus-per-socket=volta:3,kepler:1”。 要求作业指定每个节点的插槽数量(--sockets-per-node)。 另请参见--gpus--gpus-per-node--gpus-per-task选项。 此选项适用于作业分配。

--gpus-per-task=[type:]<number>
指定作业在作业资源分配中每个任务所需的GPU数量。 可以提供可选的GPU类型规范。 例如“--gpus-per-task=volta:1”。可以在逗号分隔的列表中请求多个选项,例如:“--gpus-per-task=volta:3,kepler:1”。另请参见--gpus--gpus-per-socket--gpus-per-node选项。 此选项需要明确的任务计数,例如-n、--ntasks或“--gpus=X --gpus-per-task=Y”,而不是使用-B、--nodes的模糊范围。此选项将隐式设置--tres-bind=gres/gpu:per_task:<gpus_per_task>,或者如果指定了多个GPU类型,则设置--tres-bind=gres/gpu:per_task:<gpus_per_task_type_sum>。但是,可以通过显式的--tres-bind=gres/gpu规范来覆盖。

--gres=<list>
指定每个节点请求的通用可消耗资源的逗号分隔列表。 列表中每个条目的格式为“name[[:type]:count]”。 name是可消耗资源的类型(例如gpu)。 type是资源的可选分类(例如a100)。 count是这些资源的数量,默认值为1。 计数可以有后缀 “k”或“K”(1024的倍数), “m”或“M”(1024 x 1024的倍数), “g”或“G”(1024 x 1024 x 1024的倍数), “t”或“T”(1024 x 1024 x 1024 x 1024的倍数), “p”或“P”(1024 x 1024 x 1024 x 1024 x 1024的倍数)。 指定的资源将在每个节点上分配给作业。 可用的通用可消耗资源由系统管理员配置。 如果选项参数为“help”,则将打印可用的通用可消耗资源列表,并且命令将退出。 使用示例包括“--gres=gpu:2”、“--gres=gpu:kepler:2”和“--gres=help”。 注意:此选项适用于作业和步骤分配。默认情况下,作业步骤分配所有作业请求的通用资源,除了在作业独占时隐式请求的资源。 要更改行为,使每个作业步骤不分配任何通用资源,请显式设置--gres的值以指定每个通用资源的零计数,或者设置“--gres=none”,或者将SLURM_STEP_GRES环境变量设置为“none”。

--gres-flags=<type>
指定通用资源任务绑定选项。

allow-task-sharing
允许任务访问作业分配中与任务位于同一节点上的每个GPU。这在使用--gpu-bind或--tres-bind=gres/gpu将GPU绑定到特定任务时很有用,但也希望在任务之间进行GPU通信。
注意:此选项特定于srun。

multiple-tasks-per-sharing
否定one-task-per-sharing。如果在SelectTypeParameters中默认设置了此选项,则很有用。

disable-binding
否定enforce-binding。如果在SelectTypeParameters中默认设置了此选项,则很有用。

enforce-binding
作业可用的唯一CPU将是绑定到所选GRES的那些(即在gres.conf文件中标识的CPU将被严格执行)。此选项可能导致作业启动延迟。 例如,要求两个GPU和一个CPU的作业将被延迟,直到单个插槽上的两个GPU可用,而不是使用绑定到不同插槽的GPU,但是,由于改善了通信速度,应用程序性能可能会提高。 要求节点配置有多个插槽,并且将按插槽执行资源过滤。
注意:此选项可以在SelectTypeParameters中默认设置。
注意:此选项特定于SelectType=cons_tres的作业分配。
注意:如果尝试在多个插槽上强制绑定多个GRES,则此选项可能会产生未定义的结果。

one-task-per-sharing
不允许不同任务从同一共享GRES中分配共享GRES。
注意:仅当使用--tres-per-task请求共享GRES时,此标志才会被强制执行。
注意:此选项可以在SelectTypeParameters=ONE_TASK_PER_SHARING_GRES中默认设置。
注意:此选项特定于SelectTypeParameters=MULTIPLE_SHARING_GRES_PJ

-h, --help
显示帮助信息并退出。

--het-group=<expr>
识别要为其创建步骤的异构作业分配中的每个组件。仅适用于在salloc分配或sbatch脚本中发出的srun命令。 <expr>是一组整数,对应于salloc或sbatch命令行上的一个或多个选项偏移。 示例:“--het-group=2”、“--het-group=0,4”、“--het-group=1,3-5”。 默认值为--het-group=0。

--hint=<type>
根据应用程序提示绑定任务。
注意:此选项暗示某些相关选项的特定值,这会阻止与任何用户指定的值一起使用--ntasks-per-core--threads-per-core--cpu-bind(除--cpu-bind=verbose外)或-B。 这些冲突选项将在作为命令行参数指定时覆盖--hint。如果冲突选项作为环境变量指定,则命令行参数中的--hint将优先。
compute_bound
选择计算密集型应用程序的设置:在每个插槽中使用所有核心,每个核心一个线程。

memory_bound
选择内存密集型应用程序的设置:在每个插槽中仅使用一个核心,每个核心一个线程。

multithread
使用额外线程进行内核内多线程,这可以使通信密集型应用程序受益。 仅支持任务/亲和性插件。

nomultithread
不使用额外线程进行内核内多线程;限制任务每个核心一个线程。 仅支持任务/亲和性插件。

help
显示此帮助消息

此选项适用于作业分配。

-H, --hold
指定作业以保持状态提交(优先级为零)。 现在可以使用scontrol释放保持的作业,以重置其优先级(例如“scontrol release <job_id>”)。此选项适用于作业分配。

-I, --immediate[=<seconds>]
如果在指定的时间段内未提供资源,则退出。 如果未给出参数(秒默认为1),则请求成功所需的资源必须立即可用。如果在SchedulerParameters中配置了defer且seconds=1,则分配请求将立即失败;defer与此选项冲突并优先于此选项。 默认情况下,--immediate关闭,命令将在资源可用之前阻塞。由于此选项的参数是可选的,因此为了正确解析,单字母选项必须紧跟其值,并且之间不得包含空格。例如“-I60”,而不是“-I 60”。此选项适用于作业和步骤分配。

-i, --input=<mode>
指定如何重定向stdin。默认情况下, srun 将stdin从终端重定向到所有任务。有关更多选项,请参见IO重定向。 对于OS X,poll()函数不支持stdin,因此无法从终端输入。此选项适用于作业和步骤分配。

-J, --job-name=<jobname>
指定作业的名称。指定的名称将在查询系统上运行的作业时与作业 ID 号码一起显示。默认值是提供的 可执行文件 的名称。注意:此信息可能会写入 slurm_jobacct.log 文件。该文件是以空格分隔的,因此如果在 jobname 名称中使用空格,将会导致在使用 sacct 命令时无法正确显示 slurm_jobacct.log 文件的内容。此选项适用于作业和步骤分配。

--jobid=<jobid>
在已分配的作业下以作业 ID id 启动作业步骤。使用此选项将使 srun 的行为与设置 SLURM_JOB_ID 环境变量完全相同。此选项适用于步骤分配。

-K, --kill-on-bad-exit[=0|1]
控制是否在任何任务以非零退出代码退出时终止步骤。如果未指定此选项,默认操作将基于 Slurm 配置参数 KillOnBadExit。如果指定此选项,则优先于 KillOnBadExit。参数为零将不会终止作业。非零参数或没有参数将终止作业。 注意:此选项优先于 -W, --wait 选项,以便在任务以非零退出代码退出时立即终止作业。由于此选项的参数是可选的,因此为了正确解析,单字母选项后面必须紧跟值,并且两者之间不得包含空格。例如 "-K1" 而不是 "-K 1"。

-l, --label
在 stdout/err 的行前添加任务编号。 --label 选项将在输出的行前添加远程任务 ID。此选项适用于步骤分配。

-L, --licenses=<license>[@db][:count][,license[@db][:count]...]
指定必须分配给此作业的许可证(或集群所有节点上可用的其他资源)。 许可证名称可以后跟冒号和计数(默认计数为 1)。 可以请求多个许可证。如果用逗号(',' 表示 AND)分隔,则所有请求的许可证都是作业所需的。例如,"--licenses=foo:4,bar"。如果用管道符号('|' 表示 OR)分隔,则只需一个许可证请求即可满足作业。例如,"--licenses=foo:4bar"。不能同时使用 AND 和 OR。

注意:在提交异构作业时,许可证请求只能在第一个组件作业上进行。 例如 "srun -L ansys:2 : myexecutable"。

注意:如果许可证在 AccountingStorageTres 中被跟踪并且使用了 OR,ReqTRES 将显示所有请求的 tres,以逗号分隔。AllocTRES 将仅显示分配给作业的许可证。

注意:当作业请求 OR 的许可证时,Slurm 将尝试按请求的顺序分配许可证。此指定顺序将优先于即使其余请求的许可证可以在请求的保留上满足的情况。这也适用于配置了 SchedulerParameters=bf_licenses 的回填计划。

--mail-type=<type>
当发生某些事件类型时,通过电子邮件通知用户。 有效的 type 值为 NONE, BEGIN, END, FAIL, REQUEUE, ALL(等同于 BEGIN, END, FAIL, INVALID_DEPEND, REQUEUE 和 STAGE_OUT)、INVALID_DEPEND(依赖关系从未满足)、STAGE_OUT(突发缓冲区阶段完成和拆除完成)、TIME_LIMIT、TIME_LIMIT_90(达到时间限制的 90%)、TIME_LIMIT_80(达到时间限制的 80%)和 TIME_LIMIT_50(达到时间限制的 50%)。 可以在逗号分隔的列表中指定多个 type 值。 NONE 将抑制所有事件通知,忽略任何其他指定的值。 默认情况下,不会发送电子邮件通知。 要通知的用户由 --mail-user 指定。此选项适用于作业分配。

--mail-user=<user>
接收状态更改电子邮件通知的用户,如 --mail-type 所定义。这可以是完整的电子邮件地址或用户名。如果指定用户名,则将从 slurm.conf 中的 MailDomain 值附加以创建电子邮件地址。 默认值是提交用户。此选项适用于作业分配。

--mcs-label=<mcs>
仅在启用兼容的 MCSPlugin 时使用。此参数是用户所属的组(mcs/group)或任意标签字符串(mcs/label)。在这两种情况下,默认情况下不会分配任何标签。此选项适用于作业分配。有关更多详细信息,请参阅 MCS 文档:<https://slurm.schedmd.com/mcs.html>

--mem=<size>[units]
指定每个节点所需的实际内存。 默认单位为兆字节。 可以使用后缀 [K|M|G|T] 指定不同的单位。 默认值为 DefMemPerNode,最大值为 MaxMemPerNode。如果已配置,可以使用 scontrol show config 命令查看这两个参数。 通常在将整个节点分配给作业时使用此参数(SelectType=select/linear)。 为作业步骤指定零的内存限制将限制作业步骤使用分配给作业的内存,但不会移除任何作业的内存分配以供其他作业步骤使用。 另请参见 --mem-per-cpu--mem-per-gpu--mem--mem-per-cpu--mem-per-gpu 选项是互斥的。如果指定了 --mem--mem-per-cpu--mem-per-gpu 作为命令行参数,则它们将优先于环境(可能从 sallocsbatch 继承)。

注意:指定零的内存大小被视为特殊情况,并授予作业访问每个节点上所有内存的权限,以供新提交的作业使用,以及所有可用作业内存供新作业步骤使用。

注意:每个 slurmstepd 进程使用的内存包含在作业的总内存使用中。它通常消耗 20MiB 到 200MiB 之间的内存,尽管这可能会根据系统配置和任何加载的插件而有所不同。

注意:除非 Slurm 配置为使用强制机制,否则内存请求将不会严格执行。有关更多详细信息,请参阅 cgroup.conf(5)手册页中的 ConstrainRAMSpaceslurm.conf(5)手册页中的 OverMemoryKill

此选项适用于作业和步骤分配。

--mem-bind=[{quiet|verbose},]<type>
将任务绑定到内存。仅在启用任务/亲和性插件并且 NUMA 内存功能可用时使用。 请注意,CPU 和内存绑定的分辨率在某些架构上可能有所不同。例如,CPU 绑定可能在处理器内的核心级别执行,而内存绑定将在节点级别执行,其中“节点”的定义可能因系统而异。 默认情况下不执行内存绑定;任何使用任何 CPU 的任务都可以使用任何内存。此选项通常用于确保每个任务绑定到离其分配的 CPU 最近的内存。不建议使用除“none”或“local”以外的任何类型。 如果您希望获得更大的控制权,请尝试运行一个简单的测试代码,使用选项“--cpu-bind=verbose,none --mem-bind=verbose,none”以确定特定配置。

注意:要让 Slurm 始终报告在 shell 中执行的所有命令选择的内存绑定,您可以通过将 SLURM_MEM_BIND 环境变量值设置为“verbose”来启用详细模式。

在使用 --mem-bind 时,将设置以下信息环境变量:

        SLURM_MEM_BIND_LIST
        SLURM_MEM_BIND_PREFER
        SLURM_MEM_BIND_SORT
        SLURM_MEM_BIND_TYPE
        SLURM_MEM_BIND_VERBOSE

有关单个 SLURM_MEM_BIND* 变量的更详细描述,请参见 环境变量 部分。

支持的选项包括:

help
显示此帮助信息

local
使用与正在使用的处理器本地的内存

map_mem:<list>
通过在任务(或排名)上设置内存掩码进行绑定,如所指定的,其中 <list> 是 <numa_id_for_task_0>,<numa_id_for_task_1>,... 映射是为一个节点指定的,并且相同的映射应用于每个节点上的任务(即每个节点上最低的任务 ID 映射到列表中指定的第一个 ID,依此类推)。 NUMA ID 被解释为十进制值,除非它们以 '0x' 开头,在这种情况下它们被解释为十六进制值。 如果任务(或排名)的数量超过此列表中的元素数量,则列表中的元素将根据需要从头开始重复使用。 为了简化对大量任务计数的支持,列表可以跟随带有星号和重复计数的映射。 例如 "map_mem:0x0f*4,0xf0*4"。 为了获得可预测的绑定结果,作业中每个节点的所有 CPU 应该被分配给作业。

mask_mem:<list>
通过在任务(或排名)上设置内存掩码进行绑定,如所指定的,其中 <list> 是 <numa_mask_for_task_0>,<numa_mask_for_task_1>,... 映射是为一个节点指定的,并且相同的映射应用于每个节点上的任务(即每个节点上最低的任务 ID 映射到列表中指定的第一个掩码,依此类推)。 NUMA 掩码 始终 被解释为十六进制值。 请注意,如果掩码不以 [0-9] 开头,则必须在前面加上 '0x',以便将其视为数值。 如果任务(或排名)的数量超过此列表中的元素数量,则列表中的元素将根据需要从头开始重复使用。 为了简化对大量任务计数的支持,列表可以跟随带有星号和重复计数的掩码。 例如 "mask_mem:0*4,1*4"。 为了获得可预测的绑定结果,作业中每个节点的所有 CPU 应该被分配给作业。

no[ne]
不将任务绑定到内存(默认)

nosort
避免对空闲缓存页面进行排序(默认,LaunchParameters 配置参数可以覆盖此默认值)

p[refer]
优先使用第一个指定的 NUMA 节点,但允许
 使用 其他 可用 NUMA 节点。

q[uiet]
在任务运行之前安静地绑定(默认)

rank
按任务排名进行绑定(不推荐)

sort
对空闲缓存页面进行排序(在 Intel KNL 节点上运行 zonesort)

v[erbose]
详细报告任务运行前的绑定

此选项适用于作业和步骤分配。

--mem-per-cpu=<size>[units]
每个可用分配 CPU 所需的最小内存。 默认单位为兆字节。 可以使用后缀 [K|M|G|T] 指定不同的单位。 默认值为 DefMemPerCPU,最大值为 MaxMemPerCPU(见下文的例外)。如果已配置,可以使用 scontrol show config 命令查看这两个参数。 注意,如果作业的 --mem-per-cpu 值超过配置的 MaxMemPerCPU,则用户的限制将被视为每个任务的内存限制;--mem-per-cpu 将被减少到不大于 MaxMemPerCPU 的值;--cpus-per-task 将被设置,并且 --cpus-per-task 的值乘以新的 --mem-per-cpu 值将等于用户指定的原始 --mem-per-cpu 值。 此参数通常在将单个处理器分配给作业时使用(SelectType=select/cons_tres)。 如果按核心、插槽或整个节点分配资源,则分配给作业的 CPU 数可能会高于任务计数,--mem-per-cpu 的值应相应调整。 为作业步骤指定零的内存限制将限制作业步骤使用分配给作业的内存,但不会移除任何作业的内存分配以供其他作业步骤使用。 另请参见 --mem--mem-per-gpu--mem--mem-per-cpu--mem-per-gpu 选项是互斥的。

注意:如果作业请求的最终内存量无法满足分区中配置的任何节点,则该作业将被拒绝。 这可能发生在作业分配中使用 --mem-per-cpu 选项并且 --mem-per-cpu 乘以节点上的 CPU 数大于该节点的总内存时。

注意:这适用于作业分配中的 可用 分配 CPU。 当为每个核心配置多个线程时,这一点很重要。 如果作业请求 --threads-per-core 的线程数少于核心上存在的线程数(或 --hint=nomultithread,这意味着 --threads-per-core=1),则作业将无法使用核心上的额外线程,并且这些线程将不包含在每个 CPU 的内存计算中。但是,如果作业可以访问核心上的所有线程,则即使作业没有明确请求这些线程,这些线程也将包含在每个 CPU 的内存计算中。

在以下示例中,每个核心有两个线程。

在第一个示例中,由于未使用 --threads-per-core,因此可以在同一核心的不同超线程上运行两个任务。第三个任务使用第二个核心的两个线程。每个 CPU 分配的内存包括所有线程:

$ salloc -n3 --mem-per-cpu=100
salloc: Granted job allocation 17199
$ sacct -j $SLURM_JOB_ID -X -o jobid%7,reqtres%35,alloctres%35
  JobID                             ReqTRES                           AllocTRES
------- ----------------------------------- -----------------------------------
  17199     billing=3,cpu=3,mem=300M,node=1     billing=4,cpu=4,mem=400M,node=1

在第二个示例中,由于 --threads-per-core=1,每个任务被分配一个完整的核心,但只能使用每个核心的一个线程。分配的 CPU 包括每个核心上的所有线程。然而,每个 CPU 分配的内存仅包括每个核心中的可用线程。

$ salloc -n3 --mem-per-cpu=100 --threads-per-core=1
salloc: Granted job allocation 17200
$ sacct -j $SLURM_JOB_ID -X -o jobid%7,reqtres%35,alloctres%35
  JobID                             ReqTRES                           AllocTRES
------- ----------------------------------- -----------------------------------
  17200     billing=3,cpu=3,mem=300M,node=1     billing=6,cpu=6,mem=300M,node=1

--mem-per-gpu=<size>[units]
每个分配的 GPU 所需的最小内存。 默认单位为兆字节。 可以使用后缀 [K|M|G|T] 指定不同的单位。 默认值为 DefMemPerGPU,并且在全局和每个分区的基础上都可用。 如果已配置,可以使用 scontrol show configscontrol show partition 命令查看这些参数。 另请参见 --mem--mem--mem-per-cpu--mem-per-gpu 选项是互斥的。

--mincpus=<n>
指定每个节点的最小逻辑 CPU/处理器数量。此选项适用于作业分配。

--mpi=<mpi_type>
识别要使用的 MPI 类型。可能会导致独特的初始化程序。
cray_shasta
启用 Cray PMI 支持。这适用于使用 Cray 编程环境构建的应用程序。可以使用 --resv-ports 选项或在 slurm.conf 中使用 MpiParams=ports=<port range> 参数指定 PMI 控制端口。 此插件不支持异构作业。 默认情况下包含对 cray_shasta 的支持。

list
列出可供选择的可用 mpi 类型。

pmi2
启用 PMI2 支持。Slurm 中的 PMI2 支持仅在 MPI 实现支持它的情况下有效,换句话说,如果 MPI 实现了 PMI2 接口。--mpi=pmi2 将加载库 lib/slurm/mpi_pmi2.so,该库提供服务器端功能,但客户端必须实现 PMI2_Init() 和其他接口调用。

pmix
启用 PMIx 支持(https://pmix.github.io). Slurm 中的 PMIx 支持可用于启动并行应用程序(例如 MPI),如果它支持 PMIx、PMI2 或 PMI1。Slurm 必须通过将 "--with-pmix=<PMIx installation path>" 选项传递给其 "./configure" 脚本来配置 PMIx 支持。

在撰写本文时,PMIx 在 Open MPI 中从版本 2.0 开始得到支持。 PMIx 还支持与 PMI1 和 PMI2 的向后兼容性,如果 MPI 是使用 PMI2/PMI1 支持配置的,并指向 PMIx 库("libpmix")。 如果 MPI 支持 PMI1/PMI2,但不提供指向特定实现的方法,则可以使用一种 hack'ish 解决方案,利用 LD_PRELOAD 强制使用 "libpmix"。

none
没有特殊的 MPI 处理。这是默认值,并与许多其他版本的 MPI 一起使用。

此选项适用于步骤分配。

--msg-timeout=<seconds>
修改作业启动消息超时。 默认值为 Slurm 配置文件 slurm.conf 中的 MessageTimeout。 通常不建议更改此值,但可能对诊断问题有用。 此选项适用于作业分配。

--multi-prog
使用不同的程序和不同的参数运行作业。 在这种情况下,指定的可执行程序实际上是一个配置文件,指定每个任务的可执行程序和参数。有关配置文件内容的详细信息,请参见下面的 多个程序配置。此选项适用于步骤分配。

--network=<type>
指定与交换机或网络相关的信息。 type 的解释依赖于系统。 在原生 Cray 上运行 Slurm 时支持此选项。它用于请求使用网络性能计数器。 每个请求仅允许一个值。 所有选项不区分大小写。 在此配置中,支持的值包括:
system
使用系统范围的网络性能计数器。仅请求的节点将被标记为作业分配中使用。如果作业没有填满整个系统,其余节点将无法被其他使用 NPC 的作业使用,如果空闲,它们的状态将显示为 PerfCnts。这些节点仍然可供其他不使用 NPC 的作业使用。

blade
使用刀片网络性能计数器。仅请求的节点将被标记为作业分配中使用。如果作业没有填满分配给作业的整个刀片,这些刀片将无法被其他使用 NPC 的作业使用,如果空闲,它们的状态将显示为 PerfCnts。这些节点仍然可供其他不使用 NPC 的作业使用。

在所有情况下,作业分配请求 必须指定 --exclusive 选项,并且步骤不能指定 --overlap 选项。否则请求将被拒绝。

此外,使用这些选项时,步骤不允许共享刀片,因此如果在刀片上运行的步骤未占用刀片上的所有节点,则资源将在分配中保持空闲。

network 选项也可用于具有 HPE Slingshot 网络的系统。它可用于请求作业 VNI(用于作业中作业步骤之间的通信)。它还可以用于覆盖分配给作业步骤的默认网络资源。可以在逗号分隔的列表中指定多个值。

tcs=<class1>[:<class2>]...
要为应用程序配置的流量类集。 支持的流量类包括 DEDICATED_ACCESS、LOW_LATENCY、BULK_DATA 和 BEST_EFFORT。流量类也可以指定为 TC_DEDICATED_ACCESS、TC_LOW_LATENCY、TC_BULK_DATA 和 TC_BEST_EFFORT。 此选项适用于作业分配,但不适用于步骤分配。

no_vni
不为此作业分配任何 VNI(即使是多节点)。

job_vni
为此作业分配一个作业 VNI。

single_node_vni
为此作业分配一个作业 VNI,即使它是单节点作业。

adjust_limits
如果设置,slurmd 将通过获取每个 NIC 的最大资源数量并减去任何系统网络服务的保留或使用值(以较高者为准)来设置网络资源预留的上限;这是默认值。

no_adjust_limits
如果设置,slurmd 将仅根据每个资源配置的默认值和应用程序中的任务数量计算网络资源预留;它不会根据已存在的系统网络服务的资源使用情况设置这些预留请求的上限。 设置此项将意味着更多的应用程序启动可能会因网络资源耗尽而失败,但如果应用程序绝对需要一定数量的资源才能正常工作,此选项将确保这一点。

disable_rdzv_get
禁用 Slingshot NIC 中的会合获取,这可以提高某些应用程序的性能。

def_<rsrc>=<val>
此资源的每 CPU 保留分配。

res_<rsrc>=<val>
此资源的每节点保留分配。 如果设置,覆盖每 CPU 的分配。

max_<rsrc>=<val>
此资源的每节点最大限制。

depth=<depth>
每 CPU 资源分配的乘数。 默认值是节点上保留的 CPU 数量。

可以请求的资源包括:

txqs
传输命令队列。默认值为每 CPU 2,最大值为每节点 1024。

tgqs
目标命令队列。默认值为每 CPU 1,最大值为每节点 512。

eqs
事件队列。默认值为每 CPU 2,最大值为每节点 2047。

cts
计数器。默认值为每 CPU 1,最大值为每节点 2047。

tles
触发器列表条目。默认值为每 CPU 1,最大值为每节点 2048。

ptes
可移植表条目。默认值为每 CPU 6,最大值为每节点 2048。

les
列表条目。默认值为每 CPU 16,最大值为每节点 16384。

acs
寻址上下文。默认值为每 CPU 2,最大值为每节点 1022。

此选项适用于作业和步骤分配。

--nice[=adjustment]
以调整的调度优先级在 Slurm 中运行作业。如果没有调整值,则调度优先级降低 100。负的 nice 值会提高优先级,否则会降低优先级。调整范围为 +/- 2147483645。只有特权用户可以指定负的调整值。

-Z, --no-allocate
在一组节点上运行指定的任务,而不在 Slurm 队列结构中创建 Slurm "作业",绕过正常的资源分配步骤。必须使用 -w, --nodelist 选项指定节点列表。这是一个特权选项,仅对用户 "SlurmUser" 和 "root" 可用。此选项适用于作业分配。如果用户命名空间处于活动状态,则命名空间中的用户映射必须与 MUNGE 的命名空间匹配。如果不匹配,则作业将被 slurmd 拒绝。

-k, --no-kill[=off]
如果分配的节点之一失败,则不自动终止作业。此选项适用于作业和步骤分配。 作业将承担所有故障容错的责任。 使用此选项启动的任务将不被视为终止(例如 -K, --kill-on-bad-exit-W, --wait 选项将对作业步骤没有影响)。 活动作业步骤(MPI 作业)可能会遭受致命错误,但如果指定此选项,则可以运行后续作业步骤。

指定可选参数 "off" 以禁用 SLURM_NO_KILL 环境变量的效果。

默认操作是在节点失败时终止作业。

-F, --nodefile=<node_file>
--nodelist 类似,但列表包含在名为 node file 的文件中。列表中的节点名称也可以跨越文件中的多行。文件中的重复节点名称将被忽略。 节点名称在列表中的顺序并不重要;节点名称将由 Slurm 排序。

-w, --nodelist={<node_name_list>|<filename>}
请求特定的主机列表。 作业将包含 所有 这些主机,并可能根据需要添加其他主机以满足资源要求。 可以将列表指定为逗号分隔的主机列表、一系列主机(例如 host[1-5,7,...])或文件名。 如果主机列表包含 "/" 字符,则将假定它是文件名。 如果您指定的最小节点或处理器计数大于提供的主机列表能够满足的数量,则将根据需要在其他节点上分配额外资源。 为了避免多次重复主机名称,可以在主机名称后附加星号和重复计数。例如 "host1,host1" 和 "host1*2" 是等效的。如果给定了任务数量,并且也给定了请求的节点数量,则如果请求中的节点数量大于任务数量,则将减少从该请求中使用的节点数量以匹配任务数量。此选项适用于作业和步骤分配。

-N, --nodes=<minnodes>[-maxnodes]|<size_string>
请求分配至少 minnodes 个节点给此作业。 还可以使用 maxnodes 指定最大节点数。 如果只指定一个数字,则将其用作最小和最大节点数。节点计数也可以指定为 size_string。 size_string 规范确定应使用哪些节点值。 可以使用逗号分隔的列表或带有冒号和数字值的步进函数指定多个值,并用 "-" 分隔。 例如,"--nodes=1-15:4" 等同于 "--nodes=1,5,9,13"。 分区的节点限制优先于作业的限制。 如果作业的节点限制超出其关联分区允许的范围,则该作业将保持在 PENDING 状态。 这允许在稍后时间执行,当分区限制发生变化时。 如果作业节点限制超过分区中配置的节点数量,则该作业将被拒绝。 请注意,环境变量 SLURM_JOB_NUM_NODES(以及 SLURM_NNODES 以保持向后兼容)将设置为实际分配给作业的节点计数。有关更多信息,请参见 环境变量 部分。如果未指定 -N,默认行为是分配足够的节点以满足通过每个作业规范选项表达的请求资源,例如 -n-c--gpus。 作业将在指定范围内尽可能多地分配节点,而不会延迟作业的启动。 如果给定了任务数量,并且也给定了请求的节点数量,则如果请求中的节点数量大于任务数量,则将减少从该请求中使用的节点数量以匹配任务数量。 节点计数规范可以包括一个数字值,后面跟有后缀 "k"(将数字值乘以 1,024)或 "m"(将数字值乘以 1,048,576)。此选项适用于作业和步骤分配。

注意:此选项不能与任意分配一起使用。

-n, --ntasks=<number>
指定要运行的任务数量。请求 srunntasks 任务分配资源。 默认情况下每个节点一个任务,但请注意 --cpus-per-task 选项将更改此默认值。此选项适用于作业和步骤分配。

--ntasks-per-core=<ntasks>
请求每个核心调用最大 ntasks。 此选项适用于作业和步骤分配。 旨在与 --ntasks 选项一起使用。 与 --ntasks-per-node 相关,但在核心级别而不是节点级别。如果设置为 1,则将隐含 --cpu-bind=cores。 否则,如果设置为大于 1 的值,则将隐含 --cpu-bind=threads。可以通过同时指定 --cpu-bind=none 来避免自动绑定行为。 Slurm 可能会分配比请求的更多的 CPU,以遵守此选项。
注意:在使用 SelectType=select/linear 时不支持此选项。此值不能大于 --threads-per-core

--ntasks-per-gpu=<ntasks>
请求每个 GPU 调用 ntasks 任务。 此选项可以以两种方式工作:1)另外指定 --ntasks,在这种情况下,将自动确定无类型的 GPU 规范以满足 --ntasks-per-gpu,或 2)指定所需的 GPU(例如,通过 --gpus--gres)而不指定 --ntasks,总任务计数将自动确定。 如果需要,将自动增加所需的 CPU 数量以允许计算的任务计数。 此选项将隐式设置 --tres-bind=gres/gpu:single:<ntasks>,但可以通过显式的 --tres-bind=gres/gpu 规范覆盖。 此选项与节点范围不兼容(即 -N<minnodes-maxnodes>)。 此选项与 --gpus-per-task--gpus-per-socket--ntasks-per-node 不兼容。 除非配置了 SelectType=cons_tres(无论是直接还是间接在 Cray 系统上),否则不支持此选项。

--ntasks-per-node=<ntasks>
请求在每个节点上调用 ntasks。 如果与 --ntasks 选项一起使用,则 --ntasks 选项将优先,并且 --ntasks-per-node 将被视为每个节点的 最大 任务计数。 旨在与 --nodes 选项一起使用。 与 --cpus-per-task=ncpus 相关,但不需要知道每个节点上的实际 CPU 数量。在某些情况下,能够请求每个节点调用不超过特定数量的任务更为方便。这些示例包括提交一个混合的 MPI/OpenMP 应用程序,其中每个节点只应分配一个 MPI "任务/排名",同时允许 OpenMP 部分利用节点中存在的所有并行性,或将单个设置/清理/监控作业提交到预先存在的分配的每个节点,作为更大作业脚本中的一步。此选项适用于作业分配。

--ntasks-per-socket=<ntasks>
请求在每个插槽上调用最大 ntasks。 此选项适用于作业分配,但不适用于步骤分配。 旨在与 --ntasks 选项一起使用。 与 --ntasks-per-node 相关,但在插槽级别而不是节点级别。除非指定 --cpu-bind=none,否则将自动生成掩码以将任务绑定到特定插槽。 注意:在使用 SelectType=select/linear 时不支持此选项。

--oom-kill-step[={0|1}]
如果在步骤的任何任务中检测到 OOM 事件,是否杀死整个步骤。这将覆盖 slurm.conf 中 TaskPluginParam 的 "OOMKillStep" 设置和分配设置。当未设置时,将使用 slurm.conf 中的设置。当设置时,值为 "0" 将禁用杀死整个步骤,而值为 "1" 将启用它。 默认值为 "1"(启用),当找到选项但没有值时。

--open-mode={append|truncate}
根据指定的追加或截断模式打开输出和错误文件。 对于异构作业步骤,默认值为 "append"。 否则,默认值由系统配置参数 JobFileAppend 指定。此选项适用于作业和步骤分配。

请参见下面的 示例

-o, --output=<filename_pattern>
指定 stdout 重定向的 "filename pattern"。在交互模式下,默认情况下 srun 收集所有任务的 stdout,并通过 TCP/IP 将此输出发送到附加的终端。使用 --output,stdout 可以重定向到文件、每个任务一个文件或 /dev/null。有关各种形式的 filename pattern 的详细信息,请参见 IO 重定向 部分。 如果指定的文件已存在,则将被覆盖。

如果命令行上未同时指定 --error,则 stdout 和 stderr 都将定向到 --output 指定的文件。此选项适用于作业和步骤分配。

-O, --overcommit
超额分配资源。此选项适用于作业和步骤分配。

当应用于作业分配(不包括请求独占访问节点的作业)时,资源的分配方式就像只请求每个节点一个任务。这意味着每个任务请求的 CPU 数量(-c, --cpus-per-task)是在每个节点上分配,而不是乘以任务数量。用于指定每个节点、插槽、核心等的任务数量的选项将被忽略。

当应用于作业步骤分配时(在现有作业分配中执行 srun 命令),此选项可用于在每个 CPU 上启动多个任务。 通常,srun 不会在每个 CPU 上分配超过一个进程。 通过指定 --overcommit,您明确允许每个 CPU 上有多个进程。但是,每个节点上允许执行的任务数量不得超过 MAX_TASKS_PER_NODE注意MAX_TASKS_PER_NODE 在文件 slurm.h 中定义,并不是变量,它在 Slurm 构建时设置。

--overlap
允许作业步骤重叠执行。此选项适用于作业和步骤分配。

slurm_link" id="OPT_overlap" href="#OPT_overlap">

指定 --overlap 允许步骤与所有其他步骤共享所有资源(CPU、内存和 GRES)。使用此选项的步骤将与所有其他步骤重叠,即使那些没有指定 --overlap 的步骤也是如此。

默认情况下,步骤不会与其他并行步骤共享资源。此选项适用于步骤分配。

-s, --oversubscribe
作业分配可以与其他正在运行的作业过度订阅资源。要过度订阅的资源可以是节点、插槽、核心和/或超线程,具体取决于配置。默认的过度订阅行为取决于系统配置,分区的 OverSubscribe 选项优先于作业的选项。此选项可能会导致分配比未设置 --oversubscribe 选项时更早获得批准,并允许更高的系统利用率,但由于资源竞争,应用程序性能可能会受到影响。此选项适用于作业分配。

注意:此选项与 --exclusive 是互斥的。

-p, --partition=<partition_names>
请求特定分区进行资源分配。如果未指定,默认行为是允许 slurm 控制器选择系统管理员指定的默认分区。如果作业可以使用多个分区,请在逗号分隔的列表中指定它们的名称,并将使用提供最早启动的分区,而不考虑分区名称的顺序(尽管优先级更高的分区将首先考虑)。当作业启动时,使用的分区名称将首先放置在作业记录分区字符串中。此选项适用于作业分配。

--prefer=<list>
节点可以由 Slurm 管理员分配 特性。用户可以使用 prefer 选项指定其作业所需但不要求的 特性。此选项独立于 --constraint 操作,并将在可能的情况下覆盖在那里设置的内容。在调度时,首先尝试 --prefer 中的特性。如果没有可用的节点集具有这些特性,则尝试 --constraint。有关更多信息,请参见 --constraint,此选项的行为相同。

-E, --preserve-env
将环境变量 SLURM_JOB_NUM_NODES 和 SLURM_NTASKS 的当前值传递给 可执行文件,而不是从命令行参数计算它们。此选项适用于作业分配。

--priority=<value>
请求特定的作业优先级。可能受特定配置约束。value 应为数字值或 "TOP"(表示最高可能值)。只有 Slurm 操作员和管理员可以设置作业的优先级。此选项仅适用于作业分配。

--profile={all|none|<type>[,<type>...]}
启用 acct_gather_profile 插件的详细数据收集。详细数据通常是存储在作业的 HDF5 文件或根据配置的插件存储在 InfluxDB 数据库中的时间序列。此选项适用于作业和步骤分配。
All
收集所有数据类型。(不能与其他值组合。)

None
未收集任何数据类型。这是默认值。
 (不能 与 其他 值 组合。)

有效的 type 值包括:

Energy
收集能量数据。

Task
收集任务(I/O、内存等)数据。

Filesystem
收集文件系统数据。

Network
收集网络(InfiniBand)数据。

--prolog=<executable>
srun 将在启动作业步骤之前运行 executableexecutable 的命令行参数将是作业步骤的命令和参数。如果 executable 为 "none",则不会运行任何 srun prolog。此参数覆盖 slurm.conf 中的 SrunProlog 参数。此参数与 slurm.conf 中的 Prolog 参数完全独立。此选项适用于作业分配。

--propagate[=rlimit[,rlimit...]]
允许用户指定要传播到计算节点并应用于其作业的可修改(软)资源限制。如果未指定 rlimit,则将传播所有资源限制。Slurm 支持以下 rlimit 名称(尽管某些选项可能在某些系统上不受支持):
ALL
列出的所有限制(默认)

NONE
未列出任何限制

AS
进程的最大地址空间(虚拟内存)。

CORE
核心文件的最大大小

CPU
最大 CPU 时间

DATA
进程数据段的最大大小

FSIZE
创建的文件的最大大小。请注意,如果用户将 FSIZE 设置为小于 slurmd.log 的当前大小,则作业启动将失败并出现 '文件大小限制超出' 错误。

MEMLOCK
可以锁定到内存中的最大大小

NOFILE
最大打开文件数

NPROC
可用进程的最大数量

RSS
最大常驻集大小。请注意,这仅在 Linux 内核 2.4.30 或更早版本或 BSD 中有效。

STACK
最大堆栈大小

此选项适用于作业分配。

--pty, --pty=<文件描述符>
以伪终端模式执行任务零,或使用指定的伪终端 <文件描述符>。隐式设置 --unbuffered。隐式将 --error--output 设置为 /dev/null,除了任务零外的所有任务,这可能导致这些任务立即退出(例如,shell 通常会在这种情况下立即退出)。此选项适用于步骤分配。

-q, --qos=<qos>
请求作业的服务质量,或逗号分隔的 QOS 列表。如果请求列表,将根据给定 QOS 的优先级进行排序,优先级最高的为第一个。QOS 值可以在 Slurm 数据库中为每个用户/集群/账户关联定义。当 Slurm 配置参数 AccountingStorageEnforce 包含 "qos" 时,用户将被限制在其关联定义的 qos 集中。此选项适用于作业分配。

-Q, --quiet
抑制来自 srun 的信息消息。错误仍将显示。此选项适用于作业和步骤分配。

--quit-on-interrupt
在接收到单个 SIGINT(Ctrl-C)时立即退出。使用此选项会禁用在 srun 接收到单个 Ctrl-C 时通常可用的状态功能,并导致 srun 立即终止正在运行的作业。此选项适用于步骤分配。

--reboot
在启动作业之前强制分配的节点重启。这仅在某些系统配置中受支持,其他情况下将被静默忽略。只有 root、SlurmUser 或管理员可以重启节点。此选项适用于作业分配。

-r, --relative=<n>
相对于当前分配的节点 n 运行作业步骤。此选项可用于在当前作业的节点之间分散多个作业步骤。如果使用 -r,当前作业步骤将从分配的节点列表中的节点 n 开始,其中第一个节点被视为节点 0。-r 选项不允许与 -w-x 选项一起使用,并且在未在先前分配中运行时(即 SLURM_JOB_ID 未设置)将导致致命错误。n 的默认值为 0。如果 --nodes 的值超过使用 --relative 选项标识的节点数,将打印警告消息,并且 --relative 选项将优先。此选项适用于步骤分配。

--reservation=<reservation_names>
从命名的保留中为作业分配资源。如果作业可以使用多个保留,请在逗号分隔的列表中指定它们的名称,并选择提供最早启动的保留。每个保留将按照请求的顺序进行考虑。所有保留将在作业生命周期内通过 scontrol/squeue 列出。在会计中,将看到第一个保留,作业开始后使用的保留将替换它。

--resv-ports[=count]
为此作业保留通信端口。用户可以指定要保留的端口数量。必须在 slurm.conf 中指定参数 MpiParams=ports=12000-12999。如果保留的端口数量为零,则不保留任何端口。仅用于原生 Cray 的 PMI。此选项适用于作业和步骤分配。

--segment=<segment_size>
当使用块拓扑时,这定义了用于创建作业分配的段的大小。不会对所有段施加要求,作业需要放置在同一更高层块内。

注意:请求的节点数必须始终能够被请求的段大小整除。

注意:段大小必须小于或等于计划的基本块大小。例如,对于基本块大小为 30 节点的系统,"--segment 40" 将无效。

--send-libs[=yes|no]
如果设置为 yes(或没有参数),则自动检测并广播可执行文件的共享对象依赖项到分配的计算节点。这些文件被放置在与可执行文件并排的目录中。LD_LIBRARY_PATH 也会自动更新,以包括此缓存目录。此选项覆盖 slurm.conf 中配置的默认行为 SbcastParameters send_libs。此选项仅在与 --bcast 一起使用时有效。另请参见 --bcast-exclude

--signal=[R:]<sig_num>[@sig_time]
当作业距离结束时间还有 sig_time 秒时,发送信号 sig_num。由于 Slurm 的事件处理分辨率,信号可能会比指定的时间早最多 60 秒。sig_num 可以是信号编号或名称(例如 "10" 或 "USR1")。sig_time 必须是 0 到 65535 之间的整数值。默认情况下,在作业结束时间之前不会发送信号。如果指定了 sig_num 而没有任何 sig_time,默认时间将为 60 秒。此选项适用于作业分配。使用 "R:" 选项允许此作业与设置了 MaxStartDelay 的保留重叠。如果使用 "R:" 选项,则必须在系统上启用抢占,如果作业被抢占,则如果允许将其重新排队,否则作业将被取消。要在抢占时间发送信号,请参见 send_user_signal PreemptParameter

--slurmd-debug=<level>
为此步骤指定调试级别。level 可以指定为 2 [错误] 和 6 [调试2] 之间的整数值,或作为 SlurmdDebug 标签之一。
error
仅记录错误

info
记录错误和一般信息消息

verbose
记录错误和详细信息消息

debug
记录错误和详细信息消息以及调试消息

debug2
记录错误和详细信息消息以及更多调试消息

slurmd 调试信息被复制到作业的 stderr 中。默认情况下,仅显示错误。此选项适用于作业和步骤分配。

--sockets-per-node=<sockets>
将节点选择限制为至少具有指定数量插槽的节点。有关启用任务/亲和性插件时的其他信息,请参见上面的 -B 选项。此选项适用于作业分配。
注意:如果未指定 -n,此选项可能会隐式影响任务数量。

--spread-job
尽可能将作业分配分散到多个节点,并尝试在分配的节点之间均匀分配任务。此选项禁用拓扑/树插件。此选项适用于作业分配。

--stepmgr
如果未在系统范围内启用 slurmstepd 步骤管理,则为每个作业启用 slurmstepd 步骤管理。这使得作业步骤可以由与作业关联的单个外部 slurmstepd 管理。这对在其分配内提交多个步骤的作业非常有利。必须设置 PrologFlags=contain。此选项适用于作业分配。

--switches=<count>[@max-time]
当使用树拓扑时,这定义了作业分配所需的最大叶子交换机数量,以及可选的等待该数量交换机的最长时间。如果 Slurm 找到包含比指定数量更多交换机的分配,则作业将保持挂起,直到找到具有所需交换机数量的分配或时间限制到期。如果没有交换机数量限制,则启动作业没有延迟。可接受的时间格式包括 "分钟"、"分钟:秒"、"小时:分钟:秒"、"天-小时"、"天-小时:分钟" 和 "天-小时:分钟:秒"。作业的最大时间延迟可能会受到系统管理员使用 SchedulerParameters 配置参数的 max_switch_wait 参数选项的限制。在龙虾网络上,唯一支持的交换机数量为 1,因为当作业在一个叶子交换机上分配资源时,通信性能会最高,或超过 2 个叶子交换机。默认的最大时间为 max_switch_wait SchedulerParameters。此选项适用于作业分配。

--task-epilog=<executable>
slurmstepd 守护进程将在每个任务终止后运行 executable。这将在执行 slurm.conf 中的任何 TaskEpilog 参数之前执行。这是一个非常短暂的程序。如果它未能在几秒钟内终止,它将与任何后代进程一起被杀死。此选项适用于步骤分配。

--task-prolog=<executable>
slurmstepd 守护进程将在启动每个任务之前运行 executable。这将在执行 slurm.conf 中的任何 TaskProlog 参数之后执行。除了正常的环境变量外,还有 SLURM_TASK_PID 可用于识别正在启动的任务的进程 ID。此程序的标准输出形式为 "export NAME=value" 将用于设置正在生成的任务的环境变量。此选项适用于步骤分配。

--test-only
返回作业在当前作业队列和所有其他 srun 参数下的调度运行时间的估计。这将限制 srun 的行为仅返回信息;实际上不会提交作业。该程序将由 slurmd 守护进程直接执行。此选项适用于作业分配。

--thread-spec=<num>
每个节点为系统操作保留的专用线程数,不被应用程序使用。应用程序不会使用这些线程,但会为其分配收费。此选项不能与 --core-spec 选项一起使用。此选项适用于作业分配。

注意:显式设置作业的专用线程值隐式设置其 --exclusive 选项,为作业保留整个节点。

-T, --threads=<nthreads>
允许限制从 srun 进程向分配节点上的 slurmd 进程发送作业请求的并发线程数。默认情况下,每个分配的节点使用一个线程,最多可并发 60 个线程。指定此选项将并发线程数限制为 nthreads(小于或等于 60)。这仅应在非常小内存计算机上用于设置低线程计数进行测试。

--threads-per-core=<threads>
将节点选择限制为每个核心至少具有指定数量线程的节点。在任务布局中,使用每个核心的最大线程数。除非通过命令行或环境选项覆盖,否则隐含 --cpu-bind=threads注意:"线程" 指的是每个核心上的处理单元数量,而不是每个核心要启动的应用程序任务数量。有关启用任务/亲和性插件时的其他信息,请参见上面的 -B 选项。此选项适用于作业和步骤分配。
注意:如果未指定 -n,此选项可能会隐式影响任务数量。

-t, --time=<time>
设置作业分配的总运行时间限制。如果请求的时间限制超过分区的时间限制,作业将保持在 PENDING 状态(可能无限期)。默认时间限制为分区的默认时间限制。当达到时间限制时,每个作业步骤中的每个任务将发送 SIGTERM,然后发送 SIGKILL。信号之间的间隔由 Slurm 配置参数 KillWait 指定。OverTimeLimit 配置参数可能允许作业运行超过计划时间。时间分辨率为一分钟,秒值向上舍入到下一个分钟。

时间限制为零请求不施加时间限制。可接受的时间格式包括 "分钟"、"分钟:秒"、"小时:分钟:秒"、"天-小时"、"天-小时:分钟" 和 "天-小时:分钟:秒"。此选项适用于作业和步骤分配。

--time-min=<time>
设置作业分配的最小时间限制。如果指定,作业的 --time 限制可以降低到不低于 --time-min 的值,如果这样做可以使作业更早开始执行。作业的时间限制在作业分配资源后不会更改。这是通过回填调度算法执行的,以分配原本保留给优先级更高的作业的资源。可接受的时间格式包括 "分钟"、"分钟:秒"、"小时:分钟:秒"、"天-小时"、"天-小时:分钟" 和 "天-小时:分钟:秒"。此选项适用于作业分配。

--tmp=<size>[units]
指定每个节点的临时磁盘空间的最小量。默认单位为兆字节。可以使用后缀 [K|M|G|T] 指定不同单位。此选项适用于作业分配。

--treewidth=<size>
指定扇出宽度。默认值为 TreeWidth,在 slurm.conf 中指定。该值不得超过 65533。值为 "off" 将禁用扇出。

--tres-bind=<tres>:[verbose,]<type>[+<tres>:
[verbose,]<type>...] 指定带有其任务绑定选项的 tres 列表。目前,GRES 是此选项支持的唯一 tres。指定 GRES 为 "gres/<gres_name>"(例如 gres/gpu)

示例: --tres-bind=gres/gpu:verbose,map:0,1,2,3+gres/nic:closest

默认情况下,大多数 tres 不绑定到单个任务

支持的 type 选项的绑定 gres

closest
将每个任务绑定到最近的 GRES。在 NUMA 环境中,每个任务可以绑定到多个 GRES(即该 NUMA 环境中的所有 GRES)。

map:<list>
通过在任务(或排名)上设置 GRES 掩码进行绑定,如所指定的,其中 <list> 为 <gres_id_for_task_0>,<gres_id_for_task_1>,... GRES ID 被解释为十进制值。如果任务(或排名)的数量超过此列表中的元素数量,则列表中的元素将根据需要从头开始重用。为了简化对大量任务计数的支持,列表可以跟随带有星号和重复计数的映射。例如 "map:0*4,1*4"。如果使用任务/cgroup 插件并在 cgroup.conf 中设置了 ConstrainDevices,则 GRES ID 是相对于分配给作业的 GRES 的零基索引(例如,第一个 GRES 为 0,即使全局 ID 为 3)。否则,GRES ID 是全局 ID,作业中的每个节点上的所有 GRES 应该被分配以获得可预测的绑定结果。

mask:<list>
通过在任务(或排名)上设置 GRES 掩码进行绑定,如所指定的,其中 <list> 为 <gres_mask_for_task_0>,<gres_mask_for_task_1>,... 映射是为节点指定的,并且相同的映射应用于每个节点上的任务(即每个节点上最低的任务 ID 映射到列表中指定的第一个掩码,依此类推)。GRES 掩码始终被解释为十六进制值,但可以加上可选的 '0x' 前缀。为了简化对大量任务计数的支持,列表可以跟随带有星号和重复计数的映射。例如 "mask:0x0f*4,0xf0*4"。如果使用任务/cgroup 插件并在 cgroup.conf 中设置了 ConstrainDevices,则 GRES ID 是相对于分配给作业的 GRES 的零基索引(例如,第一个 GRES 为 0,即使全局 ID 为 3)。否则,GRES ID 是全局 ID,作业中的每个节点上的所有 GRES 应该被分配以获得可预测的绑定结果。

none
不将任务绑定到此 GRES(关闭 --tres-per-task 和 --gpus-per-task 的隐式绑定)。

per_task:<gres_per_task>
每个任务将绑定到指定数量的 GRES,<gres_per_task>。任务优先分配与其分配中的核心相关的 GRES,如 closest,尽管如果不可用,它们将接受任何 GRES。如果不存在亲和性,第一个任务将被分配到节点上的前 x 数量的 GRES 等等。共享 GRES 将优先绑定每个任务一个共享设备(如果可能)。

single:<tasks_per_gres>
closest 类似,除了每个任务只能绑定到单个 GRES,即使可以绑定到多个同样接近的 GRES。要绑定的 GRES 由 <tasks_per_gres> 确定,其中前 <tasks_per_gres> 个任务绑定到第一个可用的 GRES,第二个 <tasks_per_gres> 个任务绑定到第二个可用的 GRES,依此类推。这基本上是将任务块分配到可用 GRES 上,其中可用 GRES 由任务的插槽亲和性和 GRES 的插槽亲和性(如在 gres.conf 的 Cores 参数中指定)确定。

注意:共享 GRES 绑定目前仅限于 per_task 或 none。

--tres-per-task=<list>
指定每个要在作业资源分配中生成的任务所需的可跟踪资源的逗号分隔列表。列表中每个条目的格式为 "trestype[/tresname]=count"。trestype 是请求的可跟踪资源的类型(例如 cpu、gres、license 等)。tresname 是可跟踪资源的名称,可以通过 sacctmgr show tres 查看。对于 GRES、license 等类型的 tres,这是必需的(例如 gpu、gpu:a100)。要使用此选项请求许可证,许可证必须在 slurm.conf 的 AccountingStorageTRES 参数中定义。count 是这些资源的数量。
计数可以有后缀
"k" 或 "K"(1024 的倍数),
"m" 或 "M"(1024 x 1024 的倍数),
"g" 或 "G"(1024 x 1024 x 1024 的倍数),
"t" 或 "T"(1024 x 1024 x 1024 x 1024 的倍数),
"p" 或 "P"(1024 x 1024 x 1024 x 1024 x 1024 的倍数)。
示例:
--tres-per-task=cpu=4
--tres-per-task=cpu=8,license/ansys=1
--tres-per-task=gres/gpu=1
--tres-per-task=gres/gpu:a100=2
指定的资源将在每个节点上分配给作业。可用的可跟踪资源由系统管理员配置。
注意:此选项与 gres/gpu 或 gres/shard 将隐式设置 --tres-bind=gres/[gpu|shard]:per_task:<tres_per_task>,或者如果指定了多个 gpu 类型 --tres-bind=gres/gpu:per_task:<gpus_per_task_type_sum>。这可以通过显式的 --tres-bind 规范进行覆盖。
注意:无效的 TRES 用于 --tres-per-task 包括 bb、billing、energy、fs、mem、node、pages、vmem。

-u, --unbuffered
默认情况下,slurmstepd 与用户启动的应用程序之间的连接是通过管道进行的。应用程序写入的 stdio 输出由 glibc 缓冲,直到它被刷新或输出设置为无缓冲。请参见 setbuf(3)。如果指定此选项,则任务在伪终端中执行,以便应用程序输出是无缓冲的。此选项适用于步骤分配。

--usage
显示简要帮助信息并退出。

--use-min-nodes
如果给定了节点数量范围,优先选择较小的数量。

-v, --verbose
增加 srun 信息消息的详细程度。多个 -v 将进一步增加 srun 的详细程度。默认情况下,仅显示错误。此选项适用于作业和步骤分配。

-V, --version
显示版本信息并退出。

--wait-for-children
在将任务视为结束之前,等待每个任务中的所有进程完成。没有此选项的默认行为是仅等待每个任务中的父进程完成。请注意,如果父进程以非零退出代码退出,则任务将结束,无论是否还有子进程在运行。此选项需要 proctrack/cgroup 和 cgroup/v2。

-W, --wait=<seconds>
指定在第一个任务终止后等待多长时间,然后终止所有剩余任务。值为 0 表示无限等待(60 秒后将发出警告)。默认值由 slurm 配置文件中的 WaitTime 参数设置(请参见 slurm.conf(5))。此选项可以确保在一个或多个任务过早终止的情况下,作业及时终止。注意:-K--kill-on-bad-exit 选项优先于 -W--wait,如果任务以非零退出代码退出,则立即终止作业。此选项适用于作业分配。

--wckey=<wckey>
指定用于作业的 wckey。如果 slurm.conf 中的 TrackWCKey=no(默认),则此值将被忽略。此选项适用于作业分配。

--x11[={all|first|last}]
在分配的 "所有"、"第一个"或 "最后一个" 节点上设置 X11 转发。仅当 Slurm 编译时启用了 X11 支持,并且在 slurm.conf 中定义了 PrologFlags=x11 时,此选项才会启用。默认值为 "所有"。

srun 将作业请求提交给 slurm 作业控制器,然后在远程节点上启动所有进程。如果请求无法立即满足,srun 将阻塞,直到资源空闲以运行作业。如果指定了 -I--immediate)选项,srun 将在资源未立即可用时终止。

在启动远程进程时,srun 将传播当前工作目录,除非指定了 --chdir=<path>,在这种情况下 path 将成为远程进程的工作目录。

-n, -c-N 选项控制将分配给作业的 CPU 和节点。当仅使用 -n 指定要运行的进程数时,将为每个进程分配一个 CPU。通过指定每个任务所需的 CPU 数量(-c),可以为每个进程分配多个 CPU。如果使用 -N 指定节点数,srun 将尝试分配 至少 指定的节点数。

可以使用上述三个选项的组合来更改进程在节点和 CPU 之间的分配。例如,通过同时指定进程数和要运行的节点数,隐含了每个节点的进程数。然而,如果每个进程的 CPU 数量更重要,则应指定进程数(-n)和每个进程的 CPU 数量(-c)。

srun 将拒绝在每个 CPU 上分配多个进程,除非同时指定了 --overcommit-O)。

srun 将尝试满足上述规格 "至少"。也就是说,如果请求 16 个节点用于 32 个进程,并且某些节点没有 2 个 CPU,则将增加节点的分配以满足对 CPU 的需求。换句话说,正在请求 至少 16 个节点。然而,如果请求 16 个节点用于 15 个进程,srun 将视为错误,因为 15 个进程无法在 16 个节点上运行。

IO 重定向

默认情况下,stdout 和 stderr 将从所有任务重定向到 srun 的 stdout 和 stderr,stdin 将从 srun 的标准输入重定向到所有远程任务。如果 stdin 仅需由部分生成的任务读取,指定一个文件进行读取而不是从 srun 命令转发 stdin 可能更可取,因为这避免了移动和存储将永远不会被读取的数据。

对于 OS X,poll() 函数不支持 stdin,因此无法从终端输入。

此行为可以通过 --output--error--input-o-e-i)选项进行更改。请注意,--error 不会重定向 srun 本身的 stderr,仅重定向任务的 stderr。有效的格式规范如下:

all
stdout stderr 从所有任务重定向到 srun。stdin 广播到所有远程任务。(这是默认行为)

none
stdout 和 stderr 不从任何任务接收。stdin 不发送到任何任务(stdin 被关闭)。

taskid
stdout 和/或 stderr 仅从相对 ID 等于 taskid 的任务重定向,其中 0 <= taskid <= ntasks,其中 ntasks 是当前作业步骤中的任务总数。stdin 从 srun 的 stdin 重定向到此相同任务。此文件将在执行任务的节点上写入。

filename
srun 将从所有任务将 stdout 和/或 stderr 重定向到命名文件。stdin 将从命名文件重定向并广播到作业中的所有任务。filename 指的是运行 srun 的主机上的路径。根据集群的文件系统布局,这可能会导致输出出现在不同的位置,具体取决于作业是以批处理模式运行。

filename pattern
srun 允许使用文件名模式来生成上述命名 IO 文件。以下格式说明符列表可用于格式字符串,以生成对给定 jobid、stepid、node 或 task 唯一的文件名。在每种情况下,打开适当数量的文件并与相应的任务关联。请注意,任何包含 %t、%n 和/或 %N 的格式字符串将在执行任务的节点上写入,而不是 srun 执行的节点上。

\\
不处理任何替换符号。

%%
字符 "%"。

%A
作业数组的主作业分配编号。

%a
作业数组ID(索引)编号。

%J
正在运行的作业的jobid.stepid。(例如:“128.0”)

%j
正在运行的作业的jobid。

%s
正在运行的作业的stepid。

%N
短主机名。每个节点将创建一个单独的IO文件。

%n
相对于当前作业的节点标识符(例如“0”是正在运行的作业的第一个节点)。每个节点将创建一个单独的IO文件。

%t
相对于当前作业的任务标识符(排名)。每个任务将创建一个单独的IO文件。

%u
用户名。

%x
作业名称。

在百分号字符和格式说明符之间放置的数字可以用于在IO文件名中将结果零填充到指定数字的最小值。如果格式说明符对应于非数字数据(例如%N),则此数字将被忽略。最大值为10,如果使用大于10的值,则结果将填充到10个字符。 以下是如何使用格式字符串的示例,适用于具有作业ID为128和步骤ID为0的4个任务作业步骤:

job%J.out
job128.0.out

job%4j.out
job0128.out

job%2j-%2t.out
job128-00.out,job128-01.out,...

 

性能

执行srun会向slurmctld发送远程过程调用。如果来自srun或其他向slurmctld守护进程发送远程过程调用的Slurm客户端命令的调用过多,可能会导致slurmctld守护进程的性能下降,甚至可能导致服务拒绝。

请勿在shell脚本或其他程序的循环中运行srun或其他发送远程过程调用到slurmctld的Slurm客户端命令。确保程序将对srun的调用限制到收集信息所需的最小值。

 

输入环境变量

在启动时,srun将读取并处理以下环境变量中设置的选项。这些变量中的大多数是以与上述定义的选项相同的方式设置的。对于定义为不期望参数的标志选项,可以通过设置环境变量而不指定值(空字符串或NULL字符串)、字符串“yes”或非零数字来启用该选项。环境变量的任何其他值将导致该选项未被设置。 以下是这些规则的一些例外情况。
注意:命令行选项始终优先于环境变量设置。

PMI_FANOUT
此选项专门用于PMI(MPICH2和MVAPICH2),控制数据通信的扇出。srun命令通过PMI库向应用程序发送消息,这些应用程序可能被要求将数据转发给多达此数量的附加任务。较高的值会将工作从srun命令转移到应用程序,并可能增加故障的脆弱性。 默认值为32。

PMI_FANOUT_OFF_HOST
此选项专门用于PMI(MPICH2和MVAPICH2),控制数据通信的扇出。srun命令通过PMI库向应用程序发送消息,这些应用程序可能被要求将数据转发给附加任务。默认情况下,srun每个主机发送一条消息,并且该主机上的一个任务将数据转发给该主机上的其他任务,最多到PMI_FANOUT。 如果定义了PMI_FANOUT_OFF_HOST,则用户任务可能需要将数据转发给其他主机上的任务。 设置PMI_FANOUT_OFF_HOST可能会提高性能。 由于用户应用程序加载的PMI库执行了更多的工作,故障也可能更常见且更难以诊断。应通过设置为0或1来禁用/启用。

PMI_TIME
此选项专门用于PMI(MPICH2和MVAPICH2),控制任务与srun之间的通信在时间上的分散程度,以避免使srun命令过载。默认值为每个任务500(微秒)。在相对较慢的处理器或具有非常大处理器数量(和大PMI数据集)的系统上,可能需要更高的值。

SLURM_ACCOUNT
-A, --account相同

SLURM_ACCTG_FREQ
--acctg-freq相同

SLURM_BCAST
--bcast相同

SLURM_BCAST_EXCLUDE
--bcast-exclude相同

SLURM_BURST_BUFFER
--bb相同

SLURM_CLUSTERS
-M, --clusters相同

SLURM_COMPRESS
--compress相同

SLURM_CONF
Slurm配置文件的位置。

SLURM_CONSTRAINT
-C, --constraint相同

SLURM_CORE_SPEC
--core-spec相同

SLURM_CPU_BIND
--cpu-bind相同

SLURM_CPU_FREQ_REQ
--cpu-freq相同。

SLURM_CPUS_PER_GPU
--cpus-per-gpu相同

SLURM_CPUS_PER_TASK
-c, --cpus-per-task--tres-per-task=cpu=#相同

SLURM_DEBUG
-v, --verbose相同,当设置为1时,设置为2时给出-vv,等等。

SLURM_DEBUG_FLAGS
指定srun使用的调试标志。有关完整的标志列表,请参见slurm.conf(5)手册页。环境变量优先于slurm.conf中的设置。

SLURM_DELAY_BOOT
--delay-boot相同

SLURM_DEPENDENCY
-d, --dependency=<jobid>相同

SLURM_DISABLE_STATUS
-X, --disable-status相同

SLURM_DIST_PLANESIZE
平面分布大小。仅在设置--distribution=plane时使用,且不带=<size>

SLURM_DISTRIBUTION
-m, --distribution相同

SLURM_EPILOG
--epilog相同

SLURM_EXACT
--exact相同

SLURM_EXCLUSIVE
--exclusive相同

SLURM_EXIT_ERROR
指定发生Slurm错误时生成的退出代码(例如无效选项)。 这可以被脚本用来区分应用程序退出代码与各种Slurm错误条件。 另请参见SLURM_EXIT_IMMEDIATE

SLURM_EXIT_IMMEDIATE
指定使用--immediate选项时生成的退出代码,当资源当前不可用时。 这可以被脚本用来区分应用程序退出代码与各种Slurm错误条件。 另请参见SLURM_EXIT_ERROR

SLURM_EXPORT_ENV
--export相同

SLURM_GPU_BIND
--gpu-bind相同

SLURM_GPU_FREQ
--gpu-freq相同

SLURM_GPUS
-G, --gpus相同

SLURM_GPUS_PER_NODE
--gpus-per-node相同,但在现有分配中,在这种情况下,如果指定了--gpus,则将被忽略。

SLURM_GPUS_PER_TASK
--gpus-per-task相同

SLURM_GRES
--gres相同。另请参见SLURM_STEP_GRES

SLURM_GRES_FLAGS
--gres-flags相同

SLURM_HINT
--hint相同

SLURM_IMMEDIATE
-I, --immediate相同

SLURM_JOB_ID
--jobid相同

SLURM_JOB_NAME
-J, --job-name相同,但在现有分配中,在这种情况下,将被忽略以避免使用批处理作业的名称作为每个作业步骤的名称。

SLURM_JOB_NUM_NODES
-N, --nodes相同。 作业资源分配中的节点总数。

SLURM_KILL_BAD_EXIT
-K, --kill-on-bad-exit相同。必须设置为0或1以禁用或启用该选项。

SLURM_LABELIO
-l, --label相同

SLURM_MEM_BIND
--mem-bind相同

SLURM_MEM_PER_CPU
--mem-per-cpu相同

SLURM_MEM_PER_GPU
--mem-per-gpu相同

SLURM_MEM_PER_NODE
--mem相同

SLURM_MPI_TYPE
--mpi相同

SLURM_NETWORK
--network相同

SLURM_NNODES
-N, --nodes相同。作业资源分配中的节点总数。请参见SLURM_JOB_NUM_NODES。为了向后兼容而包含。

SLURM_NO_KILL
-k, --no-kill相同

SLURM_NPROCS
-n, --ntasks相同。请参见SLURM_NTASKS。为了向后兼容而包含。

SLURM_NTASKS
-n, --ntasks相同

SLURM_NTASKS_PER_CORE
--ntasks-per-core相同

SLURM_NTASKS_PER_GPU
--ntasks-per-gpu相同

SLURM_NTASKS_PER_NODE
--ntasks-per-node相同

SLURM_NTASKS_PER_SOCKET
--ntasks-per-socket相同

SLURM_OOMKILLSTEP
--oom-kill-step相同

SLURM_OPEN_MODE
--open-mode相同

SLURM_OVERCOMMIT
-O, --overcommit相同

SLURM_OVERLAP
--overlap相同

SLURM_PARTITION
-p, --partition相同

SLURM_PMI_KVS_NO_DUP_KEYS
如果设置,则PMI键对将不包含重复键。MPI可以使用此变量通知PMI库它不会使用重复键,因此PMI可以跳过重复键的检查。 对于MPICH2,这是常见的情况,并减少了测试重复项的开销以提高性能。

SLURM_POWER
--power相同

SLURM_PROFILE
--profile相同

SLURM_PROLOG
--prolog相同

SLURM_QOS
--qos相同

SLURM_REMOTE_CWD
-D, --chdir=相同

SLURM_REQ_SWITCH
当使用树形拓扑时,这定义了作业分配所需的最大交换机数量,以及可选的最大等待时间。请参见--switches

SLURM_RESERVATION
--reservation相同

SLURM_RESV_PORTS
--resv-ports相同

SLURM_SEND_LIBS
--send-libs相同

SLURM_SIGNAL
--signal相同

SLURM_SPREAD_JOB
--spread-job相同

SLURM_SRUN_REDUCE_TASK_EXIT_MSG
如果设置且非零,则相同退出代码的连续任务退出消息将仅打印一次。

SRUN_ERROR
-e, --error相同

SRUN_INPUT
-i, --input相同

SRUN_OUTPUT
-o, --output相同

SLURM_STEP_GRES
--gres相同(仅适用于作业步骤,而不适用于作业分配)。 另请参见SLURM_GRES

SLURM_STEP_KILLED_MSG_NODE_ID=ID
如果设置,仅指定的节点将在作业或步骤被信号终止时记录。

SLURM_TASK_EPILOG
--task-epilog相同

SLURM_TASK_PROLOG
--task-prolog相同

SLURM_TEST_EXEC
如果定义,srun将在尝试在步骤的节点上启动可执行程序之前验证可执行程序的存在及用户执行权限。

SLURM_THREAD_SPEC
--thread-spec相同

SLURM_THREADS
-T, --threads相同

SLURM_THREADS_PER_CORE
--threads-per-core相同

SLURM_TIMELIMIT
-t, --time相同

SLURM_TRES_BIND
--tres-bind相同。如果指定了--gpu-bind,则也将其设置在SLURM_TRES_BIND中,就好像在--tres-bind中指定了一样。

SLURM_TRES_PER_TASK
--tres-per-task相同。

SLURM_UMASK
如果定义,Slurm将在创建作业的输出/错误文件时使用定义的umask来设置权限。

SLURM_UNBUFFEREDIO
-u, --unbuffered相同

SLURM_USE_MIN_NODES
--use-min-nodes相同

SLURM_WAIT
-W, --wait相同

SLURM_WAIT4SWITCH
请求交换机的最大等待时间。请参见--switches

SLURM_WCKEY
-W, --wckey相同

SLURM_WORKING_DIR
-D, --chdir

SLURMD_DEBUG
--slurmd-debug相同。

SRUN_CONTAINER
--container相同。

SRUN_CONTAINER_ID
--container-id相同。

SRUN_EXPORT_ENV
--export相同,并将覆盖SLURM_EXPORT_ENV的任何设置。

SRUN_SEGMENT_SIZE
--segment相同

 

输出环境变量

srun将在远程计算节点上执行任务的环境中设置一些环境变量。 这些环境变量包括:

SLURM_*_HET_GROUP_#
对于异构作业分配,环境变量将为每个组件单独设置。

SLURM_CLUSTER_NAME
作业正在执行的集群名称。

SLURM_CPU_BIND_LIST
--cpu-bind映射或掩码列表(此节点的Slurm CPU ID或掩码列表,CPU_ID = 板_ID x 每板线程数 + 插槽_ID x 每插槽线程数 + 核心_ID x 每核心线程数 + 线程_ID)。

SLURM_CPU_BIND_TYPE
--cpu-bind类型(none,rank,map_cpu:,mask_cpu:)。

SLURM_CPU_BIND_VERBOSE
--cpu-bind详细程度(quiet,verbose)。

SLURM_CPU_FREQ_REQ
包含srun命令请求的CPU频率的值,作为千赫兹的数值频率,或请求高m1的编码值。 请参见--cpu-freq选项或SLURM_CPU_FREQ_REQ输入环境变量的描述。

SLURM_CPUS_ON_NODE
此节点上可用于步骤的CPU数量。 注意select/linear插件将整个节点分配给作业,因此该值表示节点上的CPU总数。 对于cons/tres插件,此数字表示分配给步骤的此节点上的CPU数量。

SLURM_CPUS_PER_TASK
每个任务请求的CPU数量。 仅在指定了--cpus-per-task选项或--tres-per-task=cpu=#选项时设置。

SLURM_DISTRIBUTION
分配作业的分布类型。使用-m, --distribution设置分布。

SLURM_GPUS_ON_NODE
此节点上可用于步骤的GPU数量。

SLURM_GTIDS
在此节点上运行的全局任务ID。 零起始并用逗号分隔。 如果Slurm是使用pmi支持构建的,则pmi会内部读取它。保留该变量可能会在作业中使用外部软件包时导致问题(已知Abaqus和Ansys在设置时存在问题 - 请查阅第三方软件的相关文档)。

SLURM_HET_SIZE
设置为异构作业中的组件计数。

SLURM_JOB_ACCOUNT
与作业分配相关的帐户名称。

SLURM_JOB_CPUS_PER_NODE
在分配中的节点上可用于作业的CPU计数,使用格式CPU_count[(xnumber_of_nodes)][,CPU_count[(xnumber_of_nodes)] ...]。 例如:SLURM_JOB_CPUS_PER_NODE='72(x2),36'表示在第一个和第二个节点(由SLURM_JOB_NODELIST列出)上,分配有72个CPU,而第三个节点有36个CPU。 注意select/linear插件将整个节点分配给作业,因此该值表示分配节点上的CPU总数。select/cons_tres插件将单个CPU分配给作业,因此此数字表示分配给作业的CPU数量。

SLURM_JOB_DEPENDENCY
设置为--dependency选项的值。

SLURM_JOB_END_TIME
作业预计结束时间的UNIX时间戳。

SLURM_JOB_GPUS
分配给此作业的GPU的全局GPU ID。GPU ID与任何设备cgroup无关,即使设备受到任务/cgroup的限制。 仅在批处理和交互作业中设置。

SLURM_JOB_ID
正在执行作业的作业ID。

SLURM_JOB_LICENSES
请求的任何许可证的名称和数量。

SLURM_JOB_NAME
设置为--job-name选项的值或使用srun创建新作业分配时的命令名称。在仅使用srun创建作业步骤(即在现有作业分配中)时未设置。

SLURM_JOB_NODELIST
分配给作业的节点列表。

SLURM_JOB_NODES
作业资源分配中的节点总数。

SLURM_JOB_PARTITION
作业运行的分区名称。

SLURM_JOB_QOS
作业分配的服务质量(QOS)。

SLURM_JOB_RESERVATION
包含作业分配的高级预留(如果有)。

SLURM_JOB_START_TIME
作业开始时间的UNIX时间戳。

SLURM_JOBID
正在执行作业的作业ID。请参见SLURM_JOB_ID。为了向后兼容而包含。

SLURM_LAUNCH_NODE_IPADDR
发起任务启动的节点的IP地址(srun命令运行的地方)。

SLURM_LOCALID
节点本地任务ID,表示作业中的进程。

SLURM_MEM_BIND_LIST
--mem-bind 映射或掩码列表 (<该节点的ID或掩码列表>)。

SLURM_MEM_BIND_PREFER
--mem-bind 偏好 (prefer)。

SLURM_MEM_BIND_SORT
对空闲缓存页面进行排序(在Intel KNL节点上运行zonesort)。

SLURM_MEM_BIND_TYPE
--mem-bind 类型 (none, rank, map_mem:, mask_mem:)。

SLURM_MEM_BIND_VERBOSE
--mem-bind 详细程度 (quiet, verbose)。

SLURM_NODEID
当前节点的相对节点ID。

SLURM_NPROCS
当前作业或作业步骤中的进程总数。见 SLURM_NTASKS。为了向后兼容而包含。

SLURM_NTASKS
当前作业或作业步骤中的进程总数。

SLURM_OVERCOMMIT
如果指定了 --overcommit,则设置为 1

SLURM_PRIO_PROCESS
作业提交时的调度优先级(nice值)。 该值会传播到生成的进程中。

SLURM_PROCID
当前进程的MPI等级(或相对进程ID)。

SLURM_SRUN_COMM_HOST
srun通信主机的IP地址。

SLURM_SRUN_COMM_PORT
srun通信端口。

SLURM_CONTAINER
作业的OCI包。 仅在指定了 --container 时设置。

SLURM_CONTAINER_ID
作业的OCI ID。 仅在指定了 --container_id 时设置。

SLURM_SHARDS_ON_NODE
此节点上可用于该步骤的GPU分片数量。

SLURM_STEP_GPUS
分配给该步骤的全局GPU ID(不包括批处理和交互步骤)。GPU ID与任何设备cgroup无关,即使设备受到任务/cgroup的限制。

SLURM_STEP_ID
当前作业的步骤ID。

SLURM_STEP_LAUNCHER_PORT
步骤启动器端口。

SLURM_STEP_NODELIST
分配给该步骤的节点列表。

SLURM_STEP_NUM_NODES
分配给该步骤的节点数量。

SLURM_STEP_NUM_TASKS
作业步骤或整个异构作业步骤中的进程数量。

SLURM_STEP_TASKS_PER_NODE
步骤中每个节点的进程数量。

SLURM_STEPID
当前作业的步骤ID。见 SLURM_STEP_ID。为了向后兼容而包含。

SLURM_SUBMIT_DIR
从中调用分配的目录。

SLURM_SUBMIT_HOST
从中调用分配的计算机的主机名。

SLURM_TASK_PID
正在启动的任务的进程ID。

SLURM_TASKS_PER_NODE
每个节点上要启动的任务数量。值用逗号分隔,并且与SLURM_JOB_NODELIST中的顺序相同。 如果两个或多个连续节点要有相同的任务数量,则该数量后面跟随 "(x#)",其中 "#" 是重复计数。例如,"SLURM_TASKS_PER_NODE=2(x3),1" 表示前面三个节点每个将执行两个任务,而第四个节点将执行一个任务。

SLURM_TOPOLOGY_ADDR
仅在系统配置了拓扑/树插件时设置。 该值将设置为可能参与作业通信的网络交换机的名称,从系统的顶级交换机到叶子交换机,最后到节点名称。使用句点分隔每个硬件组件名称。

SLURM_TOPOLOGY_ADDR_PATTERN
仅在系统配置了拓扑/树插件时设置。 该值将设置为在 SLURM_TOPOLOGY_ADDR 中列出的组件类型。 每个组件将被标识为 "switch" 或 "node"。 使用句点分隔每个硬件组件类型。

SLURM_TRES_PER_TASK
设置为 --tres-per-task 的值。如果指定了 --cpus-per-task--gpus-per-task,它也会在 SLURM_TRES_PER_TASK 中设置,就像在 --tres-per-task 中指定的一样。

SLURM_UMASK
作业提交时生效的umask

SLURMD_NODENAME
运行任务的节点名称。在并行作业在多个计算节点上执行的情况下,各个任务将在每个计算节点上设置此环境变量为不同的值。

SRUN_DEBUG
设置为 srun 命令的日志级别。 默认值为3(信息级别)。 该值会根据 --verbose--quiet 选项进行增减。

 

信号和转义序列

发送到 srun 命令的信号会自动转发到它控制的任务,但有一些例外。转义序列 <control-c> 将报告与 srun 命令关联的所有任务的状态。如果在一秒内输入两次 <control-c>,则将向所有任务发送相关的SIGINT信号,并进入终止序列,向所有生成的任务发送SIGCONT、SIGTERM和SIGKILL。如果收到第三个 <control-c>,则srun程序将被终止,而不等待远程任务退出或其I/O完成。

转义序列 <control-z> 目前被忽略。

 

MPI支持

MPI的使用取决于所使用的MPI类型。 这些不同的MPI实现使用三种根本不同的操作模式。

1. Slurm直接启动任务并通过PMI2或PMIx API进行通信初始化。 例如:"srun -n16 a.out"。

2. Slurm为作业创建资源分配,然后mpirun使用Slurm的基础设施启动任务(OpenMPI)。

3. Slurm为作业创建资源分配,然后mpirun使用除Slurm以外的某种机制启动任务,例如SSH或RSH。 这些任务是在Slurm的监控或控制之外启动的。建议配置Slurm的epilog以在作业的分配被放弃时清除这些任务,或者强烈建议使用pam_slurm_adopt。

有关使用这些不同MPI实现与Slurm的更多信息,请参见https://slurm.schedmd.com/mpi_guide.html

 

多个程序配置

配置文件中的注释必须在第一列有一个 "#"。 配置文件包含以下由空格分隔的字段:

任务等级
一个或多个任务等级以使用此配置。 多个值可以用逗号分隔。 范围可以用两个数字表示,中间用 '-' 分隔,较小的数字在前(例如 "0-4" 而不是 "4-0")。 要表示所有未另行指定的任务,请在文件的最后一行指定等级为 '*'。 如果尝试启动未定义可执行程序的任务,将产生以下错误消息 "未为该任务指定可执行程序"。

可执行文件
要执行的程序名称。 如果需要,可以是完全合格的路径名。

参数
程序参数。 表达式 "%t" 将被替换为任务的编号。 表达式 "%o" 将被替换为该范围内任务的偏移量(例如,配置的任务等级值为 "1-5" 将具有偏移值 "0-4")。 可以使用单引号避免将括起来的值解释为变量。 此字段是可选的。 在命令行输入的任何程序参数将被添加到配置文件中指定的参数中。

例如:

$ cat silly.conf
###################################################################
# srun多个程序配置文件
#
# srun -n8 -l --multi-prog silly.conf
###################################################################
4-6       hostname
1,7       echo  task:%t
0,2-3     echo  offset:%o

$ srun -n8 -l --multi-prog silly.conf
0: offset:0
1: task:1
2: offset:1
3: offset:2
4: linux15.llnl.gov
5: linux16.llnl.gov
6: linux17.llnl.gov
7: task:7

 

示例

示例 1:
这个简单的示例演示了在八个任务中执行命令 hostname。 将为作业分配至少八个处理器(与任务数量相同),并根据需要在多个节点上满足请求。每个任务的输出将以其任务编号开头。 (下面示例中的机器 "dev" 每个节点有两个CPU)
$ srun -n8 -l hostname
0: dev0
1: dev0
2: dev1
3: dev1
4: dev2
5: dev2
6: dev3
7: dev3

示例 2:
srun -r 选项在作业脚本中用于在以下示例中在不重叠的节点上运行两个作业步骤。该脚本在这种情况下以分配模式运行,而不是作为批处理作业。
$ cat test.sh
#!/bin/sh
echo $SLURM_JOB_NODELIST
srun -lN2 -r2 hostname
srun -lN2 hostname

$ salloc -N4 test.sh
dev[7-10]
0: dev9
1: dev10
0: dev7
1: dev8

示例 3:
以下脚本在分配的节点集内并行运行两个作业步骤。
$ cat test.sh
#!/bin/bash
srun -lN2 -n4 -r 2 sleep 60 &
srun -lN2 -r 0 sleep 60 &
sleep 1
squeue
squeue -s
wait

$ salloc -N4 test.sh
  JOBID PARTITION     NAME     USER  ST      TIME  NODES NODELIST
  65641     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]

示例 4:
这个示例演示了如何执行一个简单的MPI作业。 我们使用 srun 构建一个机器(节点)列表,以便 mpirun 使用其所需的格式。以下是示例命令行和要执行的脚本。
$ cat test.sh
#!/bin/sh
MACHINEFILE="nodes.$SLURM_JOB_ID"

# 为mpi生成Machinefile,以便主机的顺序与通过srun运行时相同
#
srun -l /bin/hostname | sort -n | awk '{print $2}' > $MACHINEFILE

# 使用生成的Machine文件运行:
mpirun -np $SLURM_NTASKS -machinefile $MACHINEFILE mpi-app

rm $MACHINEFILE

$ salloc -N2 -n4 test.sh

示例 5:
这个简单的示例演示了在同一个srun中在不同节点上执行不同的作业。您可以对任意数量的节点或任意数量的作业执行此操作。可执行文件放置在由SLURM_NODEID环境变量指定的节点上。从0开始,到srun命令行上指定的数量。
$ cat test.sh
case $SLURM_NODEID in
    0) echo "我正在运行在 "
       hostname ;;
    1) hostname
       echo "是我正在运行的地方" ;;
esac

$ srun -N2 test.sh
dev0
是我正在运行的地方
我正在运行在
dev1

示例 6:
这个示例演示了使用多核选项来控制任务布局。 我们请求每个节点分配四个插槽和每个插槽两个核心。
$ srun -N2 -B 4-4:2-2 a.out

示例 7:
这个示例展示了一个脚本,其中Slurm用于提供作业的资源管理,通过在处理器可用时执行各种作业步骤。
$ cat my.script
#!/bin/bash
srun -n4 prog1 &
srun -n3 prog2 &
srun -n1 prog3 &
srun -n1 prog4 &
wait

示例 8:
这个示例展示了如何启动一个名为 "server" 的应用程序,使用一个任务、8个CPU和16GB内存(每个CPU 2GB),以及另一个名为 "client" 的应用程序,使用16个任务、每个任务1个CPU(默认)和每个任务1GB内存。
$ srun -n1 -c8 --mem-per-cpu=2gb server : -n16 --mem-per-cpu=1gb client

示例 9:
这个示例强调了在作业分配内部运行时,srun的 --exclusive--overlap 标志的行为差异。 --overlap 标志允许两个步骤同时启动。 --exclusive 标志使第二个步骤等待第一个步骤完成。
$ salloc  -n1
salloc: 授予作业分配 9553
salloc: 等待资源配置
salloc: 节点 node01 已准备好作业

$ date +%T; srun -n1 --overlap -l sleep 3 &
$ srun -n1 --overlap -l date +%T &
14:36:04
[1] 144341
[2] 144342
0: 14:36:04
[2]+  完成                    srun -n1 --overlap -l date +%T
[1]+  完成                    srun -n1 --overlap -l sleep 3

$ date +%T; srun -n1 --exclusive -l sleep 3 &
$ srun -n1 --exclusive -l date +%T &
14:36:17
[1] 144429
[2] 144430
srun: 作业 9553 步骤创建暂时禁用,重试(请求的节点忙)
srun: 为作业 9553 创建步骤
0: 14:36:20
[1]-  完成                    srun -n1 --exclusive -l sleep 3
[2]+  完成                    srun -n1 --exclusive -l date +%T

示例 10:
这个示例演示了在多个节点之间不均匀分配的作业可能会遇到的问题,当有足够的CPU空闲以在单个节点上运行该任务时,任务无法启动。这个示例显示了一个作业在一个节点上分配了2个CPU,而在另一个节点上分配了24个CPU。
$ echo $SLURM_NODELIST; echo $SLURM_JOB_CPUS_PER_NODE
node[01-02]
2,24

如果启动的任务占用了CPU较少的节点上的CPU,则后续任务应该能够在另一个节点上启动,但由于它继承了作业分配的节点数量要求,因此不会启动。作业步骤将保持挂起,直到第一个作业步骤完成或被取消。

$ srun -n4 --exact sleep 1800 &
[1] 151837

$ srun -n2 --exact hostname
^Csrun: 使用信号2取消挂起的作业步骤
srun: 错误: 无法为作业2677创建步骤:作业/步骤已完成或正在完成

如果作业步骤启动,明确请求单个节点,则该步骤能够运行。

$ srun -n2 -N1 --exact hostname
node02
node02

通过将 SelectTypeParameters=CR_Pack_Nodes 添加到您的slurm.conf,可以更改此行为。打包节点的逻辑将允许作业步骤在单个节点上启动,而无需明确请求单个节点。

示例 11:
这个示例演示了将 --exclusive 标志添加到作业分配请求可能会根据您是否还请求特定数量的任务而产生不同的结果。

请求独占访问而没有额外要求将允许进程访问分配节点上的所有CPU。

$ srun -l --exclusive  bash -c 'grep Cpus_allowed_list /proc/self/status'
0: Cpus_allowed_list:   0-23

添加对特定数量任务的请求将导致每个任务只能访问单个CPU。

$ srun -l --exclusive -n2 bash -c 'grep Cpus_allowed_list /proc/self/status'
0: Cpus_allowed_list:   0
1: Cpus_allowed_list:   12

如果您希望给任务访问多个CPU,可以定义每个任务的CPU数量。

$ srun -l --exclusive -n2 --cpus-per-task=12 bash -c 'grep Cpus_allowed_list /proc/self/status'
0: Cpus_allowed_list:   0-5,12-17
1: Cpus_allowed_list:   6-11,18-23

 

版权

版权 (C) 2006-2007 加州大学董事会。 在劳伦斯利弗莫尔国家实验室制作(参见免责声明)。
版权 (C) 2008-2010 劳伦斯利弗莫尔国家安全。
版权 (C) 2010-2022 SchedMD LLC。

此文件是Slurm资源管理程序的一部分。 有关详细信息,请参见 <https://slurm.schedmd.com/>。

Slurm是自由软件;您可以根据自由软件基金会发布的GNU通用公共许可证的条款重新分发和/或修改它;许可证的第2版,或(根据您的选择)任何更高版本。

Slurm的分发是希望它会有用,但不提供任何担保;甚至没有对适销性或特定用途的隐含担保。有关更多详细信息,请参见GNU通用公共许可证。

 

另见

salloc(1), sattach(1), sbatch(1), sbcast(1), scancel(1), scontrol(1), squeue(1), slurm.conf(5), sched_setaffinity (2), numa (3) getrlimit (2)


 

索引

名称
概要
描述
返回值
可执行路径解析
选项
性能
输入环境变量
输出环境变量
信号和转义序列
MPI支持
多个程序配置
示例
版权
另见

此文档由 man2html 使用手册页创建。
时间:2025年7月2日 13:21:56 GMT