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 插件的分析类型的采样间隔。可以指定多个 以逗号分隔的 <数据类型>=<间隔> 对。支持的 数据类型 值包括:
任务采样间隔的默认值为 30 秒。
所有其他间隔的默认值为 0。
间隔为 0 将禁用指定类型的采样。
如果任务采样间隔为 0,则仅在作业终止时收集计费
信息(减少 Slurm 对作业的干扰)。
较小(非零)值对作业性能的影响更大,
但对于任务少于 10,000 的应用程序,30 秒的值不太可能被注意到。此选项适用于作业
分配。
https://slurm.schedmd.com/burst_buffer.html
https://slurm.schedmd.com/burst_buffer.html
--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 的组合在该年份已经过去,在这种情况下使用下一年。
此选项适用于作业分配。
注意:可更改特性是由 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 时,
约束值只能包含单个特性名称。当前不支持其他运算符用于作业步骤。
此选项适用于作业和步骤分配。
注意:此选项仅适用于 topology/flat 插件。 其他拓扑插件会修改节点顺序,导致此选项无法生效。此选项适用于作业分配。
注意:显式设置作业的专用核心值隐式设置 --exclusive 选项。
注意:如果未指定 -n,此选项可能会隐式影响任务的数量。
此选项适用于作业分配。
使用 --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 值,则将使用该模式。 否则,将执行自动绑定,如下所述。
-
支持的选项包括:
-
- 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 的帮助信息
-
-
- 此选项适用于作业和步骤分配。
请求此 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 或特定治理者的情况下指定范围。
目前可接受的值包括:
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 可能导致作业运行过快,以至于计费无法轮询作业信息。因此,并非所有计费信息都将存在。
此选项适用于作业和步骤分配。
此选项适用于作业和步骤分配。
警告:有些配置和选项在作业和作业步骤请求中被不同解释,这可能导致此选项的不一致。例如srun -c2 --threads-per-core=1 prog可能会为作业分配两个核心,但如果每个核心包含两个线程,则作业分配将包括四个CPU。作业步骤分配将为每个CPU启动两个线程,总共两个任务。
警告:当srun在salloc或sbatch中执行时,有些配置和选项可能导致不一致的分配,当-c的值大于salloc或sbatch中的-c时。
注意:如果--mem-per-cpu也被指定,则如果超过MaxMemPerCPU,分配的CPU数量可以增加。如果未指定-n,任务数量可能会高于预期。
此选项适用于作业和步骤分配。
有效的时间格式为:
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]]
此选项仅适用于作业分配。
此选项仅适用于作业分配。
-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。
指定远程进程的替代分配方法。 对于作业分配,这将设置环境变量,这些变量将被后续的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命令在现有作业分配中的作业步骤的任务布局。
注意:如果给出了任务数量并且还给出了请求的节点列表,则如果列表中的节点数量大于任务数量,将减少从该列表中使用的节点数量以匹配任务数量。 - 任意分配方法将按照环境变量SLURM_HOSTFILE指定的文件中的顺序分配进程。如果列出了此变量,它将覆盖任何指定的其他方法。如果未设置,则方法默认为块。 主机文件必须至少包含请求的主机数量,并且每行一个或用逗号分隔。如果指定任务计数(-n, --ntasks=<number>),您的任务将在节点上按文件顺序布局。
-
第二个分配方法(CPU在插槽之间的分配以进行绑定):
- *
-
- 使用默认方法在插槽之间分配CPU(循环)。
-
- block
-
- 块分配方法将连续分配的CPU从同一插槽分配给任务,然后使用下一个连续插槽。
-
- cyclic
-
- 循环分配方法将为给定任务连续分配从同一插槽分配的CPU,并为下一个任务从下一个连续插槽分配,以在插槽之间以轮询方式进行分配。 需要多个CPU的任务将尽可能在单个插槽上分配所有这些CPU。
注意:在启用超线程的节点中,不请求完整核心的任务可能会在插槽之间分配。可以通过指定--ntasks-per-core=1来避免这种情况,这会强制任务分配完整的核心。 - 循环分配方法将为给定任务连续分配从同一插槽分配的CPU,并为下一个任务从下一个连续插槽分配,以在插槽之间以轮询方式进行分配。 需要多个CPU的任务将尽可能在单个插槽上分配所有这些CPU。
-
- fcyclic
-
- fcyclic分配方法将为任务绑定从连续插槽分配的CPU以轮询方式在插槽之间进行分配。 需要多个CPU的任务将以循环方式在插槽之间分配每个CPU。
-
第三个分配方法(CPU在核心之间的分配以进行绑定):
- *
-
- 使用默认方法在核心之间分配CPU(继承自第二个分配方法)。
-
- block
-
- 块分配方法将连续分配的CPU从同一核心分配给任务,然后使用下一个连续核心。
-
- cyclic
-
- 循环分配方法将为给定任务连续分配从同一核心分配的CPU,并为下一个任务从下一个连续核心分配,以在核心之间以轮询方式进行分配。
-
- fcyclic
-
- fcyclic分配方法将为任务绑定从连续核心分配的CPU以轮询方式在核心之间进行分配。
-
对节点上任务分配的可选控制:
- Pack
-
- 而不是将作业步骤的任务均匀分配到其分配的节点上,将它们尽可能紧密地打包在节点上。 这仅在使用“块”任务分配方法时适用。
-
- NoPack
-
- 而不是将作业步骤的任务尽可能紧密地打包在节点上,均匀分配它们。 此用户选项将优先于SelectTypeParameters CR_Pack_Nodes配置参数。
-
- 此选项适用于作业和步骤分配。
注意:并行步骤将在请求的步骤资源可用之前被阻塞或拒绝,除非指定--overlap。作业资源可以在srun命令完成后保持,而Slurm会进行作业清理。步骤epilog和/或SPANK插件可能会进一步延迟步骤资源的释放。
当用于启动作业时,作业分配不能与其他正在运行的作业共享节点(或拓扑段与“=topo”)。如果未指定用户/mcs/topo(即作业分配不能与其他正在运行的作业共享节点),则作业分配在分配中的所有节点上分配所有CPU和GRES,但仅分配请求的内存。这是为了支持帮派调度,因为挂起的作业仍然驻留在内存中。要请求节点上的所有内存,请使用--mem=0。 默认的共享/独占行为取决于系统配置,分区的OverSubscribe选项优先于作业的选项。 注意:由于共享GRES(MPS)不能与共享GRES(GPU)同时分配,因此此选项仅分配所有共享GRES,而不分配任何底层共享GRES。
此选项也可以在现有资源分配中启动多个作业步骤时使用(默认),您希望为每个作业步骤专用处理器。作业步骤仅分配请求的GRES。如果没有足够的处理器可用于启动作业步骤,则将推迟。可以将其视为为作业在其分配内提供资源管理机制(隐含--exact)。 CPU的独占分配默认适用于作业步骤,但--exact不是默认值。换句话说,默认行为是:作业步骤不会共享CPU,但作业步骤将在分配给步骤的所有节点上分配所有可用CPU。
为了共享资源,请使用--overlap选项。
注意:此选项与--oversubscribe互斥。
请参见下面的示例。
-
- --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
- 在此示例中,传播的环境将仅包含来自用户环境的变量EDITOR、SLURM_*环境变量和ARG1=test。
-
- 示例:--export=ALL,EDITOR=/bin/emacs
- 此示例有两个可能的结果。如果调用者定义了EDITOR环境变量,则作业的环境将从调用者的环境继承该变量。如果调用者没有为EDITOR定义环境变量,则作业的环境将使用--export给定的值。
-
选项如--ntasks-per-*、--mem*、--cpus*、--tres*、--gres*将被忽略。
这用于需要自己启动器的MPI实现。 这将启动一个步骤,访问所有资源,并随后生成任何数量的用户进程,这些进程可以访问所有这些资源。
在此特殊步骤内的资源使用仍将被计入,如果启用了计费插件。此特殊步骤可以与任何其他步骤重叠。
注意:此选项不打算直接使用。
如果启用SchedulerParameters=extra_constraints,则此字符串用于根据每个节点的Extra字段进行节点过滤。
注意:这些选项不指定资源分配大小。 每个指定的值被视为最小值。 可以使用星号(*)作为占位符,表示要利用该类型的所有可用资源。值也可以指定为最小-最大。各个级别也可以在单独的选项中指定:
--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将隐式计算任务数量为每个线程一个任务。
支持的value定义:
注意:分配必须在每个节点上至少包含一个GPU,或者如果使用类型,则每个节点上必须包含每种GPU类型之一。如果不同节点需要不同的GPU类型,请使用异构作业。
-
- allow-task-sharing
-
- 允许任务访问作业分配中与任务位于同一节点上的每个GPU。这在使用--gpu-bind或--tres-bind=gres/gpu将GPU绑定到特定任务时很有用,但也希望在任务之间进行GPU通信。
注意:此选项特定于srun。 - 允许任务访问作业分配中与任务位于同一节点上的每个GPU。这在使用--gpu-bind或--tres-bind=gres/gpu将GPU绑定到特定任务时很有用,但也希望在任务之间进行GPU通信。
-
- 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,则此选项可能会产生未定义的结果。 - 作业可用的唯一CPU将是绑定到所选GRES的那些(即在gres.conf文件中标识的CPU将被严格执行)。此选项可能导致作业启动延迟。 例如,要求两个GPU和一个CPU的作业将被延迟,直到单个插槽上的两个GPU可用,而不是使用绑定到不同插槽的GPU,但是,由于改善了通信速度,应用程序性能可能会提高。 要求节点配置有多个插槽,并且将按插槽执行资源过滤。
-
- one-task-per-sharing
-
- 不允许不同任务从同一共享GRES中分配共享GRES。
注意:仅当使用--tres-per-task请求共享GRES时,此标志才会被强制执行。
注意:此选项可以在SelectTypeParameters=ONE_TASK_PER_SHARING_GRES中默认设置。
注意:此选项特定于SelectTypeParameters=MULTIPLE_SHARING_GRES_PJ - 不允许不同任务从同一共享GRES中分配共享GRES。
注意:此选项暗示某些相关选项的特定值,这会阻止与任何用户指定的值一起使用--ntasks-per-core、--threads-per-core、--cpu-bind(除--cpu-bind=verbose外)或-B。 这些冲突选项将在作为命令行参数指定时覆盖--hint。如果冲突选项作为环境变量指定,则命令行参数中的--hint将优先。
注意:在提交异构作业时,许可证请求只能在第一个组件作业上进行。 例如 "srun -L ansys:2 : myexecutable"。
注意:如果许可证在 AccountingStorageTres 中被跟踪并且使用了 OR,ReqTRES 将显示所有请求的 tres,以逗号分隔。AllocTRES 将仅显示分配给作业的许可证。
注意:当作业请求 OR 的许可证时,Slurm 将尝试按请求的顺序分配许可证。此指定顺序将优先于即使其余请求的许可证可以在请求的保留上满足的情况。这也适用于配置了 SchedulerParameters=bf_licenses 的回填计划。
注意:指定零的内存大小被视为特殊情况,并授予作业访问每个节点上所有内存的权限,以供新提交的作业使用,以及所有可用作业内存供新作业步骤使用。
注意:每个 slurmstepd 进程使用的内存包含在作业的总内存使用中。它通常消耗 20MiB 到 200MiB 之间的内存,尽管这可能会根据系统配置和任何加载的插件而有所不同。
注意:除非 Slurm 配置为使用强制机制,否则内存请求将不会严格执行。有关更多详细信息,请参阅 cgroup.conf(5)手册页中的 ConstrainRAMSpace 和 slurm.conf(5)手册页中的 OverMemoryKill。
此选项适用于作业和步骤分配。
注意:要让 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 节点。 - 优先使用第一个指定的 NUMA 节点,但允许
-
- q[uiet]
-
- 在任务运行之前安静地绑定(默认)
-
- rank
-
- 按任务排名进行绑定(不推荐)
-
- sort
-
- 对空闲缓存页面进行排序(在 Intel KNL 节点上运行 zonesort)
-
- v[erbose]
-
- 详细报告任务运行前的绑定
-
- 此选项适用于作业和步骤分配。
注意:如果作业请求的最终内存量无法满足分区中配置的任何节点,则该作业将被拒绝。 这可能发生在作业分配中使用 --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
-
- 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"。
- 启用 PMIx 支持(https://pmix.github.io). Slurm 中的 PMIx 支持可用于启动并行应用程序(例如 MPI),如果它支持 PMIx、PMI2 或 PMI1。Slurm 必须通过将 "--with-pmix=<PMIx installation path>" 选项传递给其 "./configure" 脚本来配置 PMIx 支持。
-
- none
-
- 没有特殊的 MPI 处理。这是默认值,并与许多其他版本的 MPI 一起使用。
-
- 此选项适用于步骤分配。
在所有情况下,作业分配请求 必须指定 --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 数量。
可以请求的资源包括:
此选项适用于作业和步骤分配。
指定可选参数 "off" 以禁用 SLURM_NO_KILL 环境变量的效果。
默认操作是在节点失败时终止作业。
注意:此选项不能与任意分配一起使用。
注意:在使用 SelectType=select/linear 时不支持此选项。此值不能大于 --threads-per-core。
请参见下面的 示例。
如果命令行上未同时指定 --error,则 stdout 和 stderr 都将定向到 --output 指定的文件。此选项适用于作业和步骤分配。
当应用于作业分配(不包括请求独占访问节点的作业)时,资源的分配方式就像只请求每个节点一个任务。这意味着每个任务请求的 CPU 数量(-c, --cpus-per-task)是在每个节点上分配,而不是乘以任务数量。用于指定每个节点、插槽、核心等的任务数量的选项将被忽略。
当应用于作业步骤分配时(在现有作业分配中执行 srun 命令),此选项可用于在每个 CPU 上启动多个任务。 通常,srun 不会在每个 CPU 上分配超过一个进程。 通过指定 --overcommit,您明确允许每个 CPU 上有多个进程。但是,每个节点上允许执行的任务数量不得超过 MAX_TASKS_PER_NODE。注意:MAX_TASKS_PER_NODE 在文件 slurm.h 中定义,并不是变量,它在 Slurm 构建时设置。
slurm_link" id="OPT_overlap" href="#OPT_overlap">
默认情况下,步骤不会与其他并行步骤共享资源。此选项适用于步骤分配。
注意:此选项与 --exclusive 是互斥的。
有效的 type 值包括:
注意:请求的节点数必须始终能够被请求的段大小整除。
注意:段大小必须小于或等于计划的基本块大小。例如,对于基本块大小为 30 节点的系统,"--segment 40" 将无效。
slurmd 调试信息被复制到作业的 stderr 中。默认情况下,仅显示错误。此选项适用于作业和步骤分配。
注意:如果未指定 -n,此选项可能会隐式影响任务数量。
注意:显式设置作业的专用线程值隐式设置其 --exclusive 选项,为作业保留整个节点。
注意:如果未指定 -n,此选项可能会隐式影响任务数量。
时间限制为零请求不施加时间限制。可接受的时间格式包括 "分钟"、"分钟:秒"、"小时:分钟:秒"、"天-小时"、"天-小时:分钟" 和 "天-小时:分钟:秒"。此选项适用于作业和步骤分配。
示例: --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。
计数可以有后缀
"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。
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 执行的节点上。
在百分号字符和格式说明符之间放置的数字可以用于在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)
索引
此文档由 man2html 使用手册页创建。
时间:2025年7月2日 13:21:56 GMT