在 Compute Engine 上部署 Slurm 集群

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

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

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

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

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

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

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

目标

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

费用

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

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

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

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Cloud Console 的项目选择器页面上,选择或创建 Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Google Cloud 项目已启用结算功能。 了解如何确认您的项目已启用结算功能

  4. 启用 Compute Engine and Deployment Manager API。

    启用 API

  5. 在 Cloud Console 中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Cloud Console 的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Cloud SDK 的 Shell 环境,其中包括 gcloud 命令行工具以及已为当前项目设置的值。该会话可能需要几秒钟时间来完成初始化。

部署 Slurm 集群

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

准备集群配置

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

    git clone https://github.com/SchedMD/slurm-gcp.git
    
  2. 定义以下环境变量:

    export CLUSTER_DEPLOY_NAME="cluster-deployment-name"
    export CLUSTER_NAME="cluster-name"
    export CLUSTER_REGION="cluster-region"
    export CLUSTER_ZONE="cluster-zone"
    

    替换以下内容:

    • cluster-deployment-name:集群部署的唯一名称。
    • cluster-name:集群的唯一名称。
    • cluster-region:部署集群的区域。选择一个靠近您所在位置的区域。如需了解详情,请参阅区域和地区
    • cluster-zone:部署集群的地区。
  3. slurm-gcp 文件夹中,将 slurm-cluster.yaml 文件复制到 ${CLUSTER_DEPLOY_NAME}.yaml 文件:

    cd slurm-gcp
    cp slurm-cluster.yaml ${CLUSTER_DEPLOY_NAME}.yaml
    
  4. 在文本编辑器中,根据您的环境修改 ${CLUSTER_DEPLOY_NAME}.yaml 文件。使用 slurm.jinja.schema 文件中定义的类型,此文件指定除 default_users 值以外的所有配置属性的默认值和允许值。进行以下必要的更改:

    • cluster_name:将您的集群名称更改为 cluster-name
    • regionzone:替换为 cluster-regioncluster-zone
    • compute_machine_type:(可选)如需使用其他机器类型,请更改 compute_machine_type 值。例如,如果您需要的 CPU 核心数或内存高于默认选项 n1-standard-2 的可用核心数和内存,请选择 n1-standard-4。如需了解详情,请参阅机器类型
    • vpc_netvpc_subnet:(可选)使用现有的 Virtual Private Cloud (VPC) 网络和 VPC 子网。slurm.jinja.schema 文件中描述了网络和子网要求。如果未指定值,则系统会为集群创建新网络或子网。如需了解详情,请参阅 VPC 网络
  5. 保存文件。

使用 Deployment Manager 部署 Slurm 集群

  1. 在 Cloud Shell 中,使用 Deployment Manager 将集群部署到 Google Cloud:

    gcloud deployment-manager deployments \
        --project="$(gcloud config get-value core/project)" \
        create $CLUSTER_DEPLOY_NAME \
        --config ${CLUSTER_DEPLOY_NAME}.yaml
    

    输出类似于以下内容:

    The fingerprint of the deployment is VWVaIYX1mFpjv9UDhzalYQ==
    Waiting for create [operation-1582142432278-59ef33da8f6fa-f5785d68-21feb545]...done.
    Create operation operation-1582142432278-59ef33da8f6fa-f5785d68-21feb545 completed successfully.
    NAME                                   TYPE                   STATE       ERRORS  INTENT
    helloworld-all-internal-firewall-rule  compute.v1.firewall    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-compute-image               compute.v1.instance    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-compute1                    compute.v1.instance    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-compute2                    compute.v1.instance    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-controller                  compute.v1.instance    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-login1                      compute.v1.instance    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-router                      compute.v1.router      IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-slurm-network               compute.v1.network     IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-slurm-subnet                compute.v1.subnetwork  IN_PREVIEW  []      CREATE_OR_ACQUIRE
    helloworld-ssh-firewall-rule           compute.v1.firewall    IN_PREVIEW  []      CREATE_OR_ACQUIRE
    
  2. 集群配置需要 5-10 分钟才能完成。跟踪配置的进度:

    gcloud compute ssh ${CLUSTER_NAME}-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 \
        --zones ${CLUSTER_ZONE} \
        --filter="name ~ .*login." \
        --format="value(name)" | head -n1)
    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. 如需退出集群,请按 Control+D

  3. 集群准备就绪后,安排作业以验证其是否正常运行。此作业在集群中的多个节点上运行 hostname 命令。

    gcloud compute ssh ${CLUSTER_NAME}-login1 \
        --command 'sbatch -N2 --wrap="srun hostname"' --zone $CLUSTER_ZONE
    
    gcloud compute ssh ${CLUSTER_NAME}-login1 \
        --command 'cat slurm-*.out'  --zone $CLUSTER_ZONE
    

    输出类似于以下内容:

    helloworld-compute1
    helloworld-compute2
    

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

自动扩缩 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 中,查看节点数:

    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 个临时节点处于节能模式。

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

    sbatch -N5 --wrap="srun hostname"
    

    输出类似于以下内容:

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

    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 个临时节点。创建和配置其他节点后,它们将运行作业,然后在短暂延迟后被销毁。

清理

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

删除项目

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”页面

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

删除 Slurm 集群

  • 删除集群:

    gcloud deployment-manager deployments delete slurm
    

后续步骤

  • 试用其他 Google Cloud 功能。查阅我们的教程