

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 作业
<a name="jobs"></a>

工作是从开始的工作单位 AWS Batch。作业可作为在 ECS 集群中的 Amazon ECS 容器实例上运行的容器化应用程序调用。

容器化作业可引用容器映像、命令和参数。有关更多信息，请参阅 [JobDefinition](https://docs.aws.amazon.com/batch/latest/APIReference/API_JobDefinition.html)。

您可以提交大量独立的简单作业。

**Topics**
+ [教程：提交作业](submit_job.md)
+ [中的服务职位 AWS Batch](service-jobs.md)
+ [任务状态](job_states.md)
+ [AWS Batch 作业环境变量](job_env_vars.md)
+ [自动作业重试](job_retries.md)
+ [作业依赖项](job_dependencies.md)
+ [作业超时](job_timeouts.md)
+ [Amazon EKS 作业](eks-jobs.md)
+ [多节点并行作业](multi-node-parallel-jobs.md)
+ [Amazon EKS 上的多节点并行作业](mnp-eks-jobs.md)
+ [数组作业](array_jobs.md)
+ [运行 GPU 作业](gpu-jobs.md)
+ [查看 AWS Batch 作业队列中的作业](view-jobs.md)
+ [在 AWS Batch 作业队列中搜索作业](searching-filtering-jobs.md)
+ [AWS Batch 作业的联网模式](networking-modes-jobs.md)
+ [在日志中查看 AWS Batch 作业 CloudWatch 日志](review-job-logs.md)
+ [查看 AWS Batch 工作信息](review-job-info.md)

# 教程：提交作业
<a name="submit_job"></a>

注册作业定义后，可以将其作为作业提交到 AWS Batch 作业队列。在运行时，可以覆盖作业定义中指定的许多参数。

**提交作业**

1. 打开 AWS Batch 控制台，网址为[https://console.aws.amazon.com/batch/](https://console.aws.amazon.com/batch/)。

1. 在导航栏中，选择 AWS 区域 要使用的。

1. 在导航窗格中，选择**作业**。

1. 选择 **Submit new job**。

1. 对于**名称**，为您的作业定义输入唯一名称。名称长度不超过 128 个字符。可以包含大小写字母、数字、连字符（-）和下划线（\$1）。

1. 对于 **Job definition**，为作业选择现有的作业定义。有关更多信息，请参阅 [创建单节点作业定义](create-job-definition.md)。

1. 在 **作业队列**选择现有作业队列。有关更多信息，请参阅 [创建作业队列](create-job-queue.md)。

1. 对于 **作业依赖关系**，选择**添加作业依赖关系**。

   1. 在**作业 ID **中，输入所有依赖项的作业 ID。然后选择**添加作业依赖关系**。一个作业最多可有 20 个依赖项。有关更多信息，请参阅 [作业依赖项](job_dependencies.md)。

1. (仅限数组作业) 对于 **Array size**，指定一个介于 2 和 10000 之间的数组大小。

1. （可选）展开 **标签**，然后选择**添加标签**以向资源添加标签。输入键和可选的值，然后选择**添加标签**。

1. 选择**下一页**。

1. 在 **作业覆盖**部分中：

   1. 

      （可选）在**计划优先级**中，输入介于 0 和 100 之间的计划优先级值。值越高，优先级越高。

   1. （可选）对于**作业尝试**，请输入 AWS Batch 尝试将作业移至某一 `RUNNABLE` 状态的最多次数。您可以输入 1 到 10 之间的数字。有关更多信息，请参阅 [自动作业重试](job_retries.md)。

   1. （可选）对于**执行超时**，输入超时值（以秒为单位）。执行超时是指未完成的作业终止之前的时间长度。如果某次尝试超过了超时时间，该尝试将停止，状态将转为 `FAILED`。有关更多信息，请参阅 [作业超时](job_timeouts.md)。最小值为 60 秒。
**重要**  
不要依赖在 Fargate 资源上运行超过 14 天的作业。14 天后，Fargate 资源可能不再可用，该作业很可能会被终止。

   1. （可选）开启 **传播标签**将标签从作业和作业定义传播到 Amazon ECS 任务。

1. 展开**其他配置**。

1. （可选）对于**重试策略条件**，选择**退出时添加评估**。至少输入一个参数值，然后选择一个**操作**。对于每组条件，必须将**操作**设置为**重试**或**退出**。这些操作意味着以下几点：
   + **重试** — AWS Batch 重试，直到达到您指定的任务尝试次数。
   + **退出** — AWS Batch 停止重试作业。
**重要**  
如果选择**退出时添加评估**，则至少配置一个参数并选择一个**操作**或选择**退出时移除评估**。

1. 对于**参数**，选择**添加参数**以添加参数替换占位符。输入一个**键**和可选的**值**。

1. 在**容器覆盖**部分中：

   1. 对于**命令**，将命令的等效 **JSON** 字符串数组输入到该字段中。

      此参数映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) [创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Cmd`，以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`COMMAND`参数。有关 Docker `CMD` 参数的更多信息，请参阅 refer [https://docs.docker.com/engine/ence/](https://docs.docker.com/engine/reference/builder/#cmd) builder/ \$1cmd。
**注意**  
此参数不能包含空字符串。

   1. 对于 **v CPUs**，输入CPUs 要为容器保留的 v 数。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`CpuShares`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--cpu-shares`选项。每个 vCPU 相当于 1024 个 CPU 份额。您必须指定至少一个 vCPU。

   1. 对于**内**存，输入容器可用的内存限制。如果您的容器尝试使用超出此处指定的内存，该容器将被终止。此参数将映射到 [Docker Remote API](https://docs.docker.com/engine/api/v1.38/) 的[创建容器](https://docs.docker.com/engine/api/v1.38/#operation/ContainerCreate)部分中的`Memory`以及[https://docs.docker.com/engine/reference/commandline/run/](https://docs.docker.com/engine/reference/commandline/run/)的`--memory`选项。您必须为作业指定至少 4 MiB 内存。
**注意**  
要最大限度地提高资源利用率，请为特定实例类型的作业确定内存优先级。有关更多信息，请参阅 [计算资源内存管理](memory-management.md)。

   1. （可选）在 “**数量**” 中 GPUs，选择 GPUs 要为集装箱保留的数量。

   1. （可选）对于**环境变量**，选择**添加环境变量**以名称-值对的形式添加环境变量。这些变量传递给容器。

   1. 选择**下一页**。

   1. 对于**任务审核**，请查看配置步骤。如果需要进行更改，请选择 **Edit**（编辑）。完成后，选择**创建作业定义**。

# 中的服务职位 AWS Batch
<a name="service-jobs"></a>

AWS Batch 服务作业允许您通过 AWS Batch 任务队列向 AWS 服务提交请求。目前， AWS Batch 支持将 SageMaker 训练作业作为服务作业。与 AWS Batch 管理底层容器执行的容器化作业不同，服务作业 AWS Batch 允许提供作业调度和排队功能，而目标 AWS 服务（例如 SageMaker AI）则处理实际的任务执行。

AWS Batch fo SageMaker r Training 作业允许数据科学家将具有优先级的训练作业提交到可配置队列，从而确保工作负载在资源可用时立即在没有干预的情况下运行。此功能可解决资源协调、防止意外超支、满足预算约束、使用预留实例优化成本等常见挑战，以及无需在团队成员之间进行手动协调。

服务作业与容器化作业有多个关键的区别：
+ **任务提交**：必须使用 [SubmitServiceJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitServiceJob.html)API 提交服务作业。无法通过 AWS Batch 控制台提交服务作业。
+ **任务执行**： AWS Batch 计划和排队服务作业，但目标 AWS 服务运行实际的作业工作负载。
+ **资源标识符**：服务作业使用 ARNs 包含 “服务作业” 而不是 “作业” 的任务来区分它们与容器化作业。

要开始使用 SageMaker 培训 AWS Batch 服务作业，请参阅[SageMaker 人工智能 AWS Batch 入门](getting-started-sagemaker.md)。

**Topics**
+ [中的服务任务有效负载 AWS Batch](service-job-payload.md)
+ [在中提交服务任务 AWS Batch](service-job-submit.md)
+ [将 AWS Batch 服务作业状态映射到 SageMaker AI 状态](service-job-status.md)
+ [中的服务作业重试策略 AWS Batch](service-job-retries.md)
+ [监控 AWS Batch 队列中的服务作业](monitor-sagemaker-job-queue.md)
+ [终止服务作业](terminate-service-jobs.md)

# 中的服务任务有效负载 AWS Batch
<a name="service-job-payload"></a>

使用提交服务作业时 [SubmitServiceJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitServiceJob.html)，您需要提供两个用于定义任务的关键参数：`serviceJobType`、和`serviceRequestPayload`。
+ `serviceJobType`指定哪个 AWS 服务将执行作业。对于 SageMaker 培训作业，此值为`SAGEMAKER_TRAINING`。
+ `serviceRequestPayload` 是一个 JSON 编码的字符串，其中包含通常会直接发送到目标服务的完整请求。对于 SageMaker 训练作业，此负载包含的参数与您在 SageMaker A [CreateTrainingJob](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html)I API 中使用的参数相同。

有关所有可用参数及其描述的完整列表，请参阅 SageMaker A [CreateTrainingJob](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html)I API 参考。`CreateTrainingJob` 支持的所有参数都可以包含在服务作业有效载荷中。

有关更多训练作业配置的示例 [APIs，请参阅 CLI 和 SDKs SageMaker ](https://docs.aws.amazon.com/sagemaker/latest/dg/api-and-sdk-reference-overview.html) [AI 开发者指南](https://docs.aws.amazon.com/sagemaker/latest/dg/gs.html)。

我们建议使用 PySDK 创建服务作业，因为 PySDK 提供了帮助程序类和实用程序。有关使用 pySDK 的示例，请参阅上的 [SageMaker AI 示例](https://github.com/aws/amazon-sagemaker-examples)。 GitHub

## 服务作业有效载荷示例
<a name="service-job-payload-example"></a>

以下示例显示了运行 “hello world” SageMaker 训练脚本的训练作业的简单服务作业负载：

调用 `SubmitServiceJob` 时，此有效载荷将作为 JSON 字符串传递给 `serviceRequestPayload` 参数。

```
{
  "TrainingJobName": "my-simple-training-job",
  "RoleArn": "arn:aws:iam::123456789012:role/SageMakerExecutionRole",
  "AlgorithmSpecification": {
    "TrainingInputMode": "File",
    "TrainingImage": "763104351884.dkr.ecr.us-west-2.amazonaws.com/pytorch-training:2.0.0-cpu-py310",
    "ContainerEntrypoint": [
      "echo",
      "hello world"
    ]
  },
  "ResourceConfig": {
    "InstanceType": "ml.c5.xlarge",
    "InstanceCount": 1,
    "VolumeSizeInGB": 1
  },
  "OutputDataConfig": {
    "S3OutputPath": "s3://your-output-bucket/output"
  },
  "StoppingCondition": {
    "MaxRuntimeInSeconds": 30
  }
}
```

# 在中提交服务任务 AWS Batch
<a name="service-job-submit"></a>

要向提交服务任务 AWS Batch，请使用 [SubmitServiceJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitServiceJob.html)API。您可以使用 AWS CLI 或 SDK 提交作业。

如果您还没有执行角色，则必须首先创建一个，然后才能提交服务作业。要创建 SageMaker AI 执行角色，请参阅 [ SageMaker AI *[开发者指南中的如何使用 SageMaker AI](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html)* 执行角色](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-roles.html)。

## 服务作业提交工作流
<a name="service-job-submit-workflow"></a>

提交服务任务时，请 AWS Batch 遵循以下工作流程：

1. AWS Batch 接收您的`[SubmitServiceJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitServiceJob.html)`请求并验证 AWS Batch特定参数。传递 `serviceRequestPayload` 但不进行验证。

1. 作业进入 `SUBMITTED` 状态并放入指定的作业队列中

1. AWS Batch 评估服务环境中是否有可用容量用于排在`RUNNABLE`队列前面的作业

1. 如果容量可用，则任务将移至`SCHEDULED`，任务已传递给 SageMaker AI

1. 获得容量并且 SageMaker AI 下载了服务作业数据后，服务作业将开始初始化并将任务更改为`STARTING`。

1. 当 SageMaker AI 开始执行任务时，其状态将更改为`RUNNING`。

1. 当 SageMaker AI 执行任务时， AWS Batch 监控其进度并将服务状态映射到 AWS Batch 作业状态。有关如何映射服务作业状态的详细信息，请参阅[将 AWS Batch 服务作业状态映射到 SageMaker AI 状态](service-job-status.md)

1. 当服务作业完成后，其状态将变为 `SUCCEEDED` 并且所有输出都可随时下载。

## 先决条件
<a name="service-job-submit-prerequisites"></a>

提交服务作业之前，请确保您满足以下条件：
+ **服务环境**：一个定义了容量限制的服务环境。有关更多信息，请参阅 [在中创建服务环境 AWS Batch](create-service-environments.md)。
+ **SageMaker 作业队列**-用于提供 SageMaker 作业调度的作业队列。有关更多信息，请参阅 [在 AWS Batch 中创建 SageMaker 训练作业队列](create-sagemaker-job-queue.md)。
+ **IAM 权限**：创建和管理 AWS Batch 作业队列和服务环境的权限。有关更多信息，请参阅 [AWS Batch IAM 策略、角色和权限](IAM_policies.md)。

## 使用 AWS CLI 提交服务作业
<a name="service-job-submit-example"></a>

以下内容显示如何使用 AWS CLI 提交服务作业：

```
aws batch submit-service-job \
    --job-name "my-sagemaker-training-job" \
    --job-queue "my-sagemaker-job-queue" \
    --service-job-type "SAGEMAKER_TRAINING" \
    --service-request-payload '{\"TrainingJobName\": \"sagemaker-training-job-example\", \"AlgorithmSpecification\": {\"TrainingImage\": \"123456789012.dkr.ecr.us-east-1.amazonaws.com/pytorch-inference:1.8.0-cpu-py3\", \"TrainingInputMode\": \"File\", \"ContainerEntrypoint\":  [\"sleep\", \"1\"]}, \"RoleArn\":\"arn:aws:iam::123456789012:role/SageMakerExecutionRole\", \"OutputDataConfig\": {\"S3OutputPath\": \"s3://example-bucket/model-output/\"}, \"ResourceConfig\": {\"InstanceType\": \"ml.m5.large\", \"InstanceCount\": 1, \"VolumeSizeInGB\": 1}}'
    --client-token "unique-token-12345"
```

有关 `serviceRequestPayload` 参数的更多信息，请参阅 [中的服务任务有效负载 AWS Batch](service-job-payload.md)。

# 将 AWS Batch 服务作业状态映射到 SageMaker AI 状态
<a name="service-job-status"></a>

使用向 SageMaker 作业队列提交作业时 [SubmitServiceJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitServiceJob.html)，会 AWS Batch 管理作业生命周期并将 AWS Batch [作业状态](job_states.md)映射到等效的 SageMaker 训练作业状态。服务作业（例如 SageMaker 训练作业）遵循的状态生命周期与传统的容器作业不同。服务作业的大多数状态与容器作业相同，不过服务作业引入了 `SCHEDULED` 状态并具有不同的重试行为，尤其是在处理目标服务容量不足错误时。

下表显示了 AWS Batch 作业状态和相应的 SageMaker状态/SecondaryStatus：


| Batch 状态 | SageMaker AI 主要状态 | SageMaker AI 二级状态 | 说明 | 
| --- | --- | --- | --- | 
| SUBMITTED | 不适用 | 不适用 | 作业已提交到队列，等待调度器评估。 | 
| RUNNABLE | 不适用 | 不适用 | 作业已排队，可以进行调度。一旦服务环境中有足够的资源可用，处于此状态的作业就会立即启动。如果没有足够的资源可用，作业会无限期地保持此状态。 | 
| SCHEDULED | InProgress | Pending | 服务作业已成功提交给 SageMaker AI | 
| STARTING | InProgress | Downloading | SageMaker 下载数据和图像的训练作业。已取得训练作业容量，并且已开始作业初始化。 | 
| RUNNING | InProgress | Training | SageMaker 训练作业执行算法  | 
| RUNNING | InProgress | Uploading | SageMaker 训练作业在训练完成后上传输出工件 | 
| SUCCEEDED | Completed | Completed | SageMaker 训练作业成功完成。已完成输出构件上传。 | 
| FAILED | Failed | Failed | SageMaker 训练作业遇到了一个不可恢复的错误。 | 
| FAILED | Stopped | Stopped | SageMaker 已使用手动停止训练作业StopTrainingJob。 | 

# 中的服务作业重试策略 AWS Batch
<a name="service-job-retries"></a>

服务作业重试策略 AWS Batch 允许在特定条件下自动重试失败的服务作业。

由于多方面的原因，服务作业可能需要多次尝试：
+ **临时服务问题**：内部服务错误、节流或临时中断可能会导致作业在提交或执行期间失败。
+ **训练初始化失败**：作业启动期间出现的问题（例如映像提取问题或初始化错误）可能会在重试后得到解决。

通过配置适当的重试策略，可以提高作业成功率并减少手动干预需要，尤其是对于长时间运行的训练工作负载。

**注意**  
服务作业会自动重试某些类型的失败（例如容量不足错误），而不会消耗您配置的重试次数。您的重试策略主要处理其他类型的失败，例如算法错误或服务问题。

## 配置重试策略
<a name="configuring-service-job-retries"></a>

使用配置服务作业重试策略 [ServiceJobRetryStrategy](https://docs.aws.amazon.com/batch/latest/APIReference/API_ServiceJobRetryStrategy.html)，它支持简单的重试计数和有条件的重试逻辑。

### 重试配置
<a name="basic-retry-configuration"></a>

最简单的重试策略会指定服务作业失败后应进行的重试次数：

```
{
  "retryStrategy": {
    "attempts": 3
  }
}
```

此配置允许在服务作业失败后最多重试 3 次。

**重要**  
`attempts` 值表示可以将作业置于 `RUNNABLE` 状态的总次数，包括首次尝试。值为 3 表示该作业将首次尝试一次，如果失败，则最多可再重试 2 次。

### 使用重试配置 evaluateOnExit
<a name="advanced-retry-configuration"></a>

您可以使用 `evaluateOnExit` 参数来指定应重试或放任作业失败的条件。当不同类型的失败需要不同的处理方式时，这将非常实用。

`evaluateOnExit` 数组最多可以包含 5 个重试策略，每种策略都根据状态原因指定一个操作（`RETRY` 或 `EXIT`）以及条件：

```
{
  "retryStrategy": {
    "attempts": 5,
    "evaluateOnExit": [
      {
        "action": "RETRY",
        "onStatusReason": "Received status from SageMaker: InternalServerError*"
      },
      {
        "action": "EXIT",
        "onStatusReason": "Received status from SageMaker: ValidationException*"
      },
      {
        "action": "EXIT",
        "onStatusReason": "*"
      }
    ]
  }
}
```

此配置：
+ 重试由于 SageMaker AI 内部服务器错误而失败的作业
+ 立即让遇到验证异常（无法通过重试解决的客户端错误）的作业失败
+ 包括适用于任何其他故障失败类型的 catch-all 退出规则

#### 状态原因模式匹配
<a name="status-reason-patterns"></a>

`onStatusReason` 参数最多支持 512 个字符的模式匹配。模式可以使用通配符 (\$1)，并与 SageMaker AI 返回的状态原因进行匹配。

对于服务作业， SageMaker 来自 AI 的状态消息以 “接收的状态来自 SageMaker:” 为前缀，以将其与 AWS Batch生成的消息区分开来。常见模式包括：
+ `Received status from SageMaker: InternalServerError*`：匹配内部服务错误
+ `Received status from SageMaker: ValidationException*`：匹配客户端验证错误
+ `Received status from SageMaker: ResourceLimitExceeded*`：匹配资源限制错误
+ `*CapacityError*`：匹配与容量相关的失败

**提示**  
使用特定的模式匹配来适当地恰当处理不同的错误类型。例如，重试内部服务器错误，但如果出现表明作业参数存在问题的验证错误，则立即失败。

# 监控 AWS Batch 队列中的服务作业
<a name="monitor-sagemaker-job-queue"></a>

您可以使用和监控 SageMaker 训练作业队列中作业的状态`get-job-queue-snapshot`。`list-service-jobs`

查看队列中正在运行的作业：

```
aws batch list-service-jobs \
  --job-queue my-sm-training-fifo-jq \
  --job-status RUNNING
```

查看队列中正在等待的作业：

```
aws batch list-service-jobs \
  --job-queue my-sm-training-fifo-jq \
  --job-status RUNNABLE
```

查看已提交 SageMaker 但尚未运行的作业：

```
aws batch list-service-jobs \
  --job-queue my-sm-training-fifo-jq \
  --job-status SCHEDULED
```

获取队列中排名最前的作业快照：

```
aws batch get-job-queue-snapshot --job-queue my-sm-training-fifo-jq
```

此命令会显示队列中即将执行的服务作业的顺序。

## 获取详细的服务作业信息
<a name="describe-service-job"></a>

使用 [https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeServiceJob.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeServiceJob.html) 操作可以获取有关特定服务作业的全面信息，包括其当前状态、服务资源标识符和详细尝试信息。

查看有关特定作业的详细信息：

```
aws batch describe-service-job \
  --job-id a4d6c728-8ee8-4c65-8e2a-9a5e8f4b7c3d
```

此命令会返回有关此作业的全面信息，包括：
+ 作业 ARN 和当前状态
+ 服务资源标识符（例如 SageMaker 训练作业 ARN）
+ 调度优先级和重试配置
+ 包含原始服务参数的服务请求有效载荷
+ 详细尝试信息，包括启动和停止时间
+ 来自目标服务的状态消息

## 监控 SageMaker 培训作业
<a name="monitor-sagemaker-training-jobs"></a>

通过监控 SageMaker 训练作业时 AWS Batch，您可以访问 AWS Batch 作业信息和基础 SageMaker 培训作业详细信息。

任务详情中的服务资源标识符包含 SageMaker 训练作业 ARN：

```
{
  "latestAttempt": {
    "serviceResourceId": {
      "name": "TrainingJobArn",
      "value": "arn:aws:sagemaker:us-east-1:123456789012:training-job/my-training-job"
    }
  }
}
```

您可以使用此 ARN 直接从以下地址获取更多详情： SageMaker

```
aws sagemaker describe-training-job \
  --training-job-name my-training-job
```

通过检查 AWS Batch 状态和 SageMaker 训练作业状态来监控作业进度。 AWS Batch 作业状态显示整个作业生命周期，而 SageMaker 训练作业状态则提供有关训练过程的特定于服务的详细信息。

# 终止服务作业
<a name="terminate-service-jobs"></a>

使用 [https://docs.aws.amazon.com/batch/latest/APIReference/API_TerminateServiceJob.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_TerminateServiceJob.html) 操作停止正在运行的服务作业。

终止特定的服务作业：

```
aws batch terminate-service-job \
  --job-id a4d6c728-8ee8-4c65-8e2a-9a5e8f4b7c3d \
  --reason "Job terminated by user request"
```

当您终止服务作业时，会 AWS Batch 停止该任务并通知目标服务。对于 SageMaker 训练作业，这也会停止 SageMaker AI 中的训练作业。

# 任务状态
<a name="job_states"></a>

当您将作业提交到 AWS Batch 作业队列时，该作业将进入`SUBMITTED`状态。随后，它将经历以下状态，直至成功（退出并返回代码 `0`）或失败（退出并返回非零代码）。 AWS Batch 任务可具有以下状态：

`SUBMITTED`  
已提交到队列但仍尚未由计划程序评估的任务。计划程序将评估作业，确定在成功完成任何其他作业之前是否有任何未完成的依赖项。如果存在依赖项，作业将进入 `PENDING` 状态。如果不存在依赖项，作业将进入 `RUNNABLE` 状态。

`PENDING`  
驻留在队列中但因依赖其他作业或资源而导致尚无法运行的作业。在满足依赖关系后，作业将进入 `RUNNABLE` 状态。  
阵列作业父项`PENDING`会更新到任何子作业更新到的时间，`RUNNABLE`并在子作业运行时保持其`PENDING`状态。要查看这些作业，请按`PENDING`状态筛选，直到所有子作业都达到终止状态。

`RUNNABLE`  
驻留在队列中的没有任何未完成依赖项的作业，可在主机中计划运行该作业。一旦映射到作业队列的某个计算环境提供足够的资源，处于此状态的作业就会启动。不过，当没有足够资源可用时，作业会无限期地保持此状态。  
如果您的任务未进行到 `STARTING`，请参阅故障排除部分中的 [作业在`RUNNABLE`状态卡住](job_stuck_in_runnable.md)。

`STARTING`  
已在主机上计划运行这些作业，并且相关的容器启动操作正在进行中。在提取容器映像并且容器已启动并运行后，作业将过渡到 `RUNNING` 状态。  
图像提取持续时间、Amazon EKS initContainer 完成持续时间和 Amazon ECS containerDependency 解析持续时间处于“启动”状态。为作业提取映像所用时间等于作业处于 STARTING 状态的时长。  
例如，如果提取作业的映像需要三分钟，则您的作业将处于“启动”状态三分钟。如果 initContainers 总共需要十分钟才能完成，则您的 Amazon EKS 作业将在“启动”状态下持续十分钟。如果您的 Amazon ECS 作业中设置了 Amazon ECS containerDependencies，则在解析所有容器依赖项（其运行时）之前，该作业将处于“启动”状态。“启动”不包含在超时中；持续时间从“运行”开始。有关更多信息，请参阅[作业状态](https://docs.aws.amazon.com/batch/latest/userguide/job_states.html)。

`RUNNING`  
作业正作为容器作业在计算环境中的 Amazon ECS 容器实例上运行。当作业容器退出时，进程退出代码将确定作业是成功还是失败。退出代码 `0` 表示成功，非零退出代码表示失败。如果作业与失败的尝试关联，但在其可选重试策略配置中还有剩余的尝试次数，则作业将再次进入 `RUNNABLE` 状态。有关更多信息，请参阅 [自动作业重试](job_retries.md)。  
`RUNNING`作业日志可在 CloudWatch 日志中找到。日志组是 `/aws/batch/job`，日志流名称格式如下：`first200CharsOfJobDefinitionName/default/ecs_task_id`。这种格式未来可能会改变。  
任务达到`RUNNING`状态后，您可以通过 [DescribeJobs](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeJobs.html)API 操作以编程方式检索其日志流名称。有关更多信息，请参阅 *Amazon Logs 用户指南中的查看发送到 CloudWatch CloudWatch 日志*[的日志数据](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#ViewingLogData)。默认情况下，这些日志永不过期。但是，您可以修改备份保留期。有关更多信息，请参阅 *Amazon Lo CloudWatch gs 用户指南中的更改 CloudWatch 日志*[数据保留期](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SettingLogRetention.html)。

`SUCCEEDED`  
作业已成功完成，并返回退出代码 `0`。作业的`SUCCEEDED`作业状态会持续 AWS Batch 至少 7 天。  
`SUCCEEDED`作业日志可在 CloudWatch 日志中找到。日志组是 `/aws/batch/job`，日志流名称格式如下：`first200CharsOfJobDefinitionName/default/ecs_task_id`。这种格式未来可能会改变。  
任务达到`RUNNING`状态后，您可以通过 [DescribeJobs](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeJobs.html)API 操作以编程方式检索其日志流名称。有关更多信息，请参阅 *Amazon Logs 用户指南中的查看发送到 CloudWatch CloudWatch 日志*[的日志数据](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#ViewingLogData)。默认情况下，这些日志永不过期。但是，您可以修改备份保留期。有关更多信息，请参阅 *Amazon Lo CloudWatch gs 用户指南中的更改 CloudWatch 日志*[数据保留期](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SettingLogRetention.html)。

`FAILED`  
在执行所有可用尝试后，作业失败。`FAILED` 作业的作业状态在 AWS Batch 中保留至少 7 天。  
`FAILED`作业日志可在 CloudWatch 日志中找到。日志组是 `/aws/batch/job`，日志流名称格式如下：`first200CharsOfJobDefinitionName/default/ecs_task_id`。这种格式未来可能会改变。  
任务达到`RUNNING`状态后，您可以通过 [DescribeJobs](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeJobs.html)API 操作以编程方式检索其日志流。有关更多信息，请参阅 *Amazon Logs 用户指南中的查看发送到 CloudWatch CloudWatch 日志*[的日志数据](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#ViewingLogData)。默认情况下，这些日志永不过期。但是，您可以修改备份保留期。有关更多信息，请参阅 *Amazon Lo CloudWatch gs 用户指南中的更改 CloudWatch 日志*[数据保留期](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SettingLogRetention.html)。

# AWS Batch 作业环境变量
<a name="job_env_vars"></a>

AWS Batch 在容器作业中设置特定的环境变量。这些环境变量为作业中的容器提供了内省能力。您可以在应用程序的逻辑中使用这些变量的值。所有 AWS Batch 设置的变量都以`AWS_BATCH_`前缀开头。这是受保护的环境变量前缀。在作业定义或覆盖中，您不能将此前缀用于自己的变量。

以下环境变量在作业容器中可用：

`AWS_BATCH_CE_NAME`  
此变量设置为您的作业所在的计算环境的名称。

`AWS_BATCH_JOB_ARRAY_INDEX`  
此变量仅在子数组作业中设置。数组作业索引从 0 开始，并且每个子作业接收一个唯一索引编号。例如，包含 10 个子级的数组作业具有索引值 0-9。您可以使用此索引值来控制数组作业子级的差异。有关更多信息，请参阅 [使用数组作业索引控制作业差异化](array_index_example.md)。

`AWS_BATCH_JOB_ARRAY_SIZE`  
此变量设置为父数组作业的大小。父数组作业的大小在此变量中传递给子数组作业。

`AWS_BATCH_JOB_ATTEMPT`  
此变量设置为作业尝试次数。第一次尝试编号为 1。有关更多信息，请参阅 [自动作业重试](job_retries.md)。

`AWS_BATCH_JOB_ID`  
此变量设置为作 AWS Batch 业 ID。

`AWS_BATCH_JOB_KUBERNETES_NODE_UID`  
此变量设置为运行容器组（pod）的 Kubernetes 集群中的节点对象的 Kubernetes UID。此变量仅适用于在 Amazon EKS 资源上运行的作业。有关更多信息，请参阅*Kubernetes文档*中的[UIDs](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids)。

`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_JQ_NAME`  
此变量将设置为您的作业提交到的作业队列的名称。

# 自动作业重试
<a name="job_retries"></a>

您可以将重试策略应用于作业和作业定义，这将允许失败的作业自动重试。可能的失败场景包括以下情况：
+ 来自容器作业的任何非零退出代码
+ Amazon EC2 实例失败或终止
+ 内部 AWS 服务错误或中断

在将作业提交到作业队列并置于 `RUNNING` 状态时，将视为一次尝试。默认情况下，每个作业均可尝试移至 `SUCCEEDED` 或 `FAILED` 作业状态一次。不过，作业定义和作业提交工作流都可以用来指定一个具有 1 至 10 次尝试的重试策略。如果[evaluateOnExit](job_definition_parameters.md#retryStrategy-evaluateOnExit)已指定，则它最多可以包含 5 个重试策略。如果[evaluateOnExit](https://docs.aws.amazon.com/batch/latest/APIReference/API_EvaluateOnExit.html)已指定，但所有重试策略都不匹配，则会重试该作业。对于与退出不匹配的作业，请添加因任何原因退出的最终条目。例如，此 `evaluateOnExit` 对象有两个操作为 `RETRY` 的条目，和一个操作为 `EXIT` 的最后一个条目。

```
"evaluateOnExit": [
    {
        "action": "RETRY",
        "onReason": "AGENT"
    },
    {
        "action": "RETRY",
        "onStatusReason": "Task failed to start"
    },
    {
        "action": "EXIT",
        "onReason": "*"
    }
]
```

在运行时，`AWS_BATCH_JOB_ATTEMPT` 环境变量将设置为容器的相应作业尝试次数。第一次尝试的编号为 `1`，后续尝试的编号按升序排列 (2、3、4，以此类推)。

例如，假设作业尝试因任何原因失败，并且重试配置中指定的尝试次数大于 `AWS_BATCH_JOB_ATTEMPT` 数。则该作业被放回 `RUNNABLE` 状态。有关更多信息，请参阅 [任务状态](job_states.md)。

**注意**  
不会重试已取消或终止的作业。此外，也不会重试因作业定义无效而导致失败的作业。

有关更多信息，请参阅 [重试策略](job_definition_parameters.md#retryStrategy)、[创建单节点作业定义](create-job-definition.md)、[教程：提交作业](submit_job.md) 和[已停止的任务错误代码](https://docs.aws.amazon.com/AmazonECS/latest/userguide/stopped-task-error-codes.html)。

# 作业依赖项
<a name="job_dependencies"></a>

提交 AWS Batch 作业时，您可以指定 IDs 该作业所依赖的作业。当你这样做时， AWS Batch 调度器会确保你的作业只有在指定的依赖关系成功完成后才会运行。成功后，依赖性作业将从 `PENDING` 转换到 `RUNNABLE`，然后再转换到 `STARTING` 和 `RUNNING`。如果任何作业依赖项失败，则依赖性作业会自动从 `PENDING` 转换到 `FAILED`。

例如，作业 A 可依赖于最多 20 个作业，这些作业必须成功，然后才能运行作业 A。然后，您可以提交依赖于作业 A 的其他作业，最多 19 个其他作业。

对于数组作业，您可以指定 `SEQUENTIAL` 类型依赖项，而无需指定作业 ID，以便每个子数组作业按顺序完成 (从索引 0 开始)。您也可以使用作业 ID 指定 `N_TO_N` 类型依赖项。这样一来，此作业的每个子索引必须等待每个依赖项的相应子索引完成后才能开始。有关更多信息，请参阅 [数组作业](array_jobs.md)。

要提交具有依赖关系的 AWS Batch 作业，请参阅[教程：提交作业](submit_job.md)。

[资源感知调度](resource-aware-scheduling.md) 允许您根据运行作业所需的消耗性资源来调度作业。您可以指定作业运行所需的消耗性资源，Batch 在调度作业时会考虑这些资源依赖项。您可以通过仅分配具有全部所需资源的作业来减少计算资源利用不足的情况。资源感知调度支持 FIFO 和公平份额调度策略，并且可以与 Batch 支持的所有计算平台结合使用，包括 EKS、ECS 和 Fargate。此功能可用于数组作业、多节点并行（MNP）作业和常规 Batch 作业。

# 作业超时
<a name="job_timeouts"></a>

可以为作业配置超时时间，以便在某个作业运行的时间超过超时时间时让 AWS Batch 终止该作业。例如，您可能有一个作业，并且您知道该作业只需 15 分钟即可完成。有时，您的应用程序会陷入循环并永远运行，因此您可以将超时设置为 30 分钟以终止卡住的作业。

**重要**  
默认情况下， AWS Batch 没有任务超时。如果您未定义作业超时，则作业将一直运行到容器退出。

您可以指定一个 `attemptDurationSeconds` 参数，该参数必须至少为 60 秒，在您的任务定义中，或者在您提交任务时。在任务尝试的时间`startedAt`戳之后经过此秒数后， AWS Batch 将终止该作业。在计算资源上，作业的容器会收到 `SIGTERM` 信号，以便为应用程序提供正常关闭的机会。如果容器在 30 秒后仍在运行，则会发送 `SIGKILL` 信号以强制关闭容器。

超时终止是基于最佳效果来处理的。您不应期望超时终止正好在作业尝试超时时执行（可能有几秒钟的延迟）。如果您的应用程序需要精确的超时执行，您应该在该应用程序中实施此逻辑。如果您有大量任务同时超时，超时终止的行为将类似于先入先出队列，在此队列中，任务是成批终止的。

**注意**  
 AWS Batch 作业没有最大超时值。

如果某个任务因超过超时时间而终止，它不会被重试。如果任务尝试自行失败，则当启用了重试并且超时倒计时对新尝试重新开始时，该任务可能会重试。

**重要**  
在 Fargate 资源上运行的作业不能期望运行超过 14 天。如果超时时间超过 14 天，Fargate 资源可能不再可用，作业将被终止。

对于数组任务，子任务与父任务具有相同的超时配置。

有关提交带有超时配置的 AWS Batch 作业的信息，请参阅[教程：提交作业](submit_job.md)。

# Amazon EKS 作业
<a name="eks-jobs"></a>

作业是最小的工作单位 AWS Batch。Amazon EKS 上的 AWS Batch 作业具有到Kubernetes容器的 one-to-one映射。 AWS Batch 作业定义是 AWS Batch 作业的模板。提交 AWS Batch 作业时，您可以引用作业定义、定位作业队列并提供作业名称。在 Amazon EKS 上 AWS Batch 作业的任务定义中，[eksProper](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksProperties.html) ties 参数定义了 AWS Batch 亚马逊 EKS 上作业支持的一组参数。在[SubmitJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitJob.html)请求中，该[eksPropertiesOverride](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksPropertiesOverride.html)参数允许覆盖某些常用参数。这样，您就可以为多个作业使用作业定义模板。将任务分派到您的 Amazon EKS 集群时，会将该任务 AWS Batch 转换为 `podspec` (`Kind: Pod`)。`podspec`使用一些附加 AWS Batch 参数来确保作业的扩展和调度正确。 AWS Batch 结合标签和污点，确保作业仅在 AWS Batch 托管节点上运行，而其他 pod 不会在这些节点上运行。

**重要**  
如果未在 Amazon EKS 任务定义中明确设置该`hostNetwork`参数，则 AWS Batch 默认情况下的 pod 联网模式为主机模式。更具体地说，将应用以下设置：`hostNetwork=true` 和 `dnsPolicy=ClusterFirstWithHostNet`。
AWS Batch 在 pod 完成任务后立即清理任务窗格。要查看容器组（pod）应用程序日志，请为您的集群配置日志服务。有关更多信息，请参阅 [使用 CloudWatch 日志监控 Amaz AWS Batch on EKS 作业](batch-eks-cloudwatch-logs.md)。

**Topics**
+ [教程：将正在运行的作业映射到容器组（pod）和节点](eks-jobs-map-running-job.md)
+ [教程：将正在运行的容器组（pod）映射回其作业](eks-jobs-map-running-pod-to-job.md)

# 教程：将正在运行的作业映射到容器组（pod）和节点
<a name="eks-jobs-map-running-job"></a>

正在运行的作业的 `podProperties` 具有为当前作业尝试设置的 `podName` 参数和 `nodeName` 参数。使用 [DescribeJobs](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeJobs.html)API 操作查看这些参数。

下面是示例输出。

```
$ aws batch describe-jobs --job 2d044787-c663-4ce6-a6fe-f2baf7e51b04
{
 "jobs": [
  {
   "status": "RUNNING",
   "jobArn": "arn:aws:batch:us-east-1:123456789012:job/2d044787-c663-4ce6-a6fe-f2baf7e51b04",
   "jobDefinition": "arn:aws:batch:us-east-1:123456789012:job-definition/MyJobOnEks_SleepWithRequestsOnly:1",
   "jobQueue": "arn:aws:batch:us-east-1:123456789012:job-queue/My-Eks-JQ1",
   "jobId": "2d044787-c663-4ce6-a6fe-f2baf7e51b04",
   "eksProperties": {
    "podProperties": {
     "nodeName": "ip-192-168-55-175.ec2.internal",
     "containers": [
      {
       "image": "public.ecr.aws/amazonlinux/amazonlinux:2",
       "resources": {
        "requests": {
         "cpu": "1",
         "memory": "1024Mi"
        }
       }
      }
     ],
     "podName": "aws-batch.b0aca953-ba8f-3791-83e2-ed13af39428c"
    }
   }
  }
 ]
}
```

对于启用了重试功能的作业，[DescribeJobs](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeJobs.html)API 操作`nodeName`的`eksAttempts`列表参数中包含每次已完成尝试的`podName`和。当前运行尝试的 `podName` 和 `nodeName` 在 `podProperties` 对象中。

# 教程：将正在运行的容器组（pod）映射回其作业
<a name="eks-jobs-map-running-pod-to-job"></a>

Pod `uuid` 的标签表示它所属的计算环境的`jobId`和。 AWS Batch 注入环境变量，以便作业的运行时可以引用作业信息。有关更多信息，请参阅 [AWS Batch 作业环境变量](job_env_vars.md)。您可以运行以下命令以查看此信息。输出如下所示。

```
$ kubectl describe pod aws-batch.14638eb9-d218-372d-ba5c-1c9ab9c7f2a1 -n my-aws-batch-namespace
Name:         aws-batch.14638eb9-d218-372d-ba5c-1c9ab9c7f2a1
Namespace:    my-aws-batch-namespace
Priority:     0
Node:         ip-192-168-45-88.ec2.internal/192.168.45.88
Start Time:   Wed, 26 Oct 2022 00:30:48 +0000
Labels:       batch.amazonaws.com/compute-environment-uuid=5c19160b-d450-31c9-8454-86cf5b30548f
              batch.amazonaws.com/job-id=f980f2cf-6309-4c77-a2b2-d83fbba0e9f0
              batch.amazonaws.com/node-uid=a4be5c1d-9881-4524-b967-587789094647
...
Status:       Running
IP:           192.168.45.88
IPs:
  IP:  192.168.45.88
Containers:
  default:
    Image:         public.ecr.aws/amazonlinux/amazonlinux:2
    ...
    Environment:
      AWS_BATCH_JOB_KUBERNETES_NODE_UID:  a4be5c1d-9881-4524-b967-587789094647
      AWS_BATCH_JOB_ID:                   f980f2cf-6309-4c77-a2b2-d83fbba0e9f0
      AWS_BATCH_JQ_NAME:                  My-Eks-JQ1
      AWS_BATCH_JOB_ATTEMPT:              1
      AWS_BATCH_CE_NAME:                  My-Eks-CE1

...
```

**AWS Batch Amazon EKS 工作支持的功能**

以下是在 Amazon EKS 上运行的Kubernetes作业也很常见的 AWS Batch 特定功能：
+ [作业依赖项](job_dependencies.md)
+ [数组作业](array_jobs.md)
+ [作业超时](job_timeouts.md)
+ [自动作业重试](job_retries.md)
+ [使用公平份额调度来帮助调度作业](fair-share-scheduling.md)

**Kubernetes 和 `Secrets``ServiceAccounts`**  
AWS Batch 支持引用Kubernetes`Secrets`和。`ServiceAccounts`您可以配置容器组（pod）将 Amazon EKS IAmazon EKS IAM 角色用于服务账户。有关更多信息，请参阅 [https://docs.aws.amazon.com/eks/latest/userguide/](https://docs.aws.amazon.com/eks/latest/userguide/)中的[将容器组（pod）配置为使用Kubernetes服务账户](https://docs.aws.amazon.com/eks/latest/userguide/pod-configuration.html)。

**相关文档**
+ [Amazon EKS 上 AWS Batch 的内存和 vCPU 注意事项](memory-cpu-batch-eks.md)
+ [运行 GPU 作业](gpu-jobs.md)
+ [作业在`RUNNABLE`状态卡住](job_stuck_in_runnable.md)

# 多节点并行作业
<a name="multi-node-parallel-jobs"></a>

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

多节点并行作业可作为单个作业提交。不过，作业定义（或作业提交节点覆盖）指定了要为作业创建的节点数量，以及要创建的节点组。每个多节点并行作业都包含一个**主节点**，这是最先启动的节点。主节点启动之后，子节点会启动并开始运行。只有当主节点退出时，作业才会完成。然后停止所有子节点。有关更多信息，请参阅 [节点组](mnp-node-groups.md)。

多节点并行作业节点为单租户。这意味着，在每个 Amazon ECS 实例上只运行一个作业容器。

最终的作业状态（`SUCCEEDED` 或 `FAILED`）由主节点的最终作业状态决定。要获取多节点并行作业的状态，可以使用提交作业时返回的作业 ID 来描述作业。如果需要子节点的详细信息，则必须分别描述每个子节点。您可以使用 `#N` 表示法（从 0 开头）对节点进行寻址。例如，要访问任务的第二个节点的详细信息，请使用 AWS Batch [DescribeJobs](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeJobs.html)API 操作描述 *aws\$1batch\$1job\$1id* \$11。多节点并行作业的 `started`、`stoppedAt`、`statusReason` 和 `exit` 信息从主节点进行填充。

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

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

**Topics**
+ [环境变量](mnp-env-vars.md)
+ [节点组](mnp-node-groups.md)
+ [MNP 作业的作业生命周期](job-lifecycle.md)
+ [MNP 的计算环境注意事项 AWS Batch](mnp-ce.md)

# 环境变量
<a name="mnp-env-vars"></a>

在运行时，每个节点都配置了所有 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`  
此变量设置为您为多节点并行作业请求的节点数。

# 节点组
<a name="mnp-node-groups"></a>

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

每个组都有自己的容器映像、命令、环境变量等。例如，您可以提交一项作业，要求有一个主节点 `c5.xlarge` 实例和五个 `c5.xlarge` 实例子节点。这些不同的节点组中的每一个都可以为每个作业指定不同的容器映像或命令来运行。

或者，作业中的所有节点都可以使用单个节点组。此外，您的应用程序代码可以区分节点角色，例如主节点和子节点。它通过将 `AWS_BATCH_JOB_MAIN_NODE_INDEX` 环境变量与其自身的 `AWS_BATCH_JOB_NODE_INDEX` 值进行比较来实现此目的。单个作业中最多可具有 1000 个节点。这是 Amazon ECS 群集中的实例数的默认限制。您可以 [请求增加此限制的值](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)。

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

# MNP 作业的作业生命周期
<a name="job-lifecycle"></a>

当您提交多节点并行作业时，该作业会进入 `SUBMITTED` 状态。然后，该作业会等待任何作业依赖关系完成。作业也会变为 `RUNNABLE` 状态。最后 AWS Batch ，配置运行任务所需的实例容量并启动这些实例。

每个多节点并行作业都包含一个**主节点**。主节点是单个子任务， AWS Batch 用于监控以确定已提交的多节点作业的结果。主节点将第一个启动，并进入 `STARTING` 状态。`attemptDurationSeconds` 参数中指定的超时值适用于整个作业，而不适用于节点。

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

各个节点在退出后，将进入 `SUCCEEDED` 或 `FAILED` 状态，具体取决于其退出代码。如果主节点退出，则作业将视为已完成，并且所有子节点将停止。如果子节点死亡，则 AWS Batch 不会对任务中的其他节点执行任何操作。如果节点数量减少后不希望作业继续，那么必须在应用程序代码中考虑此因素。这样做会终止或取消作业。

# MNP 的计算环境注意事项 AWS Batch
<a name="mnp-ce"></a>

在配置使用 AWS Batch运行多节点并行作业的计算环境时，需要考虑几个注意事项。
+ `UNMANAGED` 计算环境不支持多节点并行作业。
+ 如果打算将多节点并行作业提交到计算环境，请在单个可用区中创建*集群* 置放群组，并将其与计算资源进行关联。这样可保证多节点并行作业位于实例的逻辑分组内，同时保持高的网络流量潜力。有关更多信息，请参阅《Amazon EC2 用户指南》中的[置放群组](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html)**。
+ 使用竞价型实例的计算环境不支持多节点并行作业。
+ AWS Batch 多节点并行任务使用 Amazon ECS `awsvpc` 网络模式，该模式为您的多节点并行任务容器提供了与 Amazon EC2 实例相同的联网属性。每个多节点并行作业容器都可获得自己的弹性网络接口、主要私有 IP 地址以及内部 DNS 主机名。在同一 VPC 子网中创建网络接口，作为其主机计算资源。
+ 与计算环境关联的安全组不得超过 5 个。创建并附加到 MNP 任务的弹性网络接口将使用在计算环境中指定的安全组。如果未指定安全组，则会使用 VPC 的默认安全组。
+ 对于具有公有 IP 地址的多节点并行作业，`awsvpc` 网络模式不提供弹性网络接口。要访问 Internet，必须在配置为使用 NAT 网关的私有子网中启动计算资源。有关更多信息，请参阅 *Amazon VPC 用户指南*中的 [NAT 网关](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)。节点间通信必须使用节点的私有 IP 地址或 DNS 主机名。运行于公有子网内计算资源之上的多节点并行作业，无出站网络访问。要创建具有私有子网和 NAT 网关的 VPC，请参阅[创建虚拟私有云](create-public-private-vpc.md)。
+ 创建并附加到计算资源的弹性网络接口，不能由您的账户手动分离或修改。这是为了防止意外删除与正在运行的作业关联的弹性网络接口。要释放任务的弹性网络接口，请终止作业。
+ 您的计算环境必须有足够的最大 v CPUs 才能支持您的多节点 parallel 作业。
+ 您的 Amazon EC2 实例限额包括运行作业所需的实例数量。例如，如果作业需要 30 个实例，但您的账户在区域内只能运行 20 个实例。则您的工作会卡在 `RUNNABLE` 状态中。
+ 如果为多节点并行作业中的节点组指定了实例类型，那么计算环境必须能够启动该实例类型。

# Amazon EKS 上的多节点并行作业
<a name="mnp-eks-jobs"></a>

您可以 AWS Batch 在 Amazon Elastic Kubernetes Service 上使用在托管集群上运行多节点并行 (MNP) 作业（也*称为*群组调度）。Kubernetes此选项通常用于无法在单个 Amazon Elastic Compute Cloud 实例上运行的大型的紧密耦合高性能作业。有关更多信息，请参阅 [多节点并行作业](multi-node-parallel-jobs.md)。

您可以使用此功能运行 Amazon EKS 托管的特定于 Kubernetes 的高性能计算应用程序、大型语言模型训练和其他人工智能（AI）/机器学习（ML）作业。

**Topics**
+ [运行 MNP 作业](mnp-eks-running-mnp-jobs.md)
+ [创建 Amazon EKS MNP 作业定义](mnp-eks-create-eks-mnp-job-definition.md)
+ [提交 Amazon EKS MNP 作业](mnp-eks-submit-eks-mnp-job.md)
+ [覆盖 Amazon EKS MNP 作业定义](mnp-eks-override-eks-mnp-job-definition.md)

# 运行 MNP 作业
<a name="mnp-eks-running-mnp-jobs"></a>

AWS Batch 支持使用亚马逊 EC2 的亚马逊弹性容器服务和亚马逊 EKS 上的 MNP 任务。以下内容提供有关该功能的实例和容器参数的更多细节。

## Amazon EKS 上的 MNP 的实例配额
<a name="mnp-eks-instance-quotas"></a>
+ 单个 MNP 作业最多可使用 1000 个实例。
+ 最多可以有 5000 个实例加入单个 Amazon EKS 集群。
+ 最多可以将 5 个计算环境集群化并附加到作业队列。

例如，您可以在一个作业队列中最多扩展 5 个集群计算环境，在每个计算环境中最多可扩展 1000 个实例。

除了实例参数外，还需要注意的是，您不能通过任何一种服务使用 Fargate 进行 MNP 作业。

您只能在每个 MNP 作业中使用一种实例类型。您可以通过更新计算环境，或者在定义新的计算环境时更改实例类型。您还可以指定实例类型，并在创建作业定义时提供 vCPU 和内存要求。

## Amazon EKS 上的 MNP 的容器配额
<a name="mnp-eks-container-quotas"></a>
+ 多节点并行作业为每个节点支持一个容器组（pod）。
+ 每个容器组（pod）最多 10 个容器（或 10 个 init 容器。有关更多信息，请参阅 *Kubernetes 文档*中的 [Init 容器](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)。）。
+ 每个 MNP 作业中最多 5 个节点范围。
+ 每个节点范围内最多 10 个不同的容器映像。

例如，在包含 5 个节点范围和总共 50 个唯一映像的单个 MNP 作业中，您最多可以运行 10000 个容器。

## 在私有 Amazon VPC 和 Amazon EKS 集群中运行 MNP 作业
<a name="mnp-eks-running-mnp-jobs-vpc"></a>

MNP 作业可以在任何 Amazon EKS 集群上运行，无论该集群是否有公共互联网。使用只有私有网络访问权限的 Amazon EKS 集群时，请确保该集群 AWS Batch 可以访问 Amazon EKS 控制平面和托管 Kubernetes API 服务器。您可以通过 Amazon Virtual Private Cloud 端点授予必要的访问权限。有关更多信息，请参阅 [Configure an endpoint service](https://docs.aws.amazon.com/vpc/latest/privatelink/configure-endpoint-service.html)。

Amazon EKS 集群容器组（pod）无法从公共来源下载映像，因为私有 VPC 无法访问互联网。您的 Amazon EKS 集群必须从 Amazon VPC 中的容器注册表中拉取映像。您可以在 Amazon VPC 中创建[Amazon Elastic Container Registry（Amazon ECR）](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html)，并将容器映像复制到其中，以供节点访问。

您还可以使用 Amazon ECR 创建缓存提取规则。为外部公有注册表创建缓存提取规则后，您就可以使用 Amazon ECR 私有注册表 URI 从该外部公有注册表中提取映像。然后，Amazon ECR 会创建一个存储库并缓存映像。当使用 Amazon ECR 私有注册表 URI 提取缓存镜像时，Amazon ECR 会检查远程注册表以查看是否有新版本的镜像，并且会最多每 24 小时更新一次您的私有注册表。有关更多信息，请参阅 [Creating a pull through cache rule in Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/pull-through-cache-creating-rule.html)。

## 错误通知
<a name="mnp-eks-error-notificaton"></a>

如果您的 MNP 职位被屏蔽，您可以通过 AWS 管理控制台 和 Amazon EventBridge 收到通知。例如，如果 MNP 作业卡在队列的开头，您会收到有关该问题的通知以及导致该问题的原因的信息，以便您可以立即采取措施来解除对作业队列的阻止。您还可以选择在一段特定的时间内没有执行任何操作后自动终止 MNP 作业，具体时长可以在作业队列模板中定义。有关更多信息，请参阅 [作业队列阻塞事件](batch-job-queue-blocked-events.md)。

# 创建 Amazon EKS MNP 作业定义
<a name="mnp-eks-create-eks-mnp-job-definition"></a>

要在 Amazon EKS 上定义和运行 MNP 作业，[https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_RegisterJobDefinition.html) 和 [https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitJob.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitJob.html) API 操作中有新的参数。
+ 在 [https://docs.aws.amazon.com/batch/latest/APIReference/API_NodeProperties.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_NodeProperties.html) 部分下使用 [https://docs.aws.amazon.com/batch/latest/APIReference/API_EksProperties.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksProperties.html) 来定义您的 MNP 作业定义。
+ 在提交 MNP 作业时，在 [https://docs.aws.amazon.com//batch/latest/APIReference/API_NodePropertyOverride.html](https://docs.aws.amazon.com//batch/latest/APIReference/API_NodePropertyOverride.html) 部分下使用 [https://docs.aws.amazon.com/batch/latest/APIReference/API_EksPropertiesOverride.html](https://docs.aws.amazon.com/batch/latest/APIReference/API_EksPropertiesOverride.html) 来覆盖作业定义中定义的参数。

这些操作可以通过 API 操作和 AWS 管理控制台来定义。

## 参考：注册 Amazon EKS MNP 作业定义请求有效载荷
<a name="mnp-eks-register-eks-mnp-job-definition"></a>

以下示例说明了如何使用两个节点注册 Amazon EKS MNP 作业定义。

```
{
  "jobDefinitionName": "MyEksMnpJobDefinition",
  "type": "multinode",
  "nodeProperties": {
    "numNodes": 2,
    "mainNode": 0,
    "nodeRangeProperties": [
      {
        "targetNodes" : "0:",
        "eksProperties": {
          "podProperties": {
            "containers": [
              {
                "name": "test-eks-container-1",
                "image": "public.ecr.aws/amazonlinux/amazonlinux:2",
                "command": [
                  "sleep",
                  "60"
                ],
                "resources": {
                  "limits": {
                    "cpu": "1",
                    "memory": "1024Mi"
                  }
                },
                "securityContext":{
                  "runAsUser":1000,
                  "runAsGroup":3000,
                  "privileged":true,
                  "readOnlyRootFilesystem":true,
                  "runAsNonRoot":true
               }
              }
            ],
            "initContainers": [
               {
                  "name":"init-ekscontainer",
                  "image": "public.ecr.aws/amazonlinux/amazonlinux:2",
                  "command": [
                     "echo",
                     "helloWorld"
                   ],
                   "resources": {
                     "limits": {
                       "cpu": "1",
                       "memory": "1024Mi"
                     }
                  }
               }
            ],
            "metadata": {
               "labels": {
                  "environment" : "test"
               }
            }
          }
        }
      }
    ]
  }
}
```

要使用注册作业定义 AWS CLI，请将定义复制到名为 *MyEksMnpJobDefinition.json* 的本地文件中，然后运行以下命令。

```
aws batch register-job-definition --cli-input-json file://MyEksMnpJobDefinition.json
```

您将收到以下 JSON 响应。

```
{
    "jobDefinitionName": "MyEksMnpJobDefinition",
    "jobDefinitionArn": "arn:aws:batch:us-east-1:0123456789:job-definition/MyEksMnpJobDefinition:1",
    "revision": 1
}
```

# 提交 Amazon EKS MNP 作业
<a name="mnp-eks-submit-eks-mnp-job"></a>

要使用已注册的作业定义提交作业，请输入以下命令。将 <EKS\$1JOB\$1QUEUE\$1NAME> 的值替换为与 Amazon EKS 计算环境关联的预先存在的作业队列的名称或 ARN。

```
aws batch submit-job --job-queue <EKS_JOB_QUEUE_NAME> \
    --job-definition MyEksMnpJobDefinition \
    --job-name myFirstEksMnpJob
```

您将收到以下 JSON 响应。

```
{
    "jobArn": "arn:aws:batch:region:account:job/9b979cce-9da0-446d-90e2-ffa16d52af68",
    "jobName": "myFirstEksMnpJob", 
    "jobId": "<JOB_ID>"
}
```

您可以使用以下命令通过返回的 jobId 检查作业的状态。

```
aws batch describe-jobs --jobs <JOB_ID>
```

# 覆盖 Amazon EKS MNP 作业定义
<a name="mnp-eks-override-eks-mnp-job-definition"></a>

您可以选择覆盖作业定义详细信息（例如更改 MNP 作业规模或子作业详细信息）。以下提供了提交五节点 MNP 作业的 JSON 请求有效载荷示例，以及对 `test-eks-container-1` 容器命令的更改。

```
{
  "numNodes": 5,
  "nodePropertyOverrides": [
    {
      "targetNodes": "0:",
      "eksPropertiesOverride": {
        "podProperties": {
          "containers": [
            {
              "name": "test-eks-container-1",
              "command": [
                "sleep",
                "150"
              ]
            }
          ]
        }
      }
    }
  ]
}
```

要提交包含这些覆盖的作业，请将示例保存到本地文件 *eks-mnp-job-nodeoverride.json* 中，然后使用 AWS CLI 提交带有替代项的作业。

# 数组作业
<a name="array_jobs"></a>

数组作业是一种共享公共参数的作业，例如作业定义CPUs、v 和内存。它会以一系列相关但独立的基本作业的形式运行，这些作业可能跨多个主机分布，而且可能同时运行。数组作业是运行高度并行作业 (如 Monte Carlo 模拟、参数扫描或大型渲染作业) 的最高效方式。

AWS Batch 阵列作业的提交方式与普通作业一样。但是，您可以指定一个数组大小 (介于 2 和 10000 之间) 来定义该数组中应运行的子作业数。如果您提交一个数组大小为 1000 的作业，则单个作业会运行并生成 1000 个子作业。该数组作业是用于管理所有子作业的参考或指针。这种方式将允许您使用单个查询提交大型工作负载。`attemptDurationSeconds` 参数中指定的超时适用于每个子作业。父阵列作业没有超时。

当您提交阵列作业时，父阵列作业将获得一个普通的 AWS Batch 作业 ID。每个子作业都有相同的基本 ID。但是，子作业的数组索引将附加到父 ID 的末尾，如数组的首个子作业的 `example_job_ID:0`。

父阵列作业可以输入 `SUBMITTED`、`PENDING`、`FAILED` 或 `SUCCEEDED` 状态。当任何子作业更新为 `RUNNABLE`时，阵列父作业将更新为 `PENDING`。有关作业依赖关系的更多信息，请参阅 [作业依赖项](job_dependencies.md)。

在运行时，`AWS_BATCH_JOB_ARRAY_INDEX` 环境变量将设置为容器的相应作业数组索引编号。第一个数组作业索引的编号为 `0`，后续尝试的编号按升序排列 (1、2、3，依此类推)。您可以使用此索引值来控制数组作业子级的差异。有关更多信息，请参阅 [使用数组作业索引控制作业差异化](array_index_example.md)。

对于数组作业依赖项，您可以为依赖项指定一种类型，如 `SEQUENTIAL` 或 `N_TO_N`。您可以指定 `SEQUENTIAL` 类型依赖项 (无需指定作业 ID)，以便每个子数组作业按顺序完成 (从索引 0 开始)。例如，如果您提交一个数组大小为 100 的数组作业，并指定类型为 `SEQUENTIAL` 的依赖项，则会按顺序生成 100 个子作业，其中，首个子作业必须先成功，然后才能开始下一个子作业。下图显示作业 A，它是一个数组大小为 10 的数组作业。作业 A 的子索引中的每个作业均依赖于其前一个子作业。作业 A:1 无法启动，直到作业 A:0 完成。

![\[Flowchart showing Job-A with sequential child jobs A:0 through A:9, connected by arrows.\]](http://docs.aws.amazon.com/zh_cn/batch/latest/userguide/images/sequential-dep.png)


您也可以指定 `N_TO_N` 类型依赖项，并指定数组任务的任务 ID 。这样一来，此作业的每个子索引必须等待每个依赖项的相应子索引完成后才能开始。下图显示作业 A 和作业 B，二者是数组大小均为 10,000 的数组作业。作业 B 的子索引中的每个作业均依赖于作业 A 中的相应索引。作业 B:1 无法开始，直到作业 A:1 完成。

![\[Two array jobs, Job-A and Job-B, with 10,000 indexed tasks each, showing N_TO_N dependency.\]](http://docs.aws.amazon.com/zh_cn/batch/latest/userguide/images/n-to-n-dep.png)


如果您取消或终止父数组作业，则其所有子作业将随它一起取消或终止。您可以取消或终止单个子作业（这会将它们迁移至 `FAILED` 状态），而不会影响其他子作业。但是，如果子数组作业失败（自行或通过手动取消或终止作业），则父作业也会失败。在这种情况下，父作业会在所有子作业完成时转换为 `FAILED`。

有关搜索和筛选阵列作业的更多信息，请参阅[搜索作业队列中的作业](searching-filtering-jobs.md)。

**Topics**
+ [数组作业工作流示例](example_array_job.md)
+ [使用数组作业索引控制作业差异化](array_index_example.md)

# 数组作业工作流示例
<a name="example_array_job"></a>

 AWS Batch 客户的常见工作流程是运行先决条件设置任务，对大量输入任务运行一系列命令，然后完成一项任务，该任务汇总结果并将摘要数据写入 Amazon S3、DynamoDB、Amazon Redshift 或 Aurora。

例如：
+ `JobA`：一个标准的非数组任务，它对 Amazon S3 存储桶 `BucketA` 中的对象执行快速列示和元数据验证。[SubmitJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitJob.html)JSON 语法如下所示。

  ```
  {
      "jobName": "JobA",
      "jobQueue": "ProdQueue",
      "jobDefinition": "JobA-list-and-validate:1"
  }
  ```
+ `JobB`：一个包含 10000 个副本的数组作业，它依赖于 `JobA`，针对 `BucketA` 中的每个对象运行 CPU 密集型命令并将结果上传至 `BucketB`。[SubmitJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitJob.html)JSON 语法如下所示。

  ```
  {
      "jobName": "JobB",
      "jobQueue": "ProdQueue",
      "jobDefinition": "JobB-CPU-Intensive-Processing:1",
      "containerOverrides": {
          "resourceRequirements": [
              {
                  "type": "MEMORY",
                  "value": "4096"
              },
              {
                  "type": "VCPU",
                  "value": "32"
              }
          ]
     }
      "arrayProperties": {
          "size": 10000
      },
      "dependsOn": [
          {
              "jobId": "JobA_job_ID"
    }
      ]
  }
  ```
+ `JobC`：另一个包含 10000 个副本的数组任务，依赖于 `JobB`，具有 `N_TO_N` 依赖项模型，针对 `BucketB` 中的每个项目运行内存密集型命令，将元数据写入到 DynamoDB，并将生成的输出上传至 `BucketC`。[SubmitJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitJob.html)JSON 语法如下所示。

  ```
  {
      "jobName": "JobC",
      "jobQueue": "ProdQueue",
      "jobDefinition": "JobC-Memory-Intensive-Processing:1",
      "containerOverrides": {
          "resourceRequirements": [
              {
                  "type": "MEMORY",
                  "value": "32768"
              },
              {
                  "type": "VCPU",
                  "value": "1"
              }
          ]
     }
      "arrayProperties": {
          "size": 10000
      },
      "dependsOn": [
          {
              "jobId": "JobB_job_ID",
              "type": "N_TO_N"
          }
      ]
  }
  ```
+ `JobD`：一个执行 10 个验证步骤的数组任务，其中每个步骤需要查询 DynamoDB 并且可能与上述任一 Amazon S3 存储桶交互。`JobD` 中的每个步骤都运行相同的命令。但是，该行为因作业容器内的 `AWS_BATCH_JOB_ARRAY_INDEX` 环境变量的值而异。这些验证步骤按顺序运行 (例如，先运行 `JobD:0`，再运行 `JobD:1`，依此类推)。[SubmitJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitJob.html)JSON 语法如下所示。

  ```
  {
      "jobName": "JobD",
      "jobQueue": "ProdQueue",
      "jobDefinition": "JobD-Sequential-Validation:1",
      "containerOverrides": {
          "resourceRequirements": [
              {
                  "type": "MEMORY",
                  "value": "32768"
              },
              {
                  "type": "VCPU",
                  "value": "1"
              }
          ]
     }
      "arrayProperties": {
          "size": 10
      },
      "dependsOn": [
          {
              "jobId": "JobC_job_ID"
          },
          {
              "type": "SEQUENTIAL"
          },
   
      ]
  }
  ```
+ `JobE`：一个最终的非数组任务，它执行一些简单的清除操作并发送包含管道已完成的消息和指向输出 URL 的链接的 Amazon SNS 通知。[SubmitJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitJob.html)JSON 语法如下所示。

  ```
  {
      "jobName": "JobE",
      "jobQueue": "ProdQueue",
      "jobDefinition": "JobE-Cleanup-and-Notification:1",
      "parameters": {
          "SourceBucket": "s3://amzn-s3-demo-source-bucket",
          "Recipient": "pipeline-notifications@mycompany.com"
      },
      "dependsOn": [
          {
              "jobId": "JobD_job_ID"
          }
      ]
  }
  ```

# 使用数组作业索引控制作业差异化
<a name="array_index_example"></a>

本教程介绍如何使用 `AWS_BATCH_JOB_ARRAY_INDEX` 环境变量来区分子作业。每个子作业都分配给这个变量。该示例使用子作业的索引号来读取文件中的特定行。然后，它将与该行号关联的参数替换为作业容器内的命令。结果是，你可以有多个运行相同的 Docker 镜像和命令参数的 AWS Batch 作业。但是，结果有所不同，因为使用数组作业索引作为修饰符。

在本教程中，您将创建一个文本文件，该文件包含了彩虹的所有颜色，并且每种颜色单独占一行。然后，您将为 Docker 容器创建一个入口点脚本，该脚本会将索引转换为可用于颜色文件中的行号的值。索引从零开始，但行号从一开始。创建一个 Dockerfile，该文件会将颜色和索引文件复制到容器映像并将该映像的 `ENTRYPOINT` 设置为入口点脚本。Dockerfile 和资源将生成为一个 Docker 映像并被推送到 Amazon ECR。然后，您注册一个使用您的新容器镜像的作业定义，提交包含该作业定义的 AWS Batch 数组作业，然后查看结果。

**Topics**
+ [先决条件](array-tutorial-prereqs.md)
+ [构建容器映像](build-index-container.md)
+ [将映像推送到 Amazon ECR](push-array-image.md)
+ [创建并注册作业定义](create-array-job-def.md)
+ [提交 AWS Batch 阵列作业](submit-array-job.md)
+ [查看数组作业日志](#array-tutorial-logs)

# 先决条件
<a name="array-tutorial-prereqs"></a>

本教程工作流包含以下先决条件：
+  AWS Batch 计算环境。有关更多信息，请参阅 [创建计算环境](create-compute-environment.md)。
+  AWS Batch 作业队列和相关的计算环境。有关更多信息，请参阅 [创建作业队列](create-job-queue.md)。
+  AWS CLI 安装在您的本地系统上。有关更多信息，请参阅《AWS Command Line Interface 用户指南》中的[安装 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)**。
+ 在本地系统上安装的 Docker。有关更多信息，请参阅 Docker 文档中的[关于 Docker CE](https://docs.docker.com/install/)。

# 构建容器映像
<a name="build-index-container"></a>

可以在命令参数中使用作业定义中的 `AWS_BATCH_JOB_ARRAY_INDEX`。但是，我们建议您创建容器映像，该映像改用 Entrypoint 脚本中的变量。本节介绍如何创建此类容器映像。

**构建 Docker 容器映像**

1. 创建要用作 Docker 映像工作区的新目录并导航到该目录。

1. 在工作区目录中创建一个名为 `colors.txt` 的文件，并将下面的内容粘贴到其中。

   ```
   red
   orange
   yellow
   green
   blue
   indigo
   violet
   ```

1. 在工作区目录中创建一个名为 `print-color.sh` 的文件，并将下面的内容粘贴到其中。
**注意**  
`LINE` 变量被设置为 `AWS_BATCH_JOB_ARRAY_INDEX` \$1 1，因为数组索引从 0 开始，但行号从 1 开始。`COLOR` 变量被设置为与其行号关联的 `colors.txt` 中的颜色。

   ```
   #!/bin/sh
   LINE=$((AWS_BATCH_JOB_ARRAY_INDEX + 1))
   COLOR=$(sed -n ${LINE}p /tmp/colors.txt)
   echo My favorite color of the rainbow is $COLOR.
   ```

1. 在工作区目录中创建一个名为 `Dockerfile` 的文件，并将下面的内容粘贴到其中。此 Dockerfile 会将以前的文件复制到您的容器并设置要在容器启动时运行的入口点脚本。

   ```
   FROM busybox
   COPY print-color.sh /tmp/print-color.sh
   COPY colors.txt /tmp/colors.txt
   RUN chmod +x /tmp/print-color.sh
   ENTRYPOINT /tmp/print-color.sh
   ```

1. 生成 Docker 映像。

   ```
   $ docker build -t print-color .
   ```

1. 使用以下脚本测试容器。此脚本在本地将 `AWS_BATCH_JOB_ARRAY_INDEX` 变量设置为 0，然后递增它以模拟具有 7 个子级的数组作业的行为。

   ```
   $ AWS_BATCH_JOB_ARRAY_INDEX=0
   while [ $AWS_BATCH_JOB_ARRAY_INDEX -le 6 ]
   do
       docker run -e AWS_BATCH_JOB_ARRAY_INDEX=$AWS_BATCH_JOB_ARRAY_INDEX print-color
       AWS_BATCH_JOB_ARRAY_INDEX=$((AWS_BATCH_JOB_ARRAY_INDEX + 1))
   done
   ```

   下面是输出。

   ```
   My favorite color of the rainbow is red.
   My favorite color of the rainbow is orange.
   My favorite color of the rainbow is yellow.
   My favorite color of the rainbow is green.
   My favorite color of the rainbow is blue.
   My favorite color of the rainbow is indigo.
   My favorite color of the rainbow is violet.
   ```

# 将映像推送到 Amazon ECR
<a name="push-array-image"></a>

既然您已构建并测试 Docker 容器，您必须将其推送到映像存储库。此示例使用 Amazon ECR，但您可以使用其他注册表，例如 DockerHub。

1. 创建用于存储您的容器映像的 Amazon ECR 映像存储库。此示例仅使用 AWS CLI，但您也可以使用 AWS 管理控制台。有关更多信息，请参阅 *Amazon Elastic Container Registry 用户指南* 中的 [创建存储库](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)。

   ```
   $ aws ecr create-repository --repository-name print-color
   ```

1. 用从上一步返回的 Amazon ECR r存储库 URI 标记 `print-color` 映像。

   ```
   $ docker tag print-color aws_account_id.dkr.ecr.region.amazonaws.com/print-color
   ```

1. 登录到您的 Amazon ECR 注册表。有关更多信息，请参阅 *Amazon Elastic Container Registry 用户指南*中的[注册表身份验证](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth)。

   ```
   $ aws ecr get-login-password \
       --region region | docker login \
       --username AWS \
       --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
   ```

1. 将映像推送到 Amazon ECR。

   ```
   $ docker push aws_account_id.dkr.ecr.region.amazonaws.com/print-color
   ```

# 创建并注册作业定义
<a name="create-array-job-def"></a>

现在，您的 Docker 镜像已在镜像注册表中，您可以在 AWS Batch 作业定义中对其进行指定。则您可以稍后使用它来运行数组作业。此示例只使用 AWS CLI。但是，您还可以使用 AWS 管理控制台。有关更多信息，请参阅 [创建单节点作业定义](create-job-definition.md)。

**创建作业定义**

1. 在工作区目录中创建一个名为 `print-color-job-def.json` 的文件，并将下面的内容粘贴到其中。将映像存储库 URI 替换为您自己的映像的 URI。

   ```
   {
     "jobDefinitionName": "print-color",
     "type": "container",
     "containerProperties": {
       "image": "aws_account_id.dkr.ecr.region.amazonaws.com/print-color",
       "resourceRequirements": [
           {
               "type": "MEMORY",
               "value": "250"
           },
           {
               "type": "VCPU",
               "value": "1"
           }
       ]
     }
   }
   ```

1. 向注册作业定义 AWS Batch。

   ```
   $ aws batch register-job-definition --cli-input-json file://print-color-job-def.json
   ```

# 提交 AWS Batch 阵列作业
<a name="submit-array-job"></a>

注册任务定义后，您可以提交使用新容器映像的 AWS Batch 数组作业。

**提交 AWS Batch 阵列作业**

1. 在工作区目录中创建一个名为 `print-color-job.json` 的文件，并将下面的内容粘贴到其中。
**注意**  
此示例使用本 [先决条件](array-tutorial-prereqs.md) 节中提到的作业队列。

   ```
   {
     "jobName": "print-color",
     "jobQueue": "existing-job-queue",
     "arrayProperties": {
       "size": 7
     },
     "jobDefinition": "print-color"
   }
   ```

1. 将任务提交到您的 AWS Batch 任务队列。记下在输出中返回的作业 ID。

   ```
   $ aws batch submit-job --cli-input-json file://print-color-job.json
   ```

1. 描述作业的状态并等待作业移动到 `SUCCEEDED`。

## 查看数组作业日志
<a name="array-tutorial-logs"></a>

任务达到`SUCCEEDED`状态后，您可以从任务的容器中查看 CloudWatch 日志。

**要在 “日志” 中查看作业的 CloudWatch 日志**

1. 打开 AWS Batch 控制台，网址为[https://console.aws.amazon.com/batch/](https://console.aws.amazon.com/batch/)。

1. 在左侧导航窗格中，选择 **Jobs (作业)**。

1. 对于 **Job queue(作业队列)**，选择一个队列。

1. 在 **Status (状态)** 部分中，选择 **succeeded (已成功)**。

1. 要显示数组作业的所有子作业，请选择在上一节中返回的作业 ID。

1. 要从作业的容器查看日志，请选择其中一个子作业，然后选择 **View logs (查看日志)**。  
![\[阵列作业容器日志\]](http://docs.aws.amazon.com/zh_cn/batch/latest/userguide/images/array-logs.png)

1. 查看其他子作业的日志。每个作业将分别返回彩虹的一种颜色。

# 运行 GPU 作业
<a name="gpu-jobs"></a>

GPU 作业可帮助您运行使用实例的作业 GPUs。

支持以下基于 GPU 的 Amazon EC2 实例类型。有关更多信息，请参阅 [Amazon EC2 G3 实例](https://aws.amazon.com/ec2/instance-types/g3/)、[Amazon EC2 G4 实例](https://aws.amazon.com/ec2/instance-types/g4/)、[Amazon EC2 G5 实例](https://aws.amazon.com/ec2/instance-types/g5/)、[Amazon EC2 G6 实例](https://aws.amazon.com/ec2/instance-types/g6/)、[Amazon EC2 P2 实例](https://aws.amazon.com/ec2/instance-types/p2/)、[Amazon EC2 P3 实例](https://aws.amazon.com/ec2/instance-types/p3/)、[Amazon EC2 P4d 实例](https://aws.amazon.com/ec2/instance-types/p4/)、[Amazon EC2 P5 实例](https://aws.amazon.com/ec2/instance-types/p5/)、[Amazon EC2 P6 实例](https://aws.amazon.com/ec2/instance-types/p6/)、[Amazon EC2 Trn1 实例](https://aws.amazon.com/ec2/instance-types/trn1/)、[Amazon EC2 Trn2 实例](https://aws.amazon.com/ec2/instance-types/trn2/)、[Amazon EC2 Inf1 实例](https://aws.amazon.com/ec2/instance-types/inf1/)、[Amazon EC2 Inf2 实例](https://aws.amazon.com/ec2/instance-types/inf2/)、[Amazon EC2 Dl1 实例](https://aws.amazon.com/ec2/instance-types/dl1/) 和 [Amazon EC2 Dl2 实例](https://aws.amazon.com/ec2/instance-types/dl2q/)。


|  实例类型  |  GPUs  |  GPU 内存  |  v CPUs  |  内存  |  网络带宽  | 
| --- | --- | --- | --- | --- | --- | 
|  g3s.xlarge  |  1  |  8 GiB  |  4  |  30.5 GiB  |  10 Gbps  | 
|  g3.4xlarge  |  1  |  8 GiB  |  16  |  122 GiB  |  最高 10 Gbps  | 
|  g3.8xlarge  |  2  |  16 GiB  |  32  |  244 GiB  |  10 Gbps  | 
|  g3.16xlarge  |  4  |  32 GiB  |  64  |  488 GiB  |  25 Gbps  | 
|  g4dn.xlarge  |  1  |  16 GiB  |  4  |  16 GiB  |  最高 25 Gbps  | 
|  g4dn.2xlarge  |  1  |  16 GiB  |  8  |  32 GiB  |  最高 25 Gbps  | 
|  g4dn.4xlarge  |  1  |  16 GiB  |  16  |  64 GiB  |  最高 25 Gbps  | 
|  g4dn.8xlarge  |  1  |  16 GiB  |  32  |  128 GiB  |  50 Gbps  | 
|  g4dn.12xlarge  |  4  |  64 GiB  |  48  |  192 GiB  |  50 Gbps  | 
|  g4dn.16xlarge  |  1  |  16 GiB  |  64  |  256 GiB  |  50 Gbps  | 
|  g5.xlarge  |  1  |  24 GiB  |  4  |  16 GiB  |  最高 10 Gbps  | 
|  g5.2xlarge  |  1  |  24 GiB  |  8  |  32 GiB  |  最高 10 Gbps  | 
|  g5.4xlarge  |  1  |  24 GiB  |  16  |  64 GiB  |  最高 25 Gbps  | 
|  g5.8xlarge  |  1  |  24 GiB  |  32  |  128 GiB  |  25 Gbps  | 
|  g5.16xlarge  |  1  |  24 GiB  |  64  |  256 GiB  |  25 Gbps  | 
|  g5.12xlarge  |  4  |  96 GiB  |  48  |  192 GiB  |  40Gbps  | 
|  g5.24xlarge  |  4  |  96 GiB  |  96  |  384 GiB  |  50 Gbps  | 
|  g5.48xlarge  |  8  |  192 GiB  |  192  |  768 GiB  |  100 Gbps  | 
|  g5g.xlarge  |  1  |  16 GiB  |  4  |  8 GiB  |  最高 10 Gbps  | 
|  g5g.2xlarge  |  1  |  16 GiB  |  8  |  16 GiB  |  最高 10 Gbps  | 
|  g5g.4xlarge  |  1  |  16 GiB  |  16  |  32 GiB  |  最高 10 Gbps  | 
|  g5g.8xlarge  |  1  |  16 GiB  |  32  |  64 GiB  |  12 Gbps  | 
|  g5g.16xlarge  |  2  |  32 GiB  |  64  |  128 GiB  |  25 Gbps  | 
|  g5g.metal  |  2  |  32 GiB  |  64  |  128 GiB  |  25 Gbps  | 
|  g6.xlarge  |  1  |  24 GiB  |  4  |  16 GiB  |  最高 10 Gbps  | 
|  g6.2xlarge  |  1  |  24 GiB  |  8  |  32 GiB  |  最高 10 Gbps  | 
|  g6.4xlarge  |  1  |  24 GiB  |  16  |  64 GiB  |  最高 25 Gbps  | 
|  g6.8xlarge  |  1  |  24 GiB  |  32  |  128 GiB  |  25 Gbps  | 
|  g6.16xlarge  |  1  |  24 GiB  |  64  |  256 GiB  |  25 Gbps  | 
|  g6.12xlarge  |  4  |  96 GiB  |  48  |  192 GiB  |  40Gbps  | 
|  g6.24xlarge  |  4  |  96 GiB  |  96  |  384 GiB  |  50 Gbps  | 
|  g6.48xlarge  |  8  |  192 GiB  |  192  |  768 GiB  |  100 Gbps  | 
|  g6e.xlarge  |  1  |  48 GiB  |  4  |  32 GiB  |  高达 20 Gbps  | 
|  g6e.2xlarge  |  1  |  48 GiB  |  8  |  64 GiB  |  高达 20 Gbps  | 
|  g6e.4xlarge  |  1  |  48 GiB  |  16  |  128 GiB  |  20 Gbps  | 
|  g6e.8xlarge  |  1  |  48 GiB  |  32  |  256 GiB  |  25 Gbps  | 
|  g6e.16xlarge  |  1  |  48 GiB  |  64  |  512 GiB  |  35 Gbps  | 
|  g6e.12xlarge  |  4  |  192 GiB  |  48  |  384 GiB  |  100 Gbps  | 
|  g6e.24xlarge  |  4  |  192 GiB  |  96  |  768 GiB  |  200 Gbps  | 
|  g6e.48xlarge  |  8  |  384 GiB  |  192  |  1536 GiB  |  400 Gbps  | 
|  gr6.4xlarge  |  1  |  24 GiB  |  16  |  128 GiB  |  最高 25 Gbps  | 
|  gr6.8xlarge  |  1  |  24 GiB  |  32  |  256 GiB  |  25 Gbps  | 
|  p2.xlarge  |  1  |  12 GiB  |  4  |  61 GiB  |  高  | 
|  p2.8xlarge  |  8  |  96 GiB  |  32  |  488 GiB  |  10 Gbps  | 
|  p2.16xlarge  |  16  |  192 GiB  |  64  |  732 GiB  |  20 Gbps  | 
|  p3.2xlarge  |  1  |  16 GiB  |  8  |  61 GiB  |  最高 10 Gbps  | 
|  p3.8xlarge  |  4  |  64 GiB  |  32  |  244 GiB  |  10 Gbps  | 
|  p3.16xlarge  |  8  |  128 GiB  |  64  |  488 GiB  |  25 Gbps  | 
|  p3dn.24xlarge  |  8  |  256 GiB  |  96  |  768 GiB  |  100 Gbps  | 
|  p4d.24xlarge  |  8  |  320 GiB  |  96  |  1152 GiB  |  400 Gbps  | 
|  p4de.24xlarge  |  8  |  640 GiB  |  96  |  1152 GiB  |  400 Gbps  | 
|  p5.48xlarge  |  8  |  640 GiB  |  192  |  2 TiB  |  3200 Gbps  | 
|  p5e.48xlarge  |  8  |  1128 GiB  |  192  |  2 TiB  |  3200 Gbps  | 
|  p5en.48xlarge  |  8  |  1128 GiB  |  192  |  2 TiB  |  3200 Gbps  | 
|  p6-b200.48xlarge  |  8  |  1440 GiB  |  192  |  2 TiB  |  100 Gbps  | 
|  trn1.2xlarge  |  1  |  32 GiB  |  8  |  32 GiB  |  最高 12.5Gbps  | 
|  trn1.32xlarge  |  16  |  512 GiB  |  128  |  512 GiB  |  800 Gbps  | 
|  trn1n.32xlarge  |  16   |  512 GiB  |  128  |  512 GiB  |  1600 Gbps  | 
|  trn2.48xlarge  |  16  |  1.5 TiB  |  192  |  2 TiB  |  3.2 Tbps  | 
|  inf1.xlarge  |  1  |  8 GiB  |  4  |  8 GiB  |  最高 25 Gbps  | 
|  inf1.2xlarge  |  1  |  8 GiB  |  8  |  16 GiB  |  最高 25 Gbps  | 
|  inf1.6xlarge  |  4  |  32 GiB  |  24  |  48 GiB  |  25 Gbps  | 
|  inf1.24xlarge  |  16  |  128 GiB  |  96  |  192 GiB  |  100 Gbps  | 
|  inf2.xlarge  |  1  |  32 GiB  |  4  |  16 GiB  |  最高 15 Gbps  | 
|  inf2.8xlarge  |  1  |  32 GiB  |  32  |  128 GiB  |  最高 25 Gbps  | 
|  inf2.24xlarge  |  6  |  192 GiB  |  96  |  384 GiB  |  50 Gbps  | 
|  inf2.48xlarge  |  12  |  384 GiB  |  192  |  768 GiB  |  100 Gbps  | 
|  dl1.24xlarge  |  8  |  256 GiB  |  96  |  768 GiB  |  400 Gbps  | 
|  dl2q.24xlarge  |  8  |  128 GiB  |  96  |  768 GiB  |  100 Gbps  | 

**注意**  
对于 GPU 任务， AWS Batch 仅支持采用 NVIDIA 的实例类型 GPUs。例如，[https://aws.amazon.com/ec2/instance-types/g4/#Amazon_EC2_G4ad_instances](https://aws.amazon.com/ec2/instance-types/g4/#Amazon_EC2_G4ad_instances) 系列不支持 GPU 调度。您仍然可以在[https://aws.amazon.com/ec2/instance-types/g4/#Amazon_EC2_G4ad_instances](https://aws.amazon.com/ec2/instance-types/g4/#Amazon_EC2_G4ad_instances)上使用， AWS Batch 方法是在任务定义中仅定义 vCPU 和内存要求，然后使用亚马逊 ECS 或 Amazon EKS 计算优化的 AMI，或者使用自定义 AMD 的自定义 AMI，通过在 Amazon EC2 [启动模板用户数据](launch-templates.md#lt-user-data.title)中进行自定义，直接访问主机 GPU。 GPUs  
自定义 AMIs提供给的 GPU 任务支持使用 ARM64 架构的实例类型， AWS Batch 或者 GPUs 通过自定义代码和配置访问 Amazon EC2 用户数据。例如，[https://aws.amazon.com/ec2/instance-types/g5g/](https://aws.amazon.com/ec2/instance-types/g5g/) 实例系列。

任务定义的 [resource](job_definition_parameters.md#ContainerProperties-resourceRequirements) Requirements 参数指定 GPUs 要固定到容器的数量。在作业持续时间内，在该实例上运行的任何其他作业都 GPUs 无法使用此数字。计算环境中将运行 GPU 作业的所有实例类型都必须来自 `p6`、`p3`、`p4`、`p5`、`g3`、`g3s`、`g4`、`g5` 或 `g6` 实例系列。如果不这么做，GPU 作业可能会停滞于 `RUNNABLE` 状态。

不使用的作业 GPUs 可以在 GPU 实例上运行。但是，在 GPU 实例上运行它们的成本可能高于在类似的非 GPU 实例上运行的成本。根据具体的 vCPU、内存和所需时间，这些非 GPU 作业可能会阻止 GPU 作业运行。

**Topics**
+ [在 Amazon EKS 上创建基于 GPU 的 Kubernetes 集群](create-gpu-cluster-eks.md)
+ [创建 Amazon EKS GPU 作业定义](create-eks-gpu-job-definition.md)
+ [在您的 Amazon EKS 集群中运行 GPU 作业](run-gpu-job-eks-cluster.md)

# 在 Amazon EKS 上创建基于 GPU 的 Kubernetes 集群
<a name="create-gpu-cluster-eks"></a>

在 Amazon EKS 上创建基于 GPU 的 Kubernetes 集群之前，您必须已完成 [亚马逊 EK AWS Batch S 入门](getting-started-eks.md) 中的步骤。此外，请考虑以下操作：
+ AWS Batch 支持 NVIDIA 的实例类型 GPUs。
+ 默认情况下， AWS Batch 选择版本与您的 Amazon EKS 集群控制平面Kubernetes版本匹配的 Amazon EKS 加速 AMI。

```
$ cat <<EOF > ./batch-eks-gpu-ce.json
{
  "computeEnvironmentName": "My-Eks-GPU-CE1",
  "type": "MANAGED",
  "state": "ENABLED",
  "eksConfiguration": {
    "eksClusterArn": "arn:aws:eks:<region>:<account>:cluster/<cluster-name>",
    "kubernetesNamespace": "my-aws-batch-namespace"
  },
  "computeResources": {
    "type": "EC2",
    "allocationStrategy": "BEST_FIT_PROGRESSIVE",
    "minvCpus": 0,
    "maxvCpus": 1024,
    "instanceTypes": [
      "p3dn.24xlarge",
      "p4d.24xlarge"
    ],
    "subnets": [
        "<eks-cluster-subnets-with-access-to-internet-for-image-pull>"
    ],
    "securityGroupIds": [
        "<eks-cluster-sg>"
    ],
    "instanceRole": "<eks-instance-profile>"
  }
}
EOF

$ aws batch create-compute-environment --cli-input-json file://./batch-eks-gpu-ce.json
```

AWS Batch 不代表您管理 NVIDIA GPU 设备插件。您必须将此插件安装到您的 Amazon EKS 集群中，并允许它以 AWS Batch 节点为目标。有关更多信息，请参阅上的 “[启用 GPU Suppor Kubernetes](https://github.com/NVIDIA/k8s-device-plugin#enabling-gpu-support-in-kubernetes) t” GitHub。

要将NVIDIA设备插件 (`DaemonSet`) 配置为以 AWS Batch 节点为目标，请运行以下命令。

```
# pull nvidia daemonset spec
$ curl -O https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.12.2/nvidia-device-plugin.yml
# using your favorite editor, add Batch node toleration
# this will allow the DaemonSet to run on Batch nodes
- key: "batch.amazonaws.com/batch-node"
  operator: "Exists"

$ kubectl apply -f nvidia-device-plugin.yml
```

我们不建议您将基于计算（CPU 和内存）的工作负载与基于 GPU 的工作负载混合在计算环境和作业队列的相同配对中。这是因为计算作业可能会耗尽 GPU 容量。

要连接作业队列，请运行以下命令。

```
$ cat <<EOF > ./batch-eks-gpu-jq.json
 {
    "jobQueueName": "My-Eks-GPU-JQ1",
    "priority": 10,
    "computeEnvironmentOrder": [
      {
        "order": 1,
        "computeEnvironment": "My-Eks-GPU-CE1"
      }
    ]
  }
EOF

$ aws batch create-job-queue --cli-input-json file://./batch-eks-gpu-jq.json
```

# 创建 Amazon EKS GPU 作业定义
<a name="create-eks-gpu-job-definition"></a>

目前仅支持 `nvidia.com/gpu`，并且您设置的资源值必须为整数。不能使用 GPU 片段。有关更多信息，请参阅*Kubernetes文档 GPUs*中的[日程安排](https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/)。

要为 Amazon EKS 注册 GPU 作业定义，请运行以下命令。

```
$ cat <<EOF > ./batch-eks-gpu-jd.json
{
    "jobDefinitionName": "MyGPUJobOnEks_Smi",
    "type": "container",
    "eksProperties": {
        "podProperties": {
            "hostNetwork": true,
            "containers": [
                {
                    "image": "nvcr.io/nvidia/cuda:10.2-runtime-centos7",
                    "command": ["nvidia-smi"],
                    "resources": {
                        "limits": {
                            "cpu": "1",
                            "memory": "1024Mi",
                            "nvidia.com/gpu": "1"
                        }
                    }
                }
            ]
        }
    }
}
EOF

$ aws batch register-job-definition --cli-input-json file://./batch-eks-gpu-jd.json
```

# 在您的 Amazon EKS 集群中运行 GPU 作业
<a name="run-gpu-job-eks-cluster"></a>

GPU 资源不可压缩。 AWS Batch 为**请求**值等于**限制**值的 GPU 作业创建 Pod 规范。这是一项Kubernetes要求。

要提交 GPU 作业，请运行以下命令。

```
$ aws batch submit-job --job-queue My-Eks-GPU-JQ1 --job-definition MyGPUJobOnEks_Smi --job-name My-Eks-GPU-Job

# locate information that can help debug or find logs (if using Amazon CloudWatch Logs with Fluent Bit)
$ aws batch describe-jobs --job <job-id> | jq '.jobs[].eksProperties.podProperties | {podName, nodeName}'
{
  "podName": "aws-batch.f3d697c4-3bb5-3955-aa6c-977fcf1cb0ca",
  "nodeName": "ip-192-168-59-101.ec2.internal"
}
```

# 查看 AWS Batch 作业队列中的作业
<a name="view-jobs"></a>

您可以在 AWS Batch中查看和筛选作业。该功能提供了一个用来查看现有作业队列以及按三个选项之一筛选队列中作业的选项。

使用“搜索和筛选”功能可以检索非处于最终状态（`SUCCEEDED` 或 `FAILED`）的作业。一旦作业的状态变为 `SUCCEEDED` 或 `FAILED`，您最多可以在七天内检索该作业。您仍然可以查看任务 CloudWatch 或 Amazon EventBridge 日志。

使用此过程可在 AWS Batch 控制台中列出作业队列中的所有作业。也可使用**筛选结果**字段来根据您指定的条件缩小结果范围。

1. 导航至 [AWS Batch 控制台](https://console.aws.amazon.com/batch/home)。

1. 在导航窗格中，选择**作业**。

1. 展开**作业队列**下拉列表，选择要在其中进行搜索的作业队列。
**注意**  
您一次只能在一个作业队列中搜索作业。

1. 在**筛选结果**字段中，输入要包含在结果中的关键字。您可以使用此字段按**任务名称、**状态**或作业** **ID** 进行筛选。根据属性的不同，可能还必须定义其他运算符，例如等于（=）或包含（:）。
**注意**  
SageMaker 训练作业队列仅支持按**任务名称**和作**业 ID** 筛选

1. 选择**搜索**。

# 在 AWS Batch 作业队列中搜索作业
<a name="searching-filtering-jobs"></a>

你可以使用 Job Search 搜索和 AWS Batch 筛选职位。此功能提供了搜索现有作业队列以及筛选队列中作业的选项。

使用“搜索和筛选”功能可以检索非处于最终状态（`SUCCEEDED` 或 `FAILED`）的作业。一旦作业的状态变为 `SUCCEEDED` 或 `FAILED`，您最多可以在七天内检索该作业。您仍然可以查看任务 CloudWatch 或 Amazon EventBridge 日志。

要同时使用多个条件进行搜索，请使用**高级搜索**功能。例如，您可以使用以下任何或所有筛选条件：**状态**、**日期范围**和**其他条件**（例如作业名称、作业定义，或作业 ID）。

## 搜索 AWS Batch 职位（AWS 控制台）
<a name="search-jobs"></a>

使用此过程可在 AWS Batch 控制台中搜索作业队列中的作业。

1. 导航至 [AWS Batch 控制台](https://console.aws.amazon.com/batch/home)。

1. 在导航窗格中，选择**作业**。

1. 打开**高级搜索**。

1. 展开**作业队列**下拉列表，选择要在其中进行搜索的作业队列。
**注意**  
您一次只能在一个作业队列中搜索作业。

1. 对于**搜索选项**：

   1. 在**状态**下拉列表中，您可以选择一个或多个状态进行筛选。有关更多信息，请参阅[任务状态](job_states.md)和[服务作业状态](service-job-status.md)。
**注意**  
阵列作业父项`PENDING`会更新到任何子作业更新到的时间，`RUNNABLE`并在子作业运行时保持其`PENDING`状态。要查看这些作业，请按`PENDING`状态筛选，直到所有子作业都达到终止状态。

   1. 选择**日期范围**，以根据日期和时间范围筛选结果。
      + 选择**相对模式**，以搜索创建日期在当前日期和时间起倒数的时间范围内的作业。
      + 选择**绝对模式**，以搜索创建日期在指定日期和时间范围内的作业。

   1. 在**其他条件**字段中，输入要包含在搜索结果中的关键字。例如，您可以使用此字段按**作业名称、作业****定义、作业** **ID** 或**共享标识符**进行搜索。根据属性的不同，可能还必须定义其他运算符，例如等于（=）或包含（:）。
**注意**  
SageMaker 训练作业队列仅支持按**任务名称**和作**业 ID** 筛选
**注意**  
按**共享标识符**筛选时，您还可以指定任务状态。这是限制的例外，其他过滤器不包括作业状态筛选。

1. 选择**搜索**。

## 搜索和筛选 AWS Batch 职位 (AWS CLI)
<a name="search-filter-jobs-cli"></a>

使用此过程通过 AWS CLI列出作业队列中的所有作业。也可使用 **-filters** 参数来根据您指定的条件缩小结果范围。

------
#### [ Search job queue (AWS CLI) ]

您可以使用 [list-jobs](https://docs.aws.amazon.com/cli/latest/reference/batch/list-jobs.html) 命令来搜索和筛选作业队列。

例如，您可以按作业名称搜索作业队列：

```
aws batch list-jobs \
    --job-queue my-job-queue \
    --filters name=JOB_NAME,values="my-job"
```

按共享标识符筛选作业：

```
aws batch list-jobs \
    --job-queue my-job-queue \
    --filters name=SHARE_IDENTIFIER,values="my-share"
```

按共享标识符筛选时，可以包括任务状态：

```
aws batch list-jobs \
    --job-queue my-job-queue \
    --job-status RUNNING \
    --filters name=SHARE_IDENTIFIER,values="my-share"
```

在前面的命令中，进行以下更改：
+ *my-job-queue*替换为任务队列的名称。
+ *my-job*用您的任务名称替换。
+ *my-share*替换为要筛选依据的股票标识符。

------
#### [ Search service job queue (AWS CLI) ]

您可以使用[list-service-jobs](https://docs.aws.amazon.com/cli/latest/reference/batch/list-service-jobs.html)命令来搜索和筛选服务作业队列。

例如，您可以按作业名称搜索服务作业队列：

```
aws batch list-service-jobs \
    --job-queue my-sm-queue \
    --filters name=JOB_NAME,values="my-sm-job"
```

按共享标识符筛选服务作业：

```
aws batch list-service-jobs \
    --job-queue my-sm-queue \
    --filters name=SHARE_IDENTIFIER,values="my-share"
```

在前面的命令中，进行以下更改：
+ *my-sm-queue*替换为服务任务队列的名称。
+ *my-sm-job*替换为服务任务的名称。
+ *my-share*替换为要筛选依据的股票标识符。

------

# AWS Batch 作业的联网模式
<a name="networking-modes-jobs"></a>

下表描述了 AWS Batch 作业类型的联网模式和典型用法。有关注意事项和行为的更多详细信息，请参见“作业类型”列中的链接。


| 作业类型 | 支持的网络模式 | 典型用法 | 
| --- | --- | --- | 
| [ECS-EC2 简单作业](jobs.md) | host | 用于可扩展性最高且高度并行的批处理工作负载，这些工作负载只需要输出到计算环境中所定义 vpc。 | 
| [ECS-EC2 多节点并行作业](multi-node-parallel-jobs.md) | awsvpc | 用于采用单作业模式的紧密耦合型多主机（节点）分布式工作负载，并在任务节点之间协调通信。 | 
| [ECS-Fargate 简单作业](when-to-use-fargate.md) | awsvpc | 真正的无服务器，用于高度并行的批处理工作负载。通常为 TCO 最低且容器隔离程度最高的作业模式。 | 
| [EKS-EC2 简单作业](eks-jobs.md) | 主机和容器组 | 用于高度可扩展且高度并行的批处理工作负载，这些工作负载只需要输出到计算环境中所定义 vpc。默认为主机网络。 | 
| [EKS-EC2 多节点并行作业](mnp-eks-jobs.md) | 主机和容器组 | 用于采用单作业模式的紧密耦合型多主机（节点）分布式工作负载，并在容器组（pod）节点之间协调通信。默认为主机网络。 | 

# 在日志中查看 AWS Batch 作业 CloudWatch 日志
<a name="review-job-logs"></a>

您可以[将 AWS Batch 任务配置为](using_cloudwatch_logs.md#using_cloudwatch_logs.title)向 Amazon Logs 发送 CloudWatch 日志信息。这样，您可以在一个方便的位置查看作业的不同日志。有关更多信息，请参阅 [将 CloudWatch 日志与配合使用 AWS Batch](using_cloudwatch_logs.md)。

您还可以使用 AWS Batch 控制台中的 **Job 日志来监控作业**或对 AWS Batch 作业进行故障排除。

1. 打开 [AWS Batch 控制台](https://console.aws.amazon.com/batch/home)。

1. 选择 **Jobs (作业)**。有关作业队列中作业排序和筛选的更多详细信息，请参阅[查看 AWS Batch 作业队列中的作业](view-jobs.md)和[搜索作业队列中的作业](searching-filtering-jobs.md)

1. 对于**作业队列**，选择所需的作业队列。
**提示**  
如果作业队列中有多个作业，则可以打开**搜索和筛选**以更快地找到作业。有关更多信息，请参阅 [在 AWS Batch 作业队列中搜索作业](searching-filtering-jobs.md)。

1. 在**状态** 中，选择所需的作业状态。

1. 选择需要的作业，这时将会打开**详细信息**页面。

1. 在**详细信息**页面上，向下滚动到**日志流名称**并选择该链接。该链接将打开该任务的 Amazon CloudWatch 日志页面。

1. （可选）如果这是您首次查看日志，则可能会要求您授权。

   在 “**需要授权**” 中，输入**OK**，然后选择 “**授权**” 以接受 Amazon 的 CloudWatch 费用。
**注意**  
要撤销您的 CloudWatch 收费授权，请执行以下操作：  
在左侧导航窗格中，请选择**权限**。
对于**作业日志**，选择**编辑**。
清除 “**授权 Batch 使用**” CloudWatch 复选框。
选择**保存更改**。

# 查看 AWS Batch 工作信息
<a name="review-job-info"></a>

您可以查看 AWS Batch 作业信息，例如状态、作业定义和容器信息。

1. 打开 [AWS Batch 控制台](https://console.aws.amazon.com/batch/home)。

1. 选择 **Jobs (作业)**。

1. 对于**作业队列**，选择所需的作业队列。
**提示**  
如果作业队列中有多个作业，则可以打开**搜索和筛选**以更快地找到作业。有关更多信息，请参阅 [在 AWS Batch 作业队列中搜索作业](searching-filtering-jobs.md)。

1. 选择所需的作业。

**注意**  
您还可以使用 AWS Command Line Interface (AWS CLI) 来查看有关 AWS Batch 作业的详细信息。有关更多信息，请参阅 [AWS CLI 命令引用](https://docs.aws.amazon.com/cli/latest/reference/)中的 [describe-jobs](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/batch/describe-jobs.html)。