

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

# 配额管理
<a name="quota-management"></a>

AWS Batch 根据作业所需的资源和连接的服务环境 (SE) 中的可用容量来安排作业，从而实现计算资源的高利用率。通过配额管理，管理员还可以通过更精细的资源分配来控制团队或项目可以消耗多少资源。

配额管理允许管理员通过定义相关的配额**份额（包括计算配额**（**容量限制**）和闲置计算的 AWS Batch 资源共享策略在内的资源，在团队和项目之间有效地分配共享的计算资源。每个配额共享都作为一个虚拟队列运行，嵌套在关联的作业队列中。为任务队列安排作业时， AWS Batch 将遍历所有附加的配额份额。

管理员可以放心地在配额共享之间启用资源共享，因为**抢**占将允许任何配额共享在需要时回收其借给其他人的资源。在配额份额内，您可以选择优先级较高的作业是否应抢占正在运行的作业，还是让正在运行的作业完成。Job 优先级可以在提交时设置，稍后再更新；在做出抢占决定时会考虑更新的优先级。可以按队列、配额份额和作业级别的粒度监控容量利用率。

只有连接到`SAGEMAKER_TRAINING`服务环境的任务队列才支持配额管理。

**Topics**
+ [配额份额](quota-shares.md)
+ [抢占权](preemption.md)
+ [创建配额管理资源](create-quota-management-resources.md)
+ [创建配额份额](create-quota-shares.md)
+ [向配额共享提交作业](submit-job-quota-share.md)

# 配额份额
<a name="quota-shares"></a>

**配额共享**是嵌套在作业队列下的虚拟队列。最多可以将 20 个附加到任何作业队列。配额共享允许通过使用**容量限制**为团队或项目分配计算配额；配额共享需要提供至少一个容量限制，并且最多支持 5 个容量限制。每个容量限制都应表示为支持的 SageMaker 训练作业实例类型的实例限制。

## 配额共享资源共享策略
<a name="quota-share-resource-sharing"></a>

配额共享也有明确的资源共享配置。
+ 如果应将配额共享的空闲计算仅保留给其作业，请选择`RESERVE`。
+ 如果可以将配额份额的闲置计算借给其他配额共享，请选择`LEND`。
+ 如果可以将配额份额的空闲计算借给其他配额共享，并且应允许该配额份额中的作业借用空闲计算，请选择已配置的`LEND_AND_BORROW`借用限制。

## 通过抢占恢复容量
<a name="capacity-limit-restoration"></a>

AWS Batch 将执行**交叉共享抢占**以在任务到达时将借用的容量恢复到配额份额。在选择要抢占哪些作业时，要 AWS Batch 考虑作业借用的实例数量和类型、作业的相对优先级和作业的持续时间，并应用自定义的启发式方法。

降低配额份额的容量限制的管理员也可以使该配额份额内的`SCHEDULED``STARTING`、或`RUNNING`任务有资格获得抢占资格，即使`LEND`该配额共享已`RESERVE`被选为资源共享策略，前提是该配额份额已经消耗的容量超过其降低的容量限制。

# 抢占权
<a name="preemption"></a>

配额管理是唯一包含**抢占**功能的 AWS Batch 调度算法，即 AWS Batch 停止`SCHEDULED``STARTING`、或`RUNNING`任务以为任务创建容量。`RUNNABLE`

## 交叉共享抢占权
<a name="cross-share-preemption"></a>

配额管理使用**交叉共享抢占功能在任务**到达时将借用的容量恢复到配额共享。

如果配额份额占用的容量现在超过其配置的容量限制`SCHEDULED`，`STARTING`则管理员也可以使该配额份额内的、或`RUNNING`任务有资格抢占该配额份额。

## 共享内抢占权
<a name="in-share-preemption"></a>

