在 Compute Engine 上部署 Slurm 集群

本教程介绍如何在 Compute Engine 上部署 Slurm 集群。Slurm Workload Manager 是许多高性能计算中心常用的工作负载管理器。如需了解与高性能计算术语和用例相关的讨论,请参阅使用集群在云端进行大规模技术计算

下图展示了您在本教程中创建的配置。

展示安装在 Compute Engine 上的 Slurm 集群的架构图。

作为集群工作负载管理器,Slurm 执行以下操作:

  • 为用户分配资源(计算节点)。
  • 提供在节点上启动、执行和监控工作的结构。
  • 管理待处理的工作队列。

为本教程开发的部署是一个简化的集群架构,支持少量用户运行单应用工作负载。您可以对适用于本地集群或多云端集群的多工作负载部署、大规模生产部署和混合部署使用其他配置,但这些配置不在本教程的介绍范围内。

在本教程中,您将使用登录(头)节点与系统进行交互。部署集群后,您可以使用 SSH 连接到登录节点,安装应用,并使用 Slurm 命令行工具提交作业进行计算。在控制器节点上运行的 Slurm 调度器将可用资源与作业要求相匹配来调度已加入队列的作业,并管理计算节点上的作业执行。NFS 服务器为文件提供通用共享空间。

目标

  • 使用 Terraform 部署 Slurm 集群。
  • 使用 Slurm 运行作业。
  • 查询集群信息并监控 Slurm 中正在运行的作业。
  • 自动扩缩节点以适应作业参数和要求。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能

  4. 启用 Compute Engine API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能

  7. 启用 Compute Engine API。

    启用 API

  8. 在控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

部署 Slurm 集群

在本部分中,您将准备集群配置,使用 Terraform 将 Slurm 集群部署到 Google Cloud,然后验证集群是否正常运行。

准备集群配置

  1. 在 Cloud Shell 中,克隆 slurm-gcp GitHub 代码库:

    git clone https://github.com/SchedMD/slurm-gcp.git
    
  2. 安装 Terraform 脚本所需的 Python 库:

    python -m pip install -r slurm-gcp/scripts/requirements.txt
    
  3. terraform/slurm_cluster/examples/slurm_cluster/cloud/full 文件夹中,将 example.tfvars 文件复制到 full.tfvars 文件:

    cd slurm-gcp/terraform/slurm_cluster/examples/slurm_cluster/cloud/full
    cp example.tfvars full.tfvars
    
  4. 使用 sed 命令根据您的环境修改 full.tfvars 文件:

    sed -i "s/<PROJECT_ID>/$(gcloud config get-value core/project)/" full.tfvars
    
  5. (可选)在文本编辑器中,通过更改预设值,根据您的环境自定义 full.tfvars 文件:

    • machine_type:要为集群的计算节点使用不同的机器类型,请更改此值。例如,如果您需要的 CPU 核心数或内存高于默认 n1-standard-4 机器类型的可用核心数和内存,请更改此值。如需了解详情,请参阅机器类型
    • disk_type:如需在计算节点上使用 SSD,请将此值更改为 pd-ssd。如需了解详情,请参阅存储选项
    • disk_size_gb:如需使用挂接到计算节点的更大或更小的磁盘,请更改此值。
  6. (可选)在文本编辑器中,通过取消备注其他 Terraform 变量声明,根据您的环境自定义 full.tfvars 文件。

使用 Terraform 部署 Slurm 集群

在本部分中,您将运行 makefile 来创建和部署集群。

  1. 在 Cloud Shell 中,应用您的 tfvars 文件以配置和部署集群:

    make apply TFVARS=full.tfvars
    
  2. 集群配置需要 5-10 分钟才能完成。跟踪配置的进度:

    export CLUSTER_ZONE=$(gcloud compute instances list \
           --filter="name ~ .*controller" --format="value(zone)")
    gcloud compute ssh full-controller \
        --command "sudo journalctl -fu google-startup-scripts.service" \
        --zone $CLUSTER_ZONE
    

    脚本完成运行后,您的 Slurm 集群就可以使用了。输出以下列行结束:

    Started Google Compute Engine Startup Scripts.
    
  3. 如需停止监控配置,请按 Control+C

