使用 Slurm 部署可自动扩缩的 HPC 集群

1. 概览

欢迎使用 Google Codelab,了解如何在 Google Cloud Platform 上运行 Slurm 集群!学完此 Codelab 后,您应该对可自动扩缩的 Slurm 集群如何易于预配和操作有了深入的了解。

c16fa310c142ac6f.png

Google Cloud 与 SchedMD 携手发布了一组工具,让您可以轻松地在 Compute Engine 上启动 Slurm 工作负载管理器,并在需要额外资源时动态扩展现有集群。此集成由 SchedMD 的专家根据 Slurm 最佳实践构建。

如果您计划使用 Slurm on Google Cloud Platform 集成功能,或者有任何疑问,欢迎加入我们的 Google Cloud &Slurm 社区论坛

Slurm 简介

a739730a41acff0a.png

Google Cloud Platform 中独立 Slurm 集群的基本架构图。

Slurm 是全球领先的 HPC 集群工作负载管理器之一。Slurm 为小型和大型 Linux 集群提供容错且扩缩能力极强的开源工作负载管理和作业调度系统。Slurm 无需修改内核即可运行,并且相对独立。作为集群工作负载管理器,Slurm 有三项关键功能:

  1. 它会在一段时间内为用户分配对资源(计算节点)的独占或非独占访问权限,以便他们可以执行工作。
  2. 它提供了一个框架,用于在一组分配的节点上启动、执行和监控工作(通常是并行作业)。
  3. 它通过管理待处理工作队列来仲裁资源争用。

学习内容

  • 如何使用 Terraform 设置 Slurm 集群
  • 如何使用 SLURM 运行作业
  • 如何查询集群信息并监控 SLURM 中正在运行的作业
  • 如何自动扩缩节点以适应特定作业参数和要求
  • 如何获取有关 Slurm 的帮助

前提条件

  • Google Cloud Platform 账号和具备结算功能的项目
  • 基本 Linux 体验

2. 设置

自定进度的环境设置

创建项目

如果您还没有 Google 账号(Gmail 或 G Suite),则必须创建一个。登录 Google Cloud Platform 控制台 ( console.cloud.google.com),然后打开“管理资源”页面

359c06e07e6d699f

点击 Create Project

25c23d651abb837b

输入项目名称。记住项目 ID(在上方屏幕截图中以红色突出显示)。项目 ID 必须是所有 Google Cloud 项目中的唯一名称。如果您的项目名称不是唯一的,Google Cloud 会根据项目名称随机生成一个项目 ID。

接下来,您需要在 Developers Console 中启用结算功能,以便使用 Google Cloud 资源。

运行此 Codelab 应该不会花费超过几美元,但如果您决定使用更多资源或者继续运行这些资源,费用可能会更高(请参阅本文档末尾的“总结”部分)。此处提供 Google Cloud Platform 价格计算器。

Google Cloud Platform 的新用户有资格获享$300 免费试用

Google Cloud Shell

虽然 Google Cloud 可以通过笔记本电脑远程操作,但在此 Codelab 中,我们将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

启动 Google Cloud Shell

在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

dbad104cef962719.png

然后点击启动 Cloud Shell

4e50db320508ac88

配置和连接到环境应该只需要片刻时间:

20b0aa80492144d

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 上运行,大大增强了网络性能并简化了身份验证。只需使用网络浏览器或 Google Chromebook 即可完成本实验中的大部分(甚至全部)工作。

在连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID:

$ gcloud auth list

命令输出:

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
$ gcloud config list project

命令输出:

[core]
project = <PROJECT_ID>

如果项目 ID 设置不正确,您可以使用以下命令进行设置:

$ gcloud config set project <PROJECT_ID>

命令输出:

Updated property [core/project].

3. 准备和查看 Slurm Terraform 配置

下载 Slurm Terraform 配置

在 Cloud Shell 会话中,执行以下命令,以克隆(下载)包含 Slurm for Google Cloud Platform Terraform 文件的 Git 代码库:

git clone https://github.com/SchedMD/slurm-gcp.git

通过执行以下命令切换到 Slurm 部署配置目录:

cd slurm-gcp

配置 Slurm Terraform tfvar

Basic.tfvars.example 文件详细说明了部署的配置,包括要部署的网络、实例和存储空间。将其复制到一个新文件(我们称之为“tfvars 文件”),然后根据需要进行编辑。