可以将配额份额配置为启用**共享内抢占**，这允许优先级较高的`RUNNABLE`作业在已进入、或的相同配额份额内触发优先级较低的作业的抢占。`SCHEDULED` `STARTING` `RUNNING`

## 抢占选择算法
<a name="preemption-selection-algorithm"></a>

在选择要抢占哪些作业时，要 AWS Batch 考虑作业借用的实例数量和类型、作业的相对优先级和作业的持续时间，并应用自定义的启发式方法。提交后，您可以使用 [UpdateServiceJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_UpdateServiceJob.html)API 调用更新作业。`schedulingPriority`这对于降低`RUNNING`作业的优先级（增加抢占的可能性）或在启用共享内抢占的情况下提高配额份额中`RUNNABLE`作业的优先级，从而使该作业有可能抢占已经在运行的作业。

## 抢占重试次数
<a name="preemption-retries"></a>

默认情况下，抢占的作业将重新排队，没有限制。`RUNNABLE`要限制工作经历的抢占次数，请设置为提交`preemptionRetriesBeforeTermination`作业。当设置`preemptionRetriesBeforeTermination`为 0 时，任务将在首次抢占`FAILED`时继续进行。

最近抢占尝试的滑动窗口存储在作业中，并通过可见。[DescribeServiceJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeServiceJob.html)

# 创建配额管理资源
<a name="create-quota-management-resources"></a>

在创建关联的调度策略、服务环境和作业队列时，配额管理需要特定的设置。

## 先决条件
<a name="quota-management-resources-prerequisites"></a>

在创建配额管理资源之前，请确保您具有：
+ **IAM 权限** — 创建和管理 AWS Batch 任务队列、调度策略和服务环境的权限。有关更多信息，请参阅 [AWS Batch IAM 策略、角色和权限](IAM_policies.md)。

------
#### [ Configure quota management resources (AWS Batch console) ]

 AWS Batch 控制台提供了一个集成的工作流程，用于创建配额管理所需的所有资源。配额管理作业队列创建工作流程还会创建支持配额管理的调度策略和服务环境。

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

1. 在导航窗格中，选择 **Job 队列**，然后选择 C **reat** e。

1. 对于**编排类型**，请选择**SageMaker训练**。

1. 对于**作业队列配置**：

   1. 在**名称**中，输入作业队列的名称。

   1. 在 “**优先级**” 中，输入一个介于 0 和 1000 之间的值。优先级较高的作业队列优先于服务环境。

1. 对于**日程安排**：

   1. 对于**计划算法**，请选择**配额管理**。

   1. 对于**计划策略 ARN**：
      + 如果已存在指定配额管理的计划策略，请从下拉列表中选择该策略。
      + 否则，请选择**创建计划策略**。

        1. 将打开一个侧边栏，用于配置配额管理计划策略。

        1. 为计划策略提供**名称**。

        1. 选择**创建**。**计划策略 ARN** 字段现已填充。

1. 对于**服务环境**配置，在 “**连接的服务环境**” 下：
**注意**  
启用配额管理的服务环境只能连接到一个启用了配额管理的作业队列。

   1. 如果已经创建了与配额管理兼容的服务环境，并且尚未连接到启用配额管理的作业队列，请从下拉列表中将其选中。

   1. 否则，请选择**创建服务环境**。将打开一个侧边栏来配置服务环境。

      1. 为服务环境提供一个**名称**。

      1. 提供至少一个容量限制（最多为 5 个）。对于每个容量限制，请从下拉列表中选择一个**实例类型**和**最大实例数**。

1. （可选）对于 **作业状态限制**：

   1. 对于**配置错误**，请选择其中一个`SERVICE_ENVIRONMENT_MAX_RESOURCE`并输入**最大可运行时间（**秒）。

   1. 对于**容量**，选择 `INSUFFICIENT_INSTANCE_CAPACITY` 并输入**最大可运行时间（秒）**。

1. 选择**创建作业队列**。

------
#### [ Configure quota management resources (AWS CLI) ]