验证集群是否正常运行

  1. 在 Cloud Shell 中,登录到登录节点,检查集群是否已准备就绪:

    export CLUSTER_LOGIN_NODE=$(gcloud compute instances list \
           --filter="name ~ .*login." --format="value(name)")
    export CLUSTER_ZONE=$(gcloud compute instances list \
           --filter="name ~ .*login." --format="value(zone)")
    gcloud compute ssh ${CLUSTER_LOGIN_NODE} \
        --zone $CLUSTER_ZONE
    

    如果输出类似于以下内容,则表示集群已准备就绪:

                                     SSSSSSS
                                    SSSSSSSSS
                                    SSSSSSSSS
                                    SSSSSSSSS
                            SSSS     SSSSSSS     SSSS
                           SSSSSS               SSSSSS
                           SSSSSS    SSSSSSS    SSSSSS
                            SSSS    SSSSSSSSS    SSSS
                    SSS             SSSSSSSSS             SSS
                   SSSSS    SSSS    SSSSSSSSS    SSSS    SSSSS
                    SSS    SSSSSS   SSSSSSSSS   SSSSSS    SSS
                           SSSSSS    SSSSSSS    SSSSSS
                    SSS    SSSSSS               SSSSSS    SSS
                   SSSSS    SSSS     SSSSSSS     SSSS    SSSSS
              S     SSS             SSSSSSSSS             SSS     S
             SSS            SSSS    SSSSSSSSS    SSSS            SSS
              S     SSS    SSSSSS   SSSSSSSSS   SSSSSS    SSS     S
                   SSSSS   SSSSSS   SSSSSSSSS   SSSSSS   SSSSS
              S    SSSSS    SSSS     SSSSSSS     SSSS    SSSSS    S
        S    SSS    SSS                                   SSS    SSS    S
        S     S                                                   S     S
                    SSS
                    SSS
                    SSS
                    SSS
     SSSSSSSSSSSS   SSS   SSSS       SSSS    SSSSSSSSS   SSSSSSSSSSSSSSSSSSSS
    SSSSSSSSSSSSS   SSS   SSSS       SSSS   SSSSSSSSSS  SSSSSSSSSSSSSSSSSSSSSS
    SSSS            SSS   SSSS       SSSS   SSSS        SSSS     SSSS     SSSS
    SSSS            SSS   SSSS       SSSS   SSSS        SSSS     SSSS     SSSS
    SSSSSSSSSSSS    SSS   SSSS       SSSS   SSSS        SSSS     SSSS     SSSS
     SSSSSSSSSSSS   SSS   SSSS       SSSS   SSSS        SSSS     SSSS     SSSS
             SSSS   SSS   SSSS       SSSS   SSSS        SSSS     SSSS     SSSS
             SSSS   SSS   SSSS       SSSS   SSSS        SSSS     SSSS     SSSS
    SSSSSSSSSSSSS   SSS   SSSSSSSSSSSSSSS   SSSS        SSSS     SSSS     SSSS
    SSSSSSSSSSSS    SSS    SSSSSSSSSSSSS    SSSS        SSSS     SSSS     SSSS
    
  2. 集群准备就绪后,安排作业以验证其是否正常运行。此作业在集群中的多个节点上运行 hostname 命令。

    sbatch -N2 --wrap="srun hostname"
    

    作业完成后,squeue 命令不会返回任何条目,并且输出文件 slurm-*.out 存在。

  3. 显示作业的输出:

    cat slurm-*.out
    

    输出内容类似如下:

        full-debug-test-0
        full-debug-test-1
    

    您现在拥有了一个正常运行的集群。

  4. 如需退出集群,请按 Control+D

自动扩缩 Slurm 集群

部署 Slurm 集群时,您需要为 max_node_countstatic_node_count 属性指定值。max_node_count 值确定您的集群在任何给定时间运行的计算节点的数量上限。static_node_count 值指定始终运行的计算节点数量。默认情况下,slurm-cluster.yaml 文件将 max_node_count 设置为 10,将 static_node_count 设置为 2

这两个数值之间的差值 (max_node_count - static_node_count) 是集群中的临时节点数。临时节点是根据作业调度请求按需创建的。在目标作业执行完成后,除非集群可以使用这些临时节点执行其他作业,否则这些节点将被销毁。在 Google Cloud 上,Slurm 节能机制仅在必要时实例化临时节点以自动扩缩集群。

  1. 在 Cloud Shell 中,登录集群的登录节点:

    gcloud compute ssh ${CLUSTER_LOGIN_NODE} --zone $CLUSTER_ZONE
    
  2. 查看节点计数:

    sinfo
    

    输出类似于以下内容:

    PARTITION AVAIL TIMELIMIT  NODES  STATE   NODELIST
    debug*    up    infinite   8      idle~   demo-compute[3-10]
    debug*    up    infinite   2      idle    demo-compute[1-2]
    

    输出第一行中 STATE 描述符 idle 的后缀 ~ 表示有 8 个临时节点处于节能模式。

  3. 如需自动扩缩集群,请创建 3 个临时节点:

    sbatch -N5 --wrap="srun hostname"
    

    输出类似于以下内容:

    Submitted batch job JOB_ID
    
  4. 再次查看节点数:

    sinfo
    

    输出类似于以下内容:

    PARTITION AVAIL  TIMELIMIT  NODES  STATE   NODELIST
    debug*    up     infinite   3      alloc#  demo-compute[3-5]
    debug*    up     infinite   5      idle~   demo-compute[6-10]
    debug*    up     infinite   2      idle    demo-compute[1-2]
    

    输出第一行中 STATE 描述符 alloc 的后缀 # 表示创建了 3 个临时节点。创建和配置其他节点后,它们将运行作业,然后在短暂延迟后被销毁。

  5. 如需退出集群,请按 Control+D

清除数据

若要避免产生费用,最简单的方法是删除您为本教程创建的 Cloud 项目。或者,您也可以删除各个资源。

删除 Slurm 集群

  • 删除集群:

    terraform destroy -var-file=full.tfvars -auto-approve
    

删除项目

  1. 在控制台中,打开管理资源页面。

    打开“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