AWS Batch
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

多节点并行作业

利用多节点并行作业,您能够跨多个 Amazon EC2 实例运行单个作业。借助 AWS Batch 多节点并行作业,您可以运行大规模、紧密耦合的高性能计算应用程序和分布式 GPU 模型训练,而无需直接启动、配置和管理 Amazon EC2 资源。AWS Batch 多节点并行作业与支持基于 IP 的节点间通信的任何框架均可兼容,例如 Apache MXNet、TensorFlow、Caffe2 或消息传递接口 (MPI)。

多节点并行作业可作为单个作业提交。不过,作业定义(或作业提交节点覆盖)指定了要为作业创建的节点数量,以及要创建的节点组。每个多节点并行作业都包含一个主节点,这是最先启动的节点。主节点启动之后,子节点会启动并开始运行。如果主节点退出,则作业将视为已完成,并且子节点将停止。有关更多信息,请参阅节点组

多节点并行作业的节点为单租户,这意味着每个 Amazon EC2 实例上只有单个作业容器运行。

最终的作业状态(SUCCEEDEDFAILED)由主节点的最终作业状态决定。要获取多节点并行作业的状态,可以使用提交作业时返回的作业 ID 来描述作业。如果需要子节点的详细信息,则必须分别描述每个子节点。节点使用 #N 表示法进行寻址。例如,要访问作业第二个节点的详细信息,需要使用 AWS Batch DescribeJobs API 操作描述 aws_batch_job_id#2。多节点并行作业的 startedstoppedAtstatusReasonexit 信息从主节点进行填充。

如果指定作业重试次数,则主节点故障将触发另一次尝试,子节点故障则不会。多节点并行作业每次新的尝试都将更新其关联子节点的相应尝试。

要在 AWS Batch 上运行多节点并行作业,应用程序代码必须包含进行分布式通信所需的框架和库。

环境变量

在运行时,除了所有 AWS Batch 作业收到的标准环境变量之外,每个节点还将配置特定于多节点并行作业的以下环境变量:

AWS_BATCH_JOB_MAIN_NODE_INDEX

此变量设置为作业的主节点的索引号。您的应用程序代码可以将 AWS_BATCH_JOB_MAIN_NODE_INDEX 与单个节点上的 AWS_BATCH_JOB_NODE_INDEX 进行比较,以确定它是否为主节点。

AWS_BATCH_JOB_MAIN_NODE_PRIVATE_IPV4_ADDRESS

此变量仅在多节点并行作业子节点中设置(它在主节点上不存在)。此变量设置为作业的主节点的私有 IPv4 地址。您的子节点的应用程序代码可以使用此地址与主节点进行通信。

AWS_BATCH_JOB_NODE_INDEX

此变量设置为节点的节点索引号。节点索引从 0 开始,并且每个节点接收一个唯一的索引号。例如,包含 10 个子级的多节点并行作业具有索引值 0-9。

AWS_BATCH_JOB_NUM_NODES

此变量设置为您为多节点并行作业请求的节点数。

节点组

节点组即共享相同容器属性的一组完全相同的作业节点。您可以通过 AWS Batch 为每个作业指定最多五个不同的节点组。

每个组都有自己的容器映像、命令、环境变量等。例如,您可以提交以下作业,其中主节点需要单个 c4.xlarge 实例,子节点需要五个 c4.xlarge 实例。每个不同的节点组可以为每个作业指定不同的容器映像或要运行的命令。

或者,作业中的所有节点可以使用单个节点组,应用程序代码可以通过比较 AWS_BATCH_JOB_MAIN_NODE_INDEX 环境变量与其自己的 AWS_BATCH_JOB_NODE_INDEX 值来区分节点角色(主节点与子节点)。单个作业中最多可具有 1000 个节点。这是 Amazon ECS 集群中实例的默认限制,该限制值可根据请求增大。

注意

目前,多节点并行作业中的所有节点组必须使用相同的实例类型。

作业生命周期

在提交多节点并行作业时,作业将进入 SUBMITTED 状态,并等待任何作业依赖项以完成操作。然后,作业将进入 RUNNABLE 状态,AWS Batch 将预配置所需的实例容量,以运行作业并启动这些实例。

每个多节点并行作业都包含一个主节点。主节点是一个子任务,AWS Batch 将对其进行监控,以确定所提交的多节点作业的结果。主节点将第一个启动,并进入 STARTING 状态。

当主节点达到 RUNNING 状态时(节点的容器运行之后),子节点将启动,也进入 STARTING 状态。子节点的启动顺序是随机的。子节点启动的时机或顺序无法保证。要确保作业的所有节点都处于 RUNNING 状态(节点的容器运行之后),应用程序代码可以查询 AWS Batch API 来获取主节点和子节点信息,或者在应用程序代码内部协调等待,直到在开始任何分布式处理任务之前,所有节点均在线。主节点的私有 IP 地址可作为 AWS_BATCH_JOB_MAIN_NODE_PRIVATE_IPV4_ADDRESS 环境变量,用在每个子节点中。应用程序代码可以使用此信息,在每个任务之间协调和传输数据。

各个节点在退出后,将进入 SUCCEEDEDFAILED 状态,具体取决于其退出代码。如果主节点退出,则作业将视为已完成,并且所有子节点将停止。如果某个子节点发生故障,AWS Batch 不会对作业中的其他节点采取任何操作。如果节点数量减少后不希望作业继续,那么必须在应用程序代码中考虑此因素,以终止或取消作业。

计算环境注意事项

在配置使用 AWS Batch 运行多节点并行作业的计算环境时,需要考虑几个注意事项。

  • 如果打算将多节点并行作业提交到计算环境,请考虑在单个可用区中创建集群 置放群组,并将其与计算资源进行关联。这样可保证多节点并行作业位于实例的逻辑分组内,同时保持高的网络流量潜力。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的置放群组

  • 使用 Spot 实例的计算环境不支持多节点并行作业。

  • AWS Batch 多节点并行作业采用 Amazon ECS awsvpc 网络模式,这为多节点并行作业容器提供了与 Amazon EC2 实例相同的联网属性。每个多节点并行作业容器都可获得自己的弹性网络接口、主要私有 IP 地址以及内部 DNS 主机名。在同一 VPC 子网中创建网络接口,作为其主机计算资源。适用于计算资源的任何安全组,也适用于该主机计算资源。有关更多信息,请参阅 Amazon Elastic Container Service Developer Guide 中的 awsvpc 网络模式的任务联网

  • 与计算环境关联的安全组不得超过 5 个。

  • 创建并附加到计算资源的弹性网络接口,不能由您的账户手动分离或修改。这是为了防止意外删除与正在运行的作业关联的弹性网络接口。要释放任务的弹性网络接口,请终止作业。

  • 计算环境必须具有足够大的 vCPU 才能支持多节点并行作业。

  • Amazon EC2 实例限制必须能够满足运行作业所需的实例数量。例如,如果作业需要 30 个实例,但您的账户在区域内只能运行 20 个实例,那么作业将会卡在 RUNNABLE 状态。

  • 如果为多节点并行作业中的节点组指定了实例类型,那么计算环境必须能够启动该实例类型。