cd tf/example/basic
cp basic.tfvars.example basic.tfvars

在 Cloud Shell 会话中,打开 tfvars 文件 basic.tfvars。您可以使用自己偏好的命令行编辑器(vi、nano、emacs 等),也可以使用 Cloud 控制台代码编辑器查看文件内容:

214f43bba6c917aa

查看 tfvars 文件的内容。

cluster_name = "g1"
project      = "<project>"
zone         = "us-west1-b"

# network_name            = "<existing network name>"
# subnetwork_name         = "<existing subnetwork name>"
# shared_vpc_host_project = "<vpc host project>"

# disable_controller_public_ips = true
# disable_login_public_ips      = true
# disable_compute_public_ips    = true

# suspend_time  = 300

controller_machine_type = "n1-standard-2"
controller_image        = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
controller_disk_type    = "pd-standard"
controller_disk_size_gb = 50
# controller_labels = {
#   key1 = "val1"
#   key2 = "val2"
# }
# controller_service_account = "default"
# controller_scopes          = ["https://www.googleapis.com/auth/cloud-platform"]
# cloudsql = {
#   server_ip = "<cloudsql ip>"
#   user      = "slurm"
#   password  = "verysecure"
#   db_name   = "slurm_accounting"
# }
# controller_secondary_disk      = false
# controller_secondary_disk_size = 100
# controller_secondary_disk_type = "pd-ssd"
#
# When specifying an instance template, specified controller fields will
# override the template properites.
# controller_instance_template = null

login_machine_type = "n1-standard-2"
login_image        = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
login_disk_type    = "pd-standard"
login_disk_size_gb = 20
# login_labels = {
#   key1 = "val1"
#   key2 = "val2"
# }
# login_node_count = 1
# login_node_service_account = "default"
# login_node_scopes          = [
#   "https://www.googleapis.com/auth/monitoring.write",
#   "https://www.googleapis.com/auth/logging.write"
# ]
#
# When specifying an instance template, specified login fields will
# override the template properties.
# login_instance_template = null

# Optional network storage fields
# network_storage is mounted on all instances
# login_network_storage is mounted on controller and login instances
# network_storage = [{
#   server_ip     = "<storage host>"
#   remote_mount  = "/home"
#   local_mount   = "/home"
#   fs_type       = "nfs"
#   mount_options = null
# }]
#
# login_network_storage = [{
#   server_ip     = "<storage host>"
#   remote_mount  = "/net_storage"
#   local_mount   = "/shared"
#   fs_type       = "nfs"
#   mount_options = null
# }]

# compute_node_service_account = "default"
# compute_node_scopes          = [
#   "https://www.googleapis.com/auth/monitoring.write",
#   "https://www.googleapis.com/auth/logging.write"
# ]

partitions = [
  { name                 = "debug"
    machine_type         = "n1-standard-2"
    static_node_count    = 0
    max_node_count       = 10
    zone                 = "us-west1-b"
    image                ="projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
    image_hyperthreads   = false
    compute_disk_type    = "pd-standard"
    compute_disk_size_gb = 20
    compute_labels       = {}
    cpu_platform         = null
    gpu_count            = 0
    gpu_type             = null
    network_storage      = []
    preemptible_bursting = false
    vpc_subnet           = null
    exclusive            = false
    enable_placement     = false
    regional_capacity    = false
    regional_policy      = {}
    instance_template    = null
  },
  #  { name                 = "partition2"
  #    machine_type         = "n1-standard-16"
  #    static_node_count    = 0
  #    max_node_count       = 20
  #    zone                 = "us-west1-b"
  #    image                = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
  #    image_hyperthreads   = false
  #
  #    compute_disk_type    = "pd-ssd"
  #    compute_disk_size_gb = 20
  #    compute_labels       = {
  #      key1 = "val1"
  #      key2 = "val2"
  #    }
  #    cpu_platform         = "Intel Skylake"
  #    gpu_count            = 8
  #    gpu_type             = "nvidia-tesla-v100"
  #    network_storage      = [{
  #      server_ip     = "none"
  #      remote_mount  = "<gcs bucket name>"
  #      local_mount   = "/data"
  #      fs_type       = "gcsfuse"
  #      mount_options = "file_mode=664,dir_mode=775,allow_other"
  #    }]
  #    preemptible_bursting = true
  #    vpc_subnet           = null
  #    exclusive            = false
  #    enable_placement     = false
  #
  #    ### NOTE ####
  #    # regional_capacity is under development. You may see slowness in
  #    # deleting lots of instances.
  #    #
  #    # With regional_capacity : True, the region can be specified in the zone.
  #    # Otherwise the region will be inferred from the zone.
  #    zone = "us-west1"
  #    regional_capacity    = True
  #    # Optional
  #    regional_policy      = {
  #        locations = {
  #            "zones/us-west1-a" = {
  #                preference = "DENY"
  #            }
  #        }
  #    }
  #
  #    When specifying an instance template, specified compute fields will
  #    override the template properties.
  #    instance_template = "my-template"
]