要通过 AWS CLI 配置配额管理，请创建计划策略、服务环境和作业队列。计划策略和服务环境都必须与配额管理兼容，并且必须在创建任务队列之前创建。

**创建日程安排策略**

使用`create-scheduling-policy`命令创建与配额管理兼容的计划策略。在创建期间提供配额共享政策：

```
aws batch create-scheduling-policy \
  --name my-qm-sagemaker-scheduling-policy \
  --quota-share-policy idleResourceAssignmentStrategy="FIFO"
```

验证计划策略是否已成功创建：

```
aws batch describe-scheduling-policies \
  --arns arn-for-my-qm-sagemaker-scheduling-policy
```

**创建服务环境**

使用`create-service-environment`命令创建支持配额管理的服务环境。确保容量限制使用 SageMaker 训练作业接受的实例类型，例如`ml.g6.xlarge`或`ml.p4d.24xlarge`。

```
aws batch create-service-environment \
  --service-environment-name my-qm-sagemaker-service-env \
  --service-environment-type SAGEMAKER_TRAINING \
  --capacity-limits capacityUnit=instance_type,maxCapacity=instance_count
```

验证服务环境是否已成功创建：

```
aws batch describe-service-environments \
  --service-environments my-qm-sagemaker-service-env
```

**创建任务队列**

使用`create-job-queue`命令创建启用配额管理的作业队列。必须满足以下标准：
+ 必须提供一个当前未连接到其他作业队列的单一`SAGEMAKER_TRAINING`服务环境。
+ 服务环境必须根据实例类型来表示容量限制，例如`ml.m6i.xlarge`，而不是`NUM_INSTANCES`。
+ 必须连接包含以下内容的调度策略`quotaSharePolicy`。
+ `jobQueueType` 必须是 `SAGEMAKER_TRAINING`。

```
aws batch create-job-queue \
  --job-queue-name my-qm-sagemaker-jq \
  --job-queue-type SAGEMAKER_TRAINING \
  --priority 1 \
  --service-environment-order order=1,serviceEnvironment=my-qm-sagemaker-service-env \
  --scheduling-policy-arn arn-for-my-qm-sagemaker-scheduling-policy
```

验证任务队列是否已成功创建：

```
aws batch describe-job-queues \
  --job-queues my-qm-sagemaker-jq
```

请确保：
+ `state` 为 `ENABLED`
+ `status` 为 `VALID`
+ `statusReason` 为 `JobQueue Healthy`

------

# 创建配额份额
<a name="create-quota-shares"></a>

配额共享充当关联作业队列中的虚拟队列， AWS Batch 调度器在调度时会在该队列之间进行迭代。它们使管理员能够通过为团队或项目分配计算配额` capacity limits `，并对资源共享策略进行明确配置。

## 先决条件
<a name="create-quota-shares-prerequisites"></a>

在创建配额份额之前，请确保您具有：
+ **配额管理调度策略、服务环境和作业队列**-启用配额管理的配额管理调度策略、服务环境和作业队列。有关更多信息，请参阅 [创建配额管理资源](create-quota-management-resources.md)。
+ **IAM 权限** — 创建和管理 AWS Batch 配额份额的权限。有关更多信息，请参阅 [AWS Batch IAM 策略、角色和权限](IAM_policies.md)。

------
#### [ Configure quota shares (AWS Batch console) ]

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

1. 在导航窗格中，选择 **Job qu** eues，然后从列表中选择已启用配额管理的作业队列。选择作业队列名称链接。

1. 在**配额份额**部分中，选择**创建配额共享**。

1. 提供配额份额的**名称**。

1. 对于**容量限制**，请选择**添加容量限制**。必须至少指定一个容量限制。

   1. 从下拉列表中选择一个**实例类型**，然后设置此配额份额分配给它**的最大实例数**。

   1. （可选）选择 “**添加容量限制**”，然后重复添加最多五个容量限制。

