本文档介绍了如何使用消息传递接口 (MPI) 库配置包含紧密耦合任务的批处理作业,这些任务会在不同的虚拟机之间相互通信。
对于批处理作业,耦合描述了任务之间的相互依赖关系;这会影响您如何使用作业的 parallelism
字段配置可并行(而非顺序)运行的任务数量。任务可以使用以下类型的关联进行描述:
- 松散耦合的任务:可独立运行的任务。
- 紧密耦合的任务:运行时彼此依赖的任务。
您可以选择创建一个使用 MPI 库的作业,以便紧密耦合的任务能够跨不同的虚拟机实例进行通信。MPI 的一个常见用例是紧密耦合的高性能计算 (HPC) 工作负载。
准备工作
- 如果您之前未使用过批处理功能,请参阅开始使用批处理,并完成适用于项目和用户的前提条件,以启用批处理功能。
-
如需获得创建作业所需的权限,请让您的管理员为您授予以下 IAM 角色:
-
项目的 Batch Job Editor (
roles/batch.jobsEditor
) -
作业的服务账号(默认为默认的 Compute Engine 服务账号)上的 Service Account User (
roles/iam.serviceAccountUser
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
-
项目的 Batch Job Editor (
- 如果您为此作业指定了网络,请确保该网络具有允许作业的虚拟机之间建立连接的防火墙规则。了解如何为常见使用场景配置 VPC 防火墙规则。
创建和运行一个作业,用于对紧密耦合的任务使用 MPI
本部分提供了有关如何创建可使用 MPI 的作业的示例。值得注意的是,示例作业有 3 个可运行作业:
- 第一个可运行脚本是一个脚本,用于通过停用并发多线程和安装 Intel MPI 为 MPI 准备作业。
- 第二个可运行对象是一个空的屏障可运行对象(格式为
{ "barrier": {} }
),用于确保所有任务在完成 MPI 设置后再继续执行后续可运行对象。 - 第三个可运行作业(以及任何后续可运行作业)可供作业的负载使用。
您可以使用 gcloud CLI 或 Batch API 创建一个作业,以便对紧密耦合的任务使用 MPI。
gcloud
如需使用 gcloud CLI 创建一个脚本作业,以便对紧密耦合的任务使用 MPI,请执行以下操作:
创建一个包含以下内容的 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。
如需创建作业,请使用
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 库的性能:
- 使用虚拟机实例模板创建和运行作业,并在作业的资源中指定支持 HPC 的虚拟机实例模板。
- 在作业的资源中,将 Cloud Logging 指定为作业日志信息的目标位置。
例如,如需根据使用 MPI 的实例模板创建脚本作业,并让 1 个任务输出任务组中 3 个任务的主机名,请执行以下操作:
在当前目录中创建一个名为
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" } }
运行以下命令:
gcloud batch jobs submit example-template-job-uses-mpi \ --location us-central1 \ --config example-job-uses-mpi.json
API
如需使用 Batch API 创建脚本作业,以便对紧密耦合的任务使用 MPI,请使用 jobs.create
方法并指定 permissiveSsh
、requireHostsFile
、taskCount
和 taskCountPerNode
字段。
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 库的性能:
- 使用虚拟机实例模板创建和运行作业,并在作业的资源中指定支持 HPC 的虚拟机实例模板。
- 在作业的资源中,将 Cloud Logging 指定为作业的日志信息的目标位置。
例如,如需根据使用 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。
后续步骤
- 如需查看使用 MPI 处理紧密耦合任务的作业的更详细示例,请参阅使用批处理运行天气研究和预测模型。
- 了解如何缩短包含紧密耦合任务的作业的延迟时间。
- 如果您在创建或运行作业时遇到问题,请参阅问题排查。
- 查看作业和任务。
- 不妨详细了解作业创建选项。