在此 tfvars 文件中,有几个字段需要配置。唯一必须配置的字段是 project。示例中的所有其他配置可以按原样使用,但请根据需要进行修改。如需详细了解配置选项,请点击此处

  • cluster_name::Slurm 集群的名称
  • project:将在其中部署资源的 Google Cloud 项目 ID
  • 可用区:Google Cloud 可用区,其中将包含此集群的控制器和登录实例 - 了解详情
  • network_name: :用于部署 Slurm 集群的虚拟私有云网络
  • subnetwork_name: :用于部署 Slurm 集群的虚拟私有云子网
  • shared_vpc_host_project: :用于部署 Slurm 集群的共享 VPC 网络
  • disable_controller_public_ips::为 Slurm 控制器分配外部 IP?
  • disable_login_public_ips::为 Slurm 登录节点分配外部 IP?
  • disable_compute_login_ips::为 Slurm 登录节点分配外部 IP?
  • suspend_time::在节点空闲后等待暂停节点的时间
  • controller_machine_type::控制器节点实例类型
  • controller_image::用于创建 Slurm 控制器实例的 GCP 映像
  • controller_disk_type::控制器实例启动磁盘的类型
  • controller_disk_size_gb::控制器实例启动磁盘的大小
  • controller_labels::要附加到控制器实例的标签
  • controller_service_account: :要在控制器实例上使用的服务账号
  • controller_scopes: 控制器实例的访问权限范围
  • cloudsql Google CloudSQL 服务器,用作 Slurm 数据库,而不是在控制器实例上托管数据库
  • server_ip::CloudSQL 服务器 IP
  • user:CloudSQL 用户名
  • password:CloudSQL 密码
  • db_name::CloudSQL 数据库名称
  • controller_secondary_disk::为 NFS 服务器存储添加辅助磁盘?
  • controller_secondary_disk_type::控制器辅助磁盘的类型
  • controller_secondary_disk_size_gb::控制器辅助磁盘的大小
  • controller_instance_template::要用于控制器实例的 GCP 实例模板。指定的任何计算字段都将替换模板属性。例如如果指定了 controller_image,它将覆盖实例模板中的映像。
  • login_machine_type::登录(可通过 SSH 访问)节点实例类型
  • login_image::用于创建 Slurm 登录实例的 GCP 映像
  • login_disk_type::登录实例启动磁盘的类型
  • login_disk_size_gb::登录实例启动磁盘的大小
  • login_labels::要附加到登录实例的标签
  • login_node_count::要创建的登录节点的数量
  • login_node_service_account: :要在登录实例上使用的服务账号
  • login_node_scopes: :登录实例的访问权限范围
  • login_instance_template::用于登录实例的 GCP 实例模板。指定的任何计算字段都将替换模板属性。例如如果指定了 login_image,它将覆盖实例模板中的映像。
  • network_storage::要在所有节点上装载的网络存储空间。字段将直接添加到 fstab 中。对于其他装载可以重复执行。
  • server_ip::存储服务器 IP
  • remote_mount::存储装载名称(文件系统名称)
  • local_mount::本地装载目录
  • fs_type::文件系统类型(自动安装的 NFS、CIFS、Lustre、GCSFuse)
  • mount_options::装载选项(即 default、_netdev)
  • login_network_storage::要装载在登录节点和控制器节点上的网络存储空间。系统会自动安装 NFS、CIFS、Lustre 和 GCSFuse。对于其他装载可以重复执行。
  • server_ip::存储服务器 IP
  • remote_mount::存储装载名称(文件系统名称)
  • local_mount::本地装载目录
  • fs_type::文件系统类型(自动安装的 NFS、CIFS、Lustre、GCSFuse)
  • mount_options::装载选项(即 default、_netdev)
  • compute_node_service_account: :要在计算实例上使用的服务账号
  • compute_node_scopes: :计算实例的访问权限范围
  • Partitions:Slurm 分区配置。可以针对其他分区重复。
  • name:分区名称
  • machine_type::计算节点实例类型
  • static_node_count::始终开启的计算节点的数量
  • max_node_count::允许的计算节点总数上限 - 上限为 64K
  • zone:Google Cloud 可用区,其中将包含此分区的资源 - 了解详情
  • image:计算映像节点机器类型
  • image_hyperthreads::在实例上启用或停用超线程
  • compute_disk_type:计算实例启动磁盘的类型(pd-standard、pd-ssd)
  • compute_disk_size_gb::计算实例启动磁盘的大小
  • compute_labels::要附加到计算实例的标签
  • cpu_platform::所有计算节点所需的满足最低要求的 CPU 平台
  • gpu_count::要挂接到分区中每个实例的 GPU 数量
  • gpu_type: 要挂接到分区实例的 GPU 类型
  • network_storage::要装载到分区中所有计算节点上的网络存储空间。字段将直接添加到 fstab 中。对于其他装载可以重复执行。
  • server_ip::存储服务器 IP
  • remote_mount::存储装载名称(文件系统名称)
  • local_mount::本地装载目录
  • fs_type::文件系统类型(自动安装的 NFS、CIFS、Lustre、GCSFuse)
  • mount_options::装载选项
  • preemptible_bursting::这些实例是否会成为抢占式实例?
  • vpc_subnet: :用于部署 Slurm 分区的虚拟私有云子网
  • 独占模式:启用 Slurm 将整个节点分配给作业
  • enable_placement::启用放置政策,其中实例之间彼此靠近,以缩短实例之间的网络延迟时间。
  • regional_capacity::允许将实例放置在该区域中的任何可用区中,具体取决于可用性
  • regional_policy::如果 region_capacity 为 true,则此政策将确定要使用哪个区域以及不使用该区域中的任何可用区
  • Instance_template::用于计算实例的 GCP 实例模板。指定的任何计算字段都将替换模板属性。例如如果指定了映像,则它将覆盖实例模板中的映像。

