你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Slurm

Slurm 是高度可配置开放源代码工作负荷管理器。 有关概述,请参阅 Slurm 项目网站

注意

从 CycleCloud 8.4.0 开始,Slurm 集成已重写,以支持新的特性和功能。 有关详细信息,请参阅 Slurm 3.0 文档。

可以通过修改群集定义的配置部分中的“run_list”,在 CycleCloud 群集上轻松启用 Slurm。 Slurm 群集的两个基本组件是“master” (或“scheduler”) 节点(提供运行 Slurm 软件的共享文件系统)和“execute”节点(这些节点是装载共享文件系统和执行提交的作业的主机)。 例如,简单的群集模板代码片段可能如下所示:

[cluster custom-slurm]

[[node master]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A4 # 8 cores

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:master]]]
    [[[configuration]]]
    run_list = role[slurm_master_role]

[[nodearray execute]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A1  # 1 core

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:execute]]]
    [[[configuration]]]
    run_list = role[slurm_master_role]
    slurm.autoscale = true
    # Set to true if nodes are used for tightly-coupled multi-node jobs
    slurm.hpc = true
    slurm.default_partition = true

可以通过修改群集定义的配置部分中的“run_list”,在 CycleCloud 群集上轻松启用 Slurm。 Slurm 群集的两个基本组件是“scheduler”节点,该节点提供运行 Slurm 软件的共享文件系统,以及“执行”节点(装载共享文件系统和执行提交的作业的主机)。 例如,简单的群集模板代码片段可能如下所示:

[cluster custom-slurm]

[[node scheduler]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A4 # 8 cores

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:scheduler]]]
    [[[configuration]]]
    run_list = role[slurm_scheduler_role]

[[nodearray execute]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A1  # 1 core

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:execute]]]
    [[[configuration]]]
    run_list = role[slurm_scheduler_role]
    slurm.autoscale = true
    # Set to true if nodes are used for tightly-coupled multi-node jobs
    slurm.hpc = true
    slurm.default_partition = true

编辑现有 Slurm 群集

在 CycleCloud 版本 7.8 及更高版本中运行的 Slurm 群集实现自动缩放 API 的更新版本,允许群集利用多个节点数组和分区。 为了在 Slurm 中促进此功能,CycleCloud 预先填充了群集中的执行节点。 因此,在对群集进行任何更改(例如自动缩放限制或 VM 类型)后,需要在 Slurm 计划程序节点上运行命令。

更改群集

CycleCloud 中部署的 Slurm 群集包含一个有助于实现此情况的脚本。 对群集进行任何更改后,以根 (运行以下命令,例如,在 Slurm 计划程序节点上运行 sudo -i) 以重新生成 slurm.conf 并更新群集中的节点:

/opt/cycle/slurm/cyclecloud_slurm.sh remove_nodes
/opt/cycle/slurm/cyclecloud_slurm.sh scale

注意

对于 CycleCloud 版本 < 7.9.10, cyclecloud_slurm.sh 脚本位于 /opt/cycle/jetpack/system/bootstrap/slurm 中

重要

如果所做的任何更改会影响 MPI 分区 (节点的 VM,例如 VM 大小、映像或 cloud-init) , 则必须 首先终止所有节点。 在这种情况下, 命令 remove_nodes 会输出警告,但它不会退出并显示错误。 如果存在正在运行的节点,则会出现启动新节点时的错误 This node does not match existing scaleset attribute

/opt/cycle/slurm/cyclecloud_slurm.sh apply_changes

注意

对于 CycleCloud 版本 < 8.2, cyclecloud_slurm.sh 脚本位于 /opt/cycle/jetpack/system/bootstrap/slurm 中

如果所做的更改会影响 MPI 分区 (中节点的 VM,例如 VM 大小、映像或 cloud-init) ,并且节点正在运行,则会出现启动新节点时的错误 This node does not match existing scaleset attribute 。 因此,该 apply_changes 命令确保节点已终止,否则会失败并显示以下错误消息: 在应用更改之前,以下节点必须完全终止

如果要进行不影响 MPI 节点的 VM 属性的更改,则无需先终止正在运行的节点。 在这种情况下,可以使用以下两个命令进行更改:

/opt/cycle/slurm/cyclecloud_slurm.sh remove_nodes
/opt/cycle/slurm/cyclecloud_slurm.sh scale

注意

命令 apply_changes 仅存在于 CycleCloud 8.3+中,因此在早期版本中进行更改的唯一方法是使用上述 remove_nodes + scale 命令。 确保命令 remove_nodes 不会打印有关需要终止的节点的警告。

创建其他分区

Azure CycleCloud 附带的默认模板有两个分区 (hpchtc) ,你可以定义直接映射到 Slurm 分区的自定义节点数组。 例如,若要创建 GPU 分区,请将以下部分添加到群集模板:

    [[nodearray gpu]]
    MachineType = $GPUMachineType
    ImageName = $GPUImageName
    MaxCoreCount = $MaxGPUExecuteCoreCount
    Interruptible = $GPUUseLowPrio
    AdditionalClusterInitSpecs = $ExecuteClusterInitSpecs

        [[[configuration]]]
        slurm.autoscale = true
        # Set to true if nodes are used for tightly-coupled multi-node jobs
        slurm.hpc = false

        [[[cluster-init cyclecloud/slurm:execute:2.0.1]]]
        [[[network-interface eth0]]]
        AssociatePublicIpAddress = $ExecuteNodesPublic

内存设置

