

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

# 中的服务职位 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 中的训练作业。