高级配置

如果需要,您可以选择在集群部署过程中安装其他软件包和软件。您可以使用“在 Compute Engine 上的 Slurm 集群中安装应用”中所述的多种方式在 Slurm 集群上安装软件,也可以自定义 Slurm 部署的映像。目前,Slurm 部署由 SchedMD 提供的基于 Google Cloud HPC 虚拟机映像的虚拟机映像,其中安装 Slurm。

要使用您自己的映像,请基于 tfvars 文件中列出的公共 SchedMD VM 映像,使用您自己的配置构建映像。接下来,将 tfvars 文件中指定的图片 URI 替换为您自己的图片,并测试更改。

问题排查

在整个 Codelab 中,请参阅 Slurm-GCP 代码库的 ReadMe 的“问题排查”部分

最常见的问题是配置 tfvars 文件时出错,以及配额限制。此 Codelab 的设计宗旨是在新用户的标准配额配额内以及新用户获得的 $300 赠金内。如果尝试创建虚拟机失败,请检查控制器节点上的 /var/log/slurm/resume.log 文件,以检查是否存在 API 错误。

4. 部署和验证配置

部署配置

在 Cloud Shell 会话中,从 slurm-gcp/tf/example 文件夹执行以下命令:

terraform init
terraform apply -var-file=basic.tfvars

系统将根据已设置的配置,提示您接受所述的操作。输入“yes”以开始部署您还可以通过运行“terraform plan”来查看要部署的配置。

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

此操作可能需要几分钟才能完成,因此请耐心等待

部署完成后,您将看到类似于以下内容的输出:

Apply complete! Resources: 8 added, 0 changed, 0 destroyed.

Outputs:

controller_network_ips = [
  [
    "10.0.0.2",
  ],
]
login_network_ips = [
  [
    "10.0.0.3",
  ],
]

验证虚拟机实例创建

打开导航菜单,然后选择 Compute Engine >虚拟机实例

d5832bdd527794ed.png

您应该会看到一个控制器和一个登录虚拟机实例:

