使用 MPI 库配置任务通信

本文档介绍了如何使用消息传递接口 (MPI) 库配置包含紧密耦合任务的批处理作业,这些任务会在不同的虚拟机之间相互通信。

对于批处理作业,耦合描述了任务之间的相互依赖关系;这会影响您如何使用作业的 parallelism 字段配置可并行(而非顺序)运行的任务数量。任务可以使用以下类型的关联进行描述:

  • 松散耦合的任务:可独立运行的任务。
  • 紧密耦合的任务:运行时彼此依赖的任务。

您可以选择创建一个使用 MPI 库的作业,以便紧密耦合的任务能够跨不同的虚拟机实例进行通信。MPI 的一个常见用例是紧密耦合的高性能计算 (HPC) 工作负载。

准备工作

  1. 如果您之前未使用过批处理功能,请参阅开始使用批处理,并完成适用于项目和用户的前提条件,以启用批处理功能。
  2. 如需获得创建作业所需的权限,请让您的管理员为您授予以下 IAM 角色:

    如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    您也可以通过自定义角色或其他预定义角色来获取所需的权限。

  3. 如果您为此作业指定了网络,请确保该网络具有允许作业的虚拟机之间建立连接的防火墙规则。了解如何为常见使用场景配置 VPC 防火墙规则

创建和运行一个作业,用于对紧密耦合的任务使用 MPI

本部分提供了有关如何创建可使用 MPI 的作业的示例。值得注意的是,示例作业有 3 个可运行作业:

  • 第一个可运行脚本是一个脚本,用于通过停用并发多线程安装 Intel MPI 为 MPI 准备作业。
  • 第二个可运行对象是一个空的屏障可运行对象(格式为 { "barrier": {} }),用于确保所有任务在完成 MPI 设置后再继续执行后续可运行对象。
  • 第三个可运行作业(以及任何后续可运行作业)可供作业的负载使用。

您可以使用 gcloud CLI 或 Batch API 创建一个作业,以便对紧密耦合的任务使用 MPI。

gcloud

如需使用 gcloud CLI 创建一个脚本作业,以便对紧密耦合的任务使用 MPI,请执行以下操作:

  1. 创建一个包含以下内容的 JSON 配置文件:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                            }
                        },
                        { "barrier": {} },
                        {
                            "script": {
                                SCRIPT
                            }
                        }
                    ]
                },
                "taskCount": TASK_COUNT,
                "taskCountPerNode": TASK_COUNT_PER_NODE,
                "requireHostsFile": REQUIRE_HOSTS_FILE,
                "permissiveSsh": PERMISSIVE_SSH
            }
        ]
    }
    

    替换以下内容:

    • SCRIPT:适用于使用 MPI 的工作负载的可运行脚本
    • TASK_COUNT:作业的任务数量。该值必须介于 1每个任务组的任务数上限之间的整数。如需使用 Batch 提供的 MPI 库,此字段是必需的,并且必须设置为 2 或更高版本。
    • TASK_COUNT_PER_NODE:作业可以在虚拟机实例上并发运行的任务数量。如需使用 Batch 提供的 MPI 库,此字段是必需的,并且必须设为 1,这相当于为每个任务运行一个虚拟机实例。
    • REQUIRE_HOSTS_FILE:如果设置为 true,作业会创建一个文件,其中列出了在任务组中运行的虚拟机实例。文件路径存储在 BATCH_HOSTS_FILE 环境变量中。如需使用 Batch 提供的 MPI 库,必须将此字段设置为 true。
    • PERMISSIVE_SSH:设置为 true 时,Batch 会配置 SSH,以允许在任务组中运行的虚拟机实例之间进行无密码通信。如需使用 Batch 提供的 MPI 库,必须将此字段设置为 true。
  2. 如需创建作业,请使用 gcloud batch jobs submit 命令

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    替换以下内容:

    • JOB_NAME:作业的名称。
    • LOCATION:作业的位置
    • JSON_CONFIGURATION_FILE:包含作业配置详细信息的 JSON 文件的路径。

您可以酌情执行以下操作,提高 Batch 提供的 MPI 库的性能:

