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

1. 概览

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

c16fa310c142ac6f.png

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

如果您计划使用 Google Cloud Platform 上的 Slurm 集成,或者有任何疑问,请考虑加入我们的 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 ( console.cloud.google.com),然后打开“管理资源”页面

359c06e07e6d699f.png

点击创建项目

25c23d651abb837b.png

输入项目名称。记住项目 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

然后点击 Start Cloud Shell

4e50db320508ac88.png

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

20b0aa80492144d.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 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 tfvars

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

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

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

214f43bba6c917aa.png

查看 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
  • zone:将包含相应集群的控制器和登录实例的 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: 要用作 Slurm 数据库的 Google CloudSQL 服务器,而不是在控制器实例上托管数据库
  • 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::装载选项(即 defaults,_netdev)
  • login_network_storage::要在登录节点和控制器节点上装载的网络存储空间。系统会自动安装 NFS、CIFS、Lustre 和 GCSFuse。可以重复使用,以添加其他装载。
  • server_ip::存储服务器 IP
  • remote_mount::存储装载名称(文件系统名称)
  • local_mount::本地装载目录
  • fs_type::文件系统类型(NFS、CIFS、Lustre、GCSFuse 会自动安装)
  • mount_options::装载选项(即 defaults,_netdev)
  • compute_node_service_account: 要在计算实例上使用的服务账号
  • compute_node_scopes: 计算实例的访问权限范围
  • partitions:Slurm 分区配置。可重复使用以添加其他分区。
  • name:分区名称
  • machine_type::计算节点实例类型
  • static_node_count::始终开启的计算节点的数量
  • max_node_count::允许的最大计算节点总数 - 最大值为 64K
  • 可用区:将包含相应分区的资源的 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 分区部署到的 虚拟私有云子网
  • exclusive:使 Slurm 将整个节点分配给作业
  • enable_placement::启用放置政策,以便将实例放置在彼此靠近的位置,从而缩短实例之间的网络延迟时间。
  • regional_capacity::允许根据可用性将实例放置在区域中的任何可用区
  • regional_policy::如果 regional_capacity 为 true,此政策用于确定要使用的区域以及该区域中不使用的任何可用区
  • Instance_template::用于计算实例的 GCP 实例模板。指定的任何计算字段都会替换模板属性。例如,如果指定了映像,则会覆盖实例模板中的映像。

高级配置

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

如需使用自己的映像,请根据 tfvars 文件中列出的公共 SchedMD 虚拟机映像,构建具有您自己配置的映像。接下来,将 tfvars 文件中指定的映像 URI 替换为您自己的映像,然后测试更改。

问题排查

在此 Codelab 的整个过程中,请参阅 Slurm-GCP 代码库的自述文件中的问题排查部分

最常见的问题是 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.png

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

如果您修改了 cluster_name 字段,则名称会有所不同。

  • g1-controller
  • g1-login0

5. 登录 Slurm 集群

访问 Slurm 集群

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

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

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

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

8c373a87d13620f7.png

如果您是首次使用 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]

您可以看到,根据调试分区的“max_node_count”值(10),我们的 10 个节点均标记为“idle~”(节点处于空闲且未分配模式,随时可以启动)。

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

squeue

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

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

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

我们来运行一个作业,以便了解 Slurm 的实际运作情况,并让队列中出现一个作业!

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

运行 Slurm 作业并扩缩集群

现在,我们的 Slurm 集群已在运行,接下来我们运行一个作业并扩缩集群。

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

在登录 g1-login0 的情况下,运行以下命令:

sbatch -N2 --wrap="srun hostname"

此命令会运行 Slurm 批处理命令。它指定 sbatch 将使用“-N”选项运行 2 个节点。它还指定了每个节点将在“–wrap”选项中运行“srun hostname”命令。

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

使用 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

这将显示 squeue 中列出的处于“alloc#”状态的节点,这意味着节点正在被分配:

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.png

节点运行作业后,实例将进入“alloc”状态,表示作业已分配给作业:

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 中,并且 sinfo 中的“alloc”节点将返回到“空闲”状态。定期运行“squeue”,直到作业在一两分钟后完成。

输出文件 slurm-%j.out 将已写入您的 NFS 共享 /home 文件夹,并且将包含主机名。打开或 cat 输出文件(通常为 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 代码,该命令可直接替代 mpirun 命令。

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

sbatch helloworld_batch

运行 sbatch 将返回预定作业的 任务 ID,例如:

Submitted batch job 3

此命令将在 2 个节点上运行 hostname 命令,每个节点运行一个任务,并将输出内容打印到 hello_world-3.out 文件中。

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

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

squeue

完成后,打开或 cat 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 的 suspend_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 <实例名称>”,或者使用控制台界面选择多个节点,然后点击“删除”。

完成操作后,您可以从 Google Cloud Shell 中执行以下命令,轻松清理 Terraform 部署(在退出 g1-login0 后):

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

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

删除项目

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

  • 在导航菜单中,选择“IAM 和管理”
  • 然后点击子菜单中的“设置”
  • 点击带有“删除项目”字样的回收站图标
  • 按照提示说明操作

所学内容

  • 如何使用 Terraform 在 GCP 上部署 Slurm。
  • 如何在 GCP 上使用 Slurm 运行作业。
  • 如何查询集群信息并监控 Slurm 中正在运行的作业。
  • 如何使用 Slurm 在 GCP 上自动扩缩节点,以适应特定的作业参数和要求。
  • 如何在 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 分钟。谢谢!