7a1fc9603758d58d

VM instances(虚拟机实例)下,查看 Terraform 创建的两个虚拟机实例。

如果修改了 cluster_name 字段,则名称将不同。

  • g1 控制器
  • g1-login0

5. 登录 Slurm 集群

访问 Slurm 集群

返回“代码编辑器”/“Cloud Shell”标签页。运行以下命令以登录您的实例,注意将 <ZONE> 替换为 g1-login0 节点所在的可用区(应为 us-central1-b):

gcloud compute ssh g1-login0 --zone=<ZONE>

此命令会将您登录到 g1-login0 虚拟机。

另一种轻松访问登录节点的方法是点击“SSH”“虚拟机实例”页面上 g1-login0 虚拟机旁边的按钮,以通过 SSH 连接打开一个新标签页。

8c373a87d13620f7

如果这是您第一次使用 Cloud Shell,您可能会看到如下所示的消息,要求您创建 SSH 密钥:

WARNING: The public SSH key file for gcloud does not exist.
WARNING: The private SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
This tool needs to create the directory [/home/user/.ssh] before being
 able to generate SSH keys.

Do you want to continue (Y/n)?

如果是,请输入 Y。如果系统要求您选择口令,请按 Enter 键两次,将其留空。

如果登录时显示以下消息:

*** Slurm is currently being configured in the background. ***
A terminal broadcast will announce when installation and configuration is
complete.

请耐心等待,不要等到看到以下消息后再继续本实验(大约 5 分钟):

*** Slurm login setup complete ***

看到上述消息后,您必须退出并重新登录 g1-login0,才能继续本实验。为此,请按 CTRL + C 结束任务。

然后执行以下命令,退出您的实例:

exit

现在,重新连接到您的登录虚拟机。运行以下命令以登录您的实例,注意将 <ZONE> 替换为 g1-login0 节点所在的可用区:

gcloud compute ssh g1-login0 --zone=<ZONE>

如上文所述,您可能需要等待一两分钟的时间才能连接,并且所有方面的设置都已完成。

Slurm CLI 工具导览

现在,您已登录集群的 Slurm 登录节点。这是专用于用户/管理员交互、安排 Slurm 作业和管理活动的节点。

下面我们运行几个命令来介绍 Slurm 命令行。

执行 sinfo 命令以查看集群资源的状态:

sinfo

sinfo 的示例输出如下所示。sinfo 报告集群中的可用节点、这些节点的状态以及分区、可用性和对这些节点施加的任何时间限制等其他信息。

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite     10  idle~ g1-compute-0-[0-9]

您可以看到我们的 10 个节点,这些节点由调试分区的“max_node_count”决定标记为“idle~”(节点处于空闲且未分配模式,准备启动)。

接下来,执行 squeue 命令以查看集群队列的状态:

squeue

squeue 的预期输出如下所示。squeue 报告集群的队列状态。这包括集群上调度的每个作业的每个作业 ID、作业分配到的分区、作业名称、启动作业的用户、作业状态、作业运行的挂钟时间以及作业分配到的节点。没有正在运行的作业,因此此命令的内容为空。

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

Slurm 命令“srun”和“sbatch”用于运行加入队列的作业。“跑”运行并行作业,可以用作 mpirun 的封装容器。“sbatch”用于向 slurm 提交批量作业,并且可以在不同配置中调用 srun 一次或多次。“sbatch”可以采用批处理脚本,也可以与 -wrap 选项搭配使用,以便从命令行运行整个作业。

我们运行一个作业,以便查看 Slurm 的实际应用,并在队列中获取作业!

6. 运行 Slurm 作业并扩缩集群

运行 Slurm 作业并扩缩集群

现在,Slurm 集群已经运行,接下来我们运行作业并扩大集群规模。

“sbatch”命令用于运行 Slurm 批处理命令和脚本。我们来运行一个简单的 sbatch 脚本,该脚本将运行“hostname”自动扩缩虚拟机上的资源

登录 g1-login0 后,运行以下命令:

sbatch -N2 --wrap="srun hostname"

此命令用于运行 Slurm 批处理命令。它指定 sbatch 将运行 2 个带有“-N”的节点选项。它还指定其中每个节点都将运行“运行主机名”(位于“-wrap”命令中)选项。