CycleCloud 自动设置 Slurm 用于计划目的的可用内存量。 由于 Linux 内核选项不同,可用内存量可能会略有变化,并且 OS 和 VM 可能会用尽本来可用于作业的少量内存,因此 CycleCloud 会自动减少 Slurm 配置中的内存量。 默认情况下,CycleCloud 保留 VM 中报告的可用内存的 5%,但可以通过将 设置为 slurm.dampen_memory 要保留的内存百分比,在群集模板中重写此值。 例如,若要保留 VM 内存的 20%,请执行以下操作:

    slurm.dampen_memory=20

禁用特定节点或分区的自动缩放

虽然内置的 CycleCloud“KeepAlive”功能目前不适用于 Slurm 群集,但可以通过直接编辑 slurm.conf 文件来禁用正在运行的 Slurm 群集的自动缩放。 可以从自动缩放中排除单个节点或整个分区。

排除节点

若要从自动缩放中排除一个或多个节点,请将 添加到 SuspendExcNodes=<listofnodes> Slurm 配置文件。 例如,若要从 hpc 分区中排除节点 1 和 2,请将以下内容添加到 /sched/slurm.conf

SuspendExcNodes=hpc-pg0-[1-2]

然后重启服务, slurmctld 使新配置生效。

排除分区

从自动缩放中排除整个分区类似于排除节点。 若要排除整个 hpc 分区,请将以下内容添加到 /sched/slurm.conf

SuspendExcParts=hpc

然后重启 slurmctld 服务。

疑难解答

Slurm 和 Munge 用户的 UID 冲突

默认情况下,此项目对 Slurm 用户使用 UID 和 GID 11100,Munge 用户使用 11101。 如果这导致与其他用户或组发生冲突,则这些默认值可能会被重写。

若要替代 UID 和 GID,请单击两个节点的 scheduler 编辑按钮:

编辑计划程序

编辑计划程序

execute和 nodearray:编辑 Nodearray

并将以下属性添加到 Configuration 节:

编辑配置

    slurm.user.name = slurm
    slurm.user.uid = 11100
    slurm.user.gid = 11100
    munge.user.name = munge
    munge.user.uid = 11101
    munge.user.gid = 11101

自动缩放

CycleCloud 使用 Slurm 的 弹性计算 功能。 若要调试自动缩放问题,可以在计划程序节点上检查一些日志。 第一种是通过检查 /var/log/slurmctld/slurmctld.log来确保正在执行节能恢复调用。 应会看到如下行:

[2019-12-09T21:19:03.400] power_save: pid 8629 waking nodes htc-1

要检查的另一个日志是 /var/log/slurmctld/resume.log。 如果恢复步骤失败,则还会有 。/var/log/slurmctld/resume_fail.log 如果存在有关未知或无效节点名称的消息,请确保未按照上述“进行群集更改”部分中的步骤将节点添加到群集。

Slurm 配置参考

以下是可以切换为自定义功能的特定于 Slurm 的配置选项:

特定于 Slurm 的配置选项 说明
slurm.version 默认值:“18.08.7-1”。 这是要安装和运行的 Slurm 版本。 这是当前默认且 一的选项。 将来可能支持 Slurm 软件的其他版本。
slurm.autoscale 默认值:“false”。 这是一个按节点数组设置,用于控制 Slurm 是否应自动停止和启动此节点数组中的节点。
slurm.hpc 默认值:“true”。 这是一个按节点数组设置,用于控制是否将节点数组中的节点放置在同一放置组中。 主要用于将 VM 系列与 InfiniBand 配合使用的节点数组。 仅当 slurm.autoscale 设置为“true”时才适用。
slurm.default_partition 默认值:“false”。 这是一个按节点数组设置,用于控制节点数组是否应是未显式请求分区的作业的默认分区。
slurm.dampen_memory 默认值:“5”。 OS/VM 开销要保留的内存百分比。
slurm.suspend_timeout 默认值:“600”。 暂停调用和可再次使用该节点的时间) (以秒为单位。
slurm.resume_timeout 默认值:“1800”。 等待节点成功启动的时间) (秒。
slurm.install 默认值:“true”。 确定是否在节点启动时安装 Slurm ('true') 。 如果 Slurm 安装在自定义映像中,则应将其设置为“false”。 (proj 版本 2.5.0+)
slurm.use_pcpu 默认值:“true”。 这是一个按节点的数组设置,用于控制使用超线程 vcpu 进行计划。 设置为“false”以在 cyclecloud.conf 中设置 CPU=vcpus。
slurm.user.name 默认值:“slurm”。 这是 Slurm 服务要使用的用户名。
slurm.user.uid 默认值:“11100”。 要用于 Slurm 用户的用户 ID。
slurm.user.gid 默认值:“11100”。 要用于 Slurm 用户的组 ID。
munge.user.name 默认值:“munge”。 这是 MUNGE 身份验证服务要使用的用户名。
munge.user.uid 默认值:“11101”。 要用于 MUNGE 用户的用户 ID。
munge.user.gid 默认值:“11101”。 要用于 MUNGE 用户的组 ID。

CycleCloud 支持跨计划程序的标准自动停止属性集:

特性 说明
cyclecloud.cluster.autoscale.stop_enabled 是否在此节点上启用了自动停止? [true/false]
cyclecloud.cluster.autoscale.idle_time_after_jobs 节点在完成作业后在纵向缩减之前处于空闲状态的时间 (以秒为单位) 。
cyclecloud.cluster.autoscale.idle_time_before_jobs 节点在纵向缩减之前完成作业之前处于空闲状态的时间 (以秒为单位) 。