Slurm 基于内存的调度 - Amazon ParallelCluster
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Slurm 基于内存的调度

从版本 3.2.0 开始,Amazon ParallelCluster 通过 SlurmSettings/EnableMemoryBasedScheduling 集群配置参数支持 Slurm 基于内存的调度。

注意

从 Amazon ParallelCluster 版本 3.7.0 开始,如果您在 Instances 中配置多种实例类型,则可以启用 EnableMemoryBasedScheduling

对于 Amazon ParallelCluster 版本 3.2.0 至 3.6.x,如果您在 Instances 中配置多种实例类型,则无法启用 EnableMemoryBasedScheduling

警告

当您在启用了 EnableMemoryBasedScheduling 的 Slurm 队列计算资源中指定多个实例类型时,RealMemory 值将是提供给所有实例类型的最小内存量。如果您指定的实例类型具有截然不同的内存容量,则可能会导致大量未使用的内存。

使用 EnableMemoryBasedScheduling: true,Slurm 调度器可以跟踪每个作业在每个节点上所需的内存量。然后,Slurm 调度器将使用此信息在同一个计算节点上调度多个作业。作业在节点上所需的内存总量不能大于可用的节点内存。调度器可防止作业使用的内存超过提交作业时请求的内存。

使用 EnableMemoryBasedScheduling: false,作业可能会争夺共享节点上的内存并导致作业失败和 out-of-memory 事件。

警告

Slurm 对其标签使用 2 的幂表示法,例如 MB 或 GB。将这些标签分别读作 MiB 和 GiB。

Slurm 配置和基于内存的调度

使用 EnableMemoryBasedScheduling: true,Slurm 设置以下 Slurm 配置参数:

注意

设置这两个选项后,有几个其他 Slurm 配置参数可能会影响 Slurm 调度器和资源管理器的行为。有关更多信息,请参阅 Slurm 文档

Slurm 调度器和基于内存的调度

EnableMemoryBasedScheduling: false(默认值)

默认情况下,EnableMemoryBasedScheduling 设置为 false。当为 false 时,Slurm 不将内存作为资源包含在其调度算法中,也不会跟踪作业使用的内存。用户可以指定 --mem MEM_PER_NODE 选项来设置作业所需的每个节点的最小内存量。这会强制调度器在调度作业时选择 RealMemory 值至少为 MEM_PER_NODE 的节点。

例如,假设用户提交了两个使用 --mem=5GB 的作业。如果请求的资源(例如 CPU 或 GPU)可用,则这些作业可以在内存为 8 GiB 的节点上同时运行。不会调度这两个作业在 RealMemory 小于 5 GiB 的计算节点上运行。

警告

当禁用了基于内存的调度时,Slurm 不会跟踪作业使用的内存量。在同一节点上运行的作业可能会争夺内存资源并导致其他作业失败。

在禁用基于内存的调度时,我们建议用户不要指定 --mem-per-cpu--mem-per-gpu 选项。这些选项可能会导致与 Slurm 文档中描述的行为不同的行为。

EnableMemoryBasedScheduling: true

EnableMemoryBasedScheduling 设置为 true 时,Slurm 将会跟踪每个作业的内存使用情况,并防止作业使用的内存超过通过 --mem 提交选项请求的内存量。

在上面的示例中,用户提交了两个使用 --mem=5GB 的作业。这些作业无法在内存为 8 GiB 的节点上同时运行。这是因为所需的总内存量大于节点上可用的内存量。

在启用基于内存的调度后,--mem-per-cpu--mem-per-gpu 的行为将与 Slurm 文档中描述的行为一致。例如,使用 --ntasks-per-node=2 -c 1 --mem-per-cpu=2GB 提交作业。在这种情况下,Slurm 将为每个节点分配总计 4 GiB 的作业。

警告

启用基于内存的调度后,我们建议用户在提交作业时包含 --mem 规范。对于 Amazon ParallelCluster 附带的默认 Slurm 配置,如果未包含任何内存选项(--mem--mem-per-cpu--mem-per-gpu),Slurm 会将所分配节点的整个内存分配给作业,即使作业仅需要一部分其他资源(如 CPU 或 GPU)时也是如此。这可在作业完成之前有效地防止节点共享,因为没有内存可用于其他作业。之所以发生这种情况,是因为在提交作业时,如果未提供内存规范,Slurm 会将作业的每个节点的内存设置为 DefMemPerNode。此参数的默认值为 0,指定的是对节点内存进行无限制访问。

如果同一个队列中存在多种具有不同内存量的计算资源,则在不同的节点上可能会为不带内存选项的已提交作业分配不同的内存量。这取决于调度器为作业提供了哪些节点。用户可以在集群或分区级别在 Slurm 配置文件中为选项(如 DefMemPerNodeDefMemPerCPU)定义自定义值,以防止出现这种行为。

SlurmRealMemory 和 Amazon ParallelCluster SchedulableMemory

使用 Amazon ParallelCluster 附带的 Slurm 配置时,Slurm 会将 RealMemory 解释为可供作业使用的每节点内存量。从版本 3.2.0 开始,默认情况下,Amazon ParallelCluster 会将 RealMemory 设置为 Amazon EC2 实例类型中所列并由 Amazon EC2 API DescribeInstanceTypes 返回的内存的 95%。

禁用基于内存的调度后,当用户提交指定了 --mem 的作业时,Slurm 调度器会使用 RealMemory 来筛选节点。

启用基于内存的调度后,Slurm 调度器会将 RealMemory 解释为计算节点上运行的作业可用的最大内存量。

默认设置可能不是所有实例类型的最佳设置:

  • 此设置可能高于节点实际可以访问的内存量。当计算节点是小型实例类型时,可能会发生这种情况。

  • 此设置可能低于节点实际可以访问的内存量。当计算节点是大型实例类型时,可能会发生这种情况,并可能导致大量未使用的内存。

您可以使用 SlurmQueues/ComputeResources/SchedulableMemory 微调 Amazon ParallelCluster 为计算节点配置的 RealMemory 值。要覆盖默认值,请针对您的集群配置专门为 SchedulableMemory 定义一个自定义值。

要检查计算节点的实际可用内存,请在该节点上运行 /opt/slurm/sbin/slurmd -C 命令。此命令可返回节点的硬件配置,包括 RealMemory 值。有关更多信息,请参阅slurmd -C

确保计算节点的操作系统进程有足够的内存。为此,请将 SchedulableMemory 值设置为低于 slurmd -C 命令返回的 RealMemory 值,从而限制作业可用的内存。