默认情况下,sbatch 会将其输出写入“slurm-%j.out”位于工作目录中,其中 %j 会根据 Slurm 文件名模式替换成作业 ID。在我们的示例中,sbatch 是从用户的 /home 文件夹运行,该文件夹是默认托管在控制器上的基于 NFS 的共享文件系统。这允许计算节点根据需要共享输入和输出数据。在生产环境中,工作存储空间应该与 /home 存储空间分开,以避免对集群操作造成性能影响。可以在“network_storage”的 tfvars 文件中指定单独的存储装载选项。

在使用 sbatch 命令行执行 sbatch 脚本后,它将返回预定作业的作业 ID,例如:

Submitted batch job 2

我们可以使用 sbatch 命令返回的作业 ID 来跟踪和管理作业执行情况和资源。执行以下命令以查看 Slurm 作业队列:

squeue

您可能会看到您执行的作业如下所示:

JOBID PARTITION               NAME     USER ST       TIME  NODES   NODELIST(REASON)
    2     debug g1-compute-0-[0-1] username  R       0:10      2 g1-compute-0-[0-1]

由于我们没有预配任何计算节点,因此 Slurm 将根据作业要求自动创建计算实例。该过程的自动性质有两个好处。首先,它消除了 HPC 集群中通常所需的工作,即手动预配节点、配置软件、将节点集成到集群中,然后部署作业。其次,它可让用户节省资金,因为空闲的未使用的节点会缩减,直到运行最少数量的节点。

您可以执行 sinfo 命令以查看启动的 Slurm 集群:

sinfo

这将显示“alloc#”的 squeue 中列出的节点状态,表示正在分配节点:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      8  idle~ g1-compute-0-[2-9]
debug*       up   infinite      2 alloc#  g1-compute-0-[0-1]

您还可以在 Google Cloud 控制台的“虚拟机实例”部分查看新预配的节点。启动节点并运行 Slurm 需要几分钟时间,然后才能将作业分配给新分配的节点。您的虚拟机实例列表很快将如下所示:

9997efff595f1e

一旦节点运行作业,实例就会移至“分配”状态,表示作业已分配给作业:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      8  idle~ g1-compute-0-[2-9]
debug*       up   infinite      2  alloc g1-compute-0-[0-1]

作业完成后,将不再列在 squeue 中,并且“alloc”sinfo 中的节点将恢复为“空闲”状态。运行“squeue”在作业一两分钟后,定期更新,直到作业完成为止。

输出文件 slurm-%j.out 将写入到 NFS 共享的 /home 文件夹中,并且将包含主机名。打开或获取输出文件(通常为 slurm-2.out),输出文件的内容将包含:

g1-compute-0-0
g1-compute-0-1

太棒了,你运行了一项作业并扩大了 Slurm 集群!

7. 运行 MPI 作业

现在,让我们跨节点运行一项 MPI 作业。登录 g1-login0 后,使用 wget 下载以 C 编程语言编写的 MPI 程序:

wget https://raw.githubusercontent.com/mpitutorial/mpitutorial/gh-pages/tutorials/mpi-hello-world/code/mpi_hello_world.c

要使用 OpenMPI 工具,您需要通过运行以下命令来加载 OpenMPI 模块:

module load openmpi

我们将使用“mpicc”来编译 MPI C 代码。执行以下命令:

mpicc mpi_hello_world.c -o mpi_hello_world

这会将 C 代码编译为机器代码,以便我们可以通过 Slurm 在集群中运行代码。

接下来,使用您首选的文本编辑器创建名为“helloworld_batch”的 sbatch 脚本:

vi helloworld_batch

输入 i 以进入 vi 插入模式。

将以下文本复制粘贴到文件中,以创建一个简单的 sbatch 脚本:

#!/bin/bash
#
#SBATCH --job-name=hello_world
#SBATCH --output=hello_world-%j.out
#
#SBATCH --nodes=2

srun mpi_hello_world

按 Esc 键并输入“:wq”,保存并退出代码编辑器(不带引号)。

此脚本定义了 Slurm 批处理执行环境和任务。首先,执行环境定义为 bash。接下来,脚本首先使用“#SBATCH”定义 Slurm 选项代码。作业名称定义为“hello_world”。