例如,如需根据使用 MPI 的实例模板创建脚本作业,并让 1 个任务输出任务组中 3 个任务的主机名,请执行以下操作:

  1. 在当前目录中创建一个名为 example-job-uses-mpi.json 的 JSON 文件,其中包含以下内容:

    {
        "taskGroups": [
            {
                "taskSpec": {
                    "runnables": [
                        {
                            "script": {
                                "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                            }
                        },
                        { "barrier": {} },
                        {
                            "script": {
                                "text":
                                    "if [ $BATCH_TASK_INDEX = 0 ]; then
                                    mpirun -hostfile $BATCH_HOSTS_FILE -np 3 hostname;
                                    fi"
                            }
                        },
                        { "barrier": {} }
                    ]
                },
                "taskCount": 3,
                "taskCountPerNode": 1,
                "requireHostsFile": true,
                "permissiveSsh": true
            }
        ],
        "allocationPolicy": {
            "instances": [
                {
                    "instanceTemplate": "example-template-job-uses-mpi"
                }
            ]
        },
        "logsPolicy": {
            "destination": "CLOUD_LOGGING"
        }
    }
    
  2. 运行以下命令:

    gcloud batch jobs submit example-template-job-uses-mpi \
      --location us-central1 \
      --config example-job-uses-mpi.json
    

API

如需使用 Batch API 创建脚本作业,以便对紧密耦合的任务使用 MPI,请使用 jobs.create 方法并指定 permissiveSshrequireHostsFiletaskCounttaskCountPerNode 字段。

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_ID

{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "script": {
                            "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                        }
                    },
                    { "barrier": {} },
                    {
                        "script": {
                            SCRIPT
                        }
                    }
                ]
            },
            "taskCount": TASK_COUNT,
            "taskCountPerNode": TASK_COUNT_PER_NODE,
            "requireHostsFile": REQUIRE_HOSTS_FILE,
            "permissiveSsh": PERMISSIVE_SSH
        }
    ]
}

替换以下内容:

  • PROJECT_ID:您的项目的项目 ID
  • LOCATION:作业的位置
  • JOB_NAME:作业的名称。
  • SCRIPT:适用于使用 MPI 的工作负载的可运行脚本
  • TASK_COUNT:作业的任务数量。该值必须介于 1每个任务组的任务数上限之间的整数。如需使用 Batch 提供的 MPI 库,此字段是必需的,并且必须设置为 2 或更高版本。
  • TASK_COUNT_PER_NODE:作业可以在虚拟机实例上并发运行的任务数量。如需使用 Batch 提供的 MPI 库,此字段是必需的,并且必须设置为 1,这相当于每个任务运行一个虚拟机实例。
  • REQUIRE_HOSTS_FILE:如果设置为 true,作业会创建一个文件,其中列出了在任务组中运行的虚拟机实例。文件路径存储在 BATCH_HOSTS_FILE 环境变量中。如需使用 Batch 提供的 MPI 库,必须将此字段设置为 true。
  • PERMISSIVE_SSH:设置为 true 时,Batch 会配置 SSH,以允许在任务组中运行的虚拟机实例之间进行无密码通信。如需使用批处理提供的 MPI 库,必须将此字段设置为 true。

您可以酌情执行以下操作,提高 Batch 提供的 MPI 库的性能:

例如,如需根据使用 MPI 的实例模板创建脚本作业,并让 1 个任务输出任务组中 3 个任务的主机名,请使用以下请求:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/jobs?job_id=example-template-job-uses-mpi

{
    "taskGroups": [
        {
            "taskSpec": {
                "runnables": [
                    {
                        "script": {
                            "text": "google_mpi_tuning --nosmt; google_install_mpi --intel_mpi;"
                        }
                    },
                    { "barrier": {} },
                    {
                        "script": {
                            "text":
                                "if [ $BATCH_TASK_INDEX = 0 ]; then
                                mpirun -hostfile $BATCH_HOSTS_FILE -np 3 hostname;
                                fi"
                        }
                    },
                    { "barrier": {} }
                ]
            },
            "taskCount": 3,
            "taskCountPerNode": 1,
            "requireHostsFile": true,
            "permissiveSsh": true
        }
    ],
    "allocationPolicy": {
        "instances": [
            {
                "instanceTemplate": "example-template-job-uses-mpi"
            }
        ]
    },
    "logsPolicy": {
        "destination": "CLOUD_LOGGING"
    }
}

其中,PROJECT_ID 是项目的 project ID

后续步骤