1. 对于**容量共享**，请选择此配额共享如何与同一作业队列中的其他配额共享共享其容量：
   + 如果配额份额不应借出或借用闲置计算，请选择 “**预留**”。
   + **如果配额份额可以将闲置计算借给其他配额份额，请选择 “借出”。**
   + 如果配额份额既可以**借出**闲置计算，也可以借用闲置计算，当工作到来时，通过交叉共享抢占回借出的计算，则选择 “借出”。

1. （可选）对于**共享内抢占**，请选择是启用还是禁用共享内抢占。启用共享内抢占允许优先级较高的作业抢占已处于、或状态的低优先级作业。`SCHEDULED` `STARTING` `RUNNING`禁用共享内抢占意味着优先级较高的作业将等待容量变为可用。

1. 选择**创建配额共享**。

------
#### [ Configure quota shares (AWS CLI) ]

使用`create-quota-share`命令创建配额共享。您必须选择资源共享策略以及是否启用共享内抢占。

**借贷示例**

以下示例创建了一个可以借出和借用闲置容量的配额份额，借用限制为其配置容量限制的 100%。它还支持共享内抢占，因此优先级较高的作业无需等待 SageMaker AI 中安排的优先级较低的任务完成。

```
aws batch create-quota-share \
  --quota-share-name lend_and_borrow_qs \
  --job-queue my-qm-sagemaker-jq \
  --capacity-limits maxCapacity=5,capacityUnit=ml.m6i.large \
  --resource-sharing-configuration strategy=LEND_AND_BORROW,borrowLimit=100 \
  --preemption-configuration inSharePreemption=ENABLED
```

**仅借用示例**

可以将配额份额配置为仅借出闲置容量，而不能自行借用。以下示例`LEND`与禁用共享内抢占配对。

```
aws batch create-quota-share \
  --quota-share-name lend_qs \
  --job-queue my-qm-sagemaker-jq \
  --capacity-limits maxCapacity=8,capacityUnit=ml.m6i.large \
  --resource-sharing-configuration strategy=LEND \
  --preemption-configuration inSharePreemption=DISABLED
```

**预留示例**

也可以将配额份额配置为预留空闲容量。当配额共享具有空闲容量时，新提交的作业可能会更快地启动，但是如果配额共享中没有任务，则总体队列利用率会降低。

```
aws batch create-quota-share \
  --quota-share-name reserved_qs \
  --job-queue my-qm-sagemaker-jq \
  --capacity-limits maxCapacity=2,capacityUnit=ml.m6i.large \
  --resource-sharing-configuration strategy=RESERVE \
  --preemption-configuration inSharePreemption=DISABLED
```

------

# 向配额共享提交作业
<a name="submit-job-quota-share"></a>

配额管理任务队列要求所有作业在提交作业时指定配额份额。要向配额共享提交任务，请在`quotaShareName`中指定[SubmitServiceJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitServiceJob.html)。`preemptionConfiguration`可以选择提供 A 来限制在任务尝试进入之前的抢占尝试次数。`FAILED`要限制工作经历的抢占次数，请在提交工作时将其设置`preemptionRetriesBeforeTermination`[ServiceJobPreemptionConfiguration](https://docs.aws.amazon.com/batch/latest/APIReference/API_ServiceJobPreemptionConfiguration.html)在内。

## 使用提交作业 AWS CLI
<a name="submit-job-quota-share-cli"></a>

以下示例使用**submit-service-job**命令向配额共享提交任务。

```
aws batch submit-service-job \
    --job-name "my-sagemaker-training-job" \
    --job-queue "my-sagemaker-job-queue" \
    --service-job-type "SAGEMAKER_TRAINING" \
    --quota-share-name "my_quota_share" \
    --timeout-config '{"attemptDurationSeconds":3600}' \
    --scheduling-priority 5 \
    --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}}'"
```