输出文件设置为“hello_world_%j.out”其中,%j 会根据 Slurm 文件名模式替换为作业 ID。此输出文件将写入运行 sbatch 脚本的目录。在我们的示例中,该文件夹是用户的 /home 文件夹,它是一个基于 NFS 的共享文件系统。这允许计算节点根据需要共享输入和输出数据。在生产环境中,工作存储空间应该与 /home 存储空间分开,以避免对集群操作造成性能影响。

最后,此脚本应该在其上运行的节点数量定义为 2。

定义选项后,提供可执行命令。此脚本将使用 srun 命令并行运行 mpi_hello_world 代码,srun 命令可轻松替换 mpirun 命令。

然后使用 sbatch 命令行执行 sbatch 脚本:

sbatch helloworld_batch

运行 sbatch 将返回已安排作业的作业 ID,例如:

Submitted batch job 3

这将跨 2 个节点运行 hostname 命令,每个节点一个任务,并将输出输出到 hello_world-3.out 文件。

由于我们已经预配了 2 个节点,因此该作业将会快速运行。

监控 squeue,直到作业完成且不再列出:

squeue

完成后,打开或输入 hello_world-3.out 文件并确认它在 g1-compute-0-[0-1] 上运行:

Hello world from processor g1-compute-0-0, rank 0 out of 2 processors
Hello world from processor g1-compute-0-1, rank 1 out of 2 processors

在动态预配的计算节点空闲 5 分钟后(可通过 YAML 的 suspended_time 字段或 slurm.conf 的 SuspendTime 字段进行配置),系统会释放动态预配的计算节点,以释放资源。您可以通过定期运行 sinfo 并观察集群大小回退到 0 来验证这一点:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite     10  idle~ g1-compute-0-[0-9]

尝试启动更多实例(不超过您部署集群的区域所允许的配额),然后运行不同的 MPI 应用。

8. 总结

恭喜,您已在 Google Cloud Platform 上创建了一个 Slurm 集群,并使用其最新功能自动扩缩集群以满足工作负载需求!您可以使用此模型运行各种作业,只需在 Slurm 中请求节点,即可在几分钟内扩容到数百个实例。

如果您想继续学习在 GCP 上使用 Slurm,请务必学习使用 Slurm 构建联合 HPC 集群”Codelab。此 Codelab 将指导您在云端设置两个联合 Slurm 集群,以说明如何在本地或云端实现多集群联合。

您是否正在使用 Slurm 的全新 GCP 原生功能构建出色的应用?有疑问?有功能建议?立即通过 Google Cloud 的高性能计算解决方案网站与 Google Cloud 团队联系,或在 Google Cloud 和Slurm 论坛

清理 Terraform 部署

退出 Slurm 节点:

exit

在删除部署之前,让任何自动扩缩的节点进行纵向缩容。您也可以运行“gcloud compute instances delete <实例名称>”来手动删除这些节点也可以使用控制台 GUI 选择多个节点,然后点击“删除”。

完成部署后,您可以在退出 g1-login0 后通过 Google Cloud Shell 执行以下命令,轻松清理 Terraform 部署:

cd ~/slurm-gcp/tf/examples/basic
terraform destroy -var-file=basic.tfvars

出现提示时,输入 yes 继续。此操作可能需要几分钟时间,请耐心等待。

删除项目

要清理,我们只需删除项目即可。

  • 在导航菜单中,选择“IAM 和”管理
  • 然后点击子菜单中的“设置”
  • 点击带有“Delete Project”字样的垃圾桶图标
  • 按照提示中的说明操作

所学内容

  • 如何使用 Terraform 在 GCP 上部署 Slurm。
  • 如何在 GCP 上使用 Slurm 运行作业。
  • 如何在 Slurm 中查询集群信息并监控正在运行的作业。
  • 如何在 GCP 上使用 Slurm 自动扩缩节点,以适应特定作业参数和要求。
  • 如何在 GCP 上的 Slurm 上编译和运行 MPI 应用。

寻求 Slurm 支持

如果您在测试或生产环境中使用这些集成时需要支持,请通过其联系页面直接与 SchedMD 联系:https://www.schedmd.com/contact.php

您还可以使用我们提供的问题排查指南:

最后,您还可以将您的问题发布到 Google Cloud 和可在以下网址找到 Slurm 论坛:https://groups.google.com/g/google-cloud-slurm-discuss

了解详情

反馈

使用此链接提交有关此 Codelab 的反馈。只需不到 5 分钟即可完成反馈。谢谢!