

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

# 培训计划用于 SageMaker 培训作业
<a name="training-plan-utilization-for-training-jobs"></a>

通过在创建 SageMaker 训练作业时指定自己选择的计划，可以将训练计划用于训练作业。

**注意**  
训练计划必须处于 `Scheduled` 或 `Active` 状态才能供训练作业使用。

如果所需容量无法立即用于训练作业，则作业将等待直至该容量可用，直到满足 `StoppingCondition` 或作业为获得容量而处于 `Pending` 达 2 天（以先满足的条件为准）。如果满足停止条件，则将停止作业。如果作业已处于待处理状态达 2 天，则作业将被终止，并显示 `InsufficientCapacityError`。

**重要**  
**预留容量终止流程：**在预留容量结束时间前 30 分钟，您都可完全使用所有预留实例。当您的预留容量还剩 30 分钟时， SageMaker 培训计划将开始终止该预留容量内任何正在运行的实例。  
为确保您不会因这些终止操作而丢失进度，我们建议您为训练作业设置检查点。

## 为训练作业设置检查点
<a name="training-jobs-checkpointing"></a>

在 SageMaker 训练作业中使用 SageMaker 训练计划时，请确保在训练脚本中实现检查点。这样一来，您就可以在预留容量到期前保存训练进度。在使用预留容量时，设置检查点尤为重要，因为在以下情况下，可通过检查点从上次保存的时间点恢复训练：作业在两个预留容量之间中断，或训练计划到达其结束日期。

为此，您可以使用 `SAGEMAKER_CURRENT_CAPACITY_BLOCK_EXPIRATION_TIMESTAMP` 环境变量。此变量有助于确定何时启动检查点设置流程。通过将此逻辑融入训练脚本中，可以确保模型的进度会按适当的时间间隔保存。

以下示例说明如何在 Python 训练脚本中实现此检查点设置逻辑：

```
import os
import time
from datetime import datetime, timedelta

def is_close_to_expiration(threshold_minutes=30):
    # Retrieve the expiration timestamp from the environment variable
    expiration_time_str = os.environ.get('SAGEMAKER_CURRENT_CAPACITY_BLOCK_EXPIRATION_TIMESTAMP', '0')
    
    # If the timestamp is not set (default '0'), return False
    if expiration_time_str == '0':
        return False
    
    # Convert the timestamp string (in milliseconds) to a datetime object
    expiration_time = datetime(1970, 1, 1) + timedelta(milliseconds=int(expiration_time_str))
    
    # Calculate the time difference between now and the expiration time
    time_difference = expiration_time - datetime.now()
    
    # Return True if we're within the threshold time of expiration
    return time_difference < timedelta(minutes=threshold_minutes)

def start_checkpointing():
    # Placeholder function for checkpointing logic
    print("Starting checkpointing process...")
    # TODO: Implement actual checkpointing logic here
    # For example:
    # - Save model state
    # - Save optimizer state
    # - Save current epoch and iteration numbers
    # - Save any other relevant training state

# Main training loop
num_epochs = 100
final_checkpointing_done = False
for epoch in range(num_epochs):
    # TODO: Replace this with your actual training code
    # For example:
    # - Load a batch of data
    # - Forward pass
    # - Calculate loss
    # - Backward pass
    # - Update model parameters
    
    # Check if we're close to capacity expiration and haven't done final checkpointing
    if not final_checkpointing_done and is_close_to_expiration():
        start_checkpointing()
        final_checkpointing_done = True
    
    # Simulate some training time (remove this in actual implementation)
    time.sleep(1)
print("Training completed.")
```

**注意**  
训练作业配置遵循 First-In-First-Out（FIFO）顺序，但是如果无法完成较大的任务，则稍后创建的较小集群作业可能会先分配容量，然后再分配先前创建的较大集群作业。
SageMaker 训练管理的温水池与 SageMaker 训练计划兼容。要重复使用集群，您必须在后续 `CreateTrainingJob` 请求中提供相同的 `TrainingPlanArn` 值才能重复使用同一集群。

**Topics**
+ [为训练作业设置检查点](#training-jobs-checkpointing)
+ [使用 SageMaker AI 控制台创建训练作业](use-training-plan-for-training-jobs-using-console.md)
+ [使用 API、、 AWS CLI SageMaker SDK 创建训练作业](use-training-plan-for-training-jobs-using-api-cli-sdk.md)

# 使用 SageMaker AI 控制台创建训练作业
<a name="use-training-plan-for-training-jobs-using-console"></a>

您可以使用 AI U SageMaker I 将 SageMaker 训练计划用于训练作业。在创建训练作业时，如果您的实例选择和区域与可用的计划匹配，则会向您推荐可用的计划。

要在 SageMaker控制台中使用训练计划的预留容量创建训练作业，请执行以下操作：

1. 导航到 SageMaker AI 控制台，网址为[https://console.aws.amazon.com/sagemaker/](https://console.aws.amazon.com/sagemaker/)。

1. 在左侧导航窗格中，选择**训练**，然后选择**训练作业**。

1. 选择**创建训练作业**按钮。

1. 在为训练作业配置资源时，请查看**实例容量**部分。如果有与您选择的实例类型和区域匹配的可用计划，这些计划会在此处显示。选择符合您的计算容量需求的训练计划。

   如果未提供合适的计划，您可以调整实例类型或区域，也可以继续操作而不使用训练计划。

1. 选择训练计划（或选择继续操作而不使用训练计划）后，完成训练作业的其余配置，然后选择**创建训练作业**以启动流程。

![\[SageMaker 用于创建新训练作业的 AI 控制台页面。该页面显示各种配置选项，包括作业设置、算法选项、资源配置、训练计划选择和停止条件。\]](http://docs.aws.amazon.com/zh_cn/sagemaker/latest/dg/images/training-plans/tp-create-training-job.png)


查看和启动作业。一旦训练计划变成 `Active`（待处理容量），您的作业就会开始运行。

# 使用 API、、 AWS CLI SageMaker SDK 创建训练作业
<a name="use-training-plan-for-training-jobs-using-api-cli-sdk"></a>

要将 SageMaker 训练计划用于您的 SageMaker 训练作业，请在调用 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html)API 操作`ResourceConfig`时在中指定所需计划的`TrainingPlanArn`参数。对于每个作业，您只能使用一个计划。

**重要**  
`CreateTrainingJob` 请求的 `ResourceConfig` 部分中设置的 `InstanceType` 字段必须与训练计划的 `InstanceType` 匹配。

## 使用 CLI 对计划运行训练作业
<a name="training-job-cli"></a>

以下示例演示如何使用`create-training-job` AWS CLI 命令中的`TrainingPlanArn`属性创建 SageMaker 训练作业并将其与提供的训练计划相关联。

有关如何使用 AWS CLI [CreateTrainingJob](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html)命令创建训练作业的更多信息，请参阅[https://docs.aws.amazon.com/cli/latest/reference/sagemaker/create-training-job.html](https://docs.aws.amazon.com/cli/latest/reference/sagemaker/create-training-job.html)。

```
# Create a training job
aws sagemaker create-training-job \
  --training-job-name training-job-name \
  ...
    
  --resource-config '{
        "InstanceType": "ml.p5.48xlarge",
        "InstanceCount": 8,
        "VolumeSizeInGB": 10,
        "TrainingPlanArn": "training-plan-arn"
        }
    }' \
    ...
```

此 AWS CLI 示例命令在 SageMaker AI 中创建一个新的训练作业，并在`--resource-config`参数中传递训练计划。

```
aws sagemaker create-training-job \
  --training-job-name job-name \
  --role-arn arn:aws:iam::111122223333:role/DataAndAPIAccessRole \
  --algorithm-specification '{"TrainingInputMode": "File","TrainingImage": "111122223333.dkr.ecr.us-east-1.amazonaws.com/algo-image:tag", "ContainerArguments": [" "]}' \
  --input-data-config '[{"ChannelName":"training","DataSource":{"S3DataSource":{"S3DataType":"S3Prefix","S3Uri":"s3://bucketname/input","S3DataDistributionType":"ShardedByS3Key"}}}]' \
  --output-data-config '{"S3OutputPath": "s3://bucketname/output"}' \
  --resource-config '{"VolumeSizeInGB":10,"InstanceCount":4,"InstanceType":"ml.p5.48xlarge", "TrainingPlanArn" : "arn:aws:sagemaker:us-east-1:111122223333:training-plan/plan-name"}' \
  --stopping-condition '{"MaxRuntimeInSeconds": 1800}' \
  --region us-east-1
```

创建训练作业后，您可以通过调用 `DescribeTrainingJob` API 来验证该作业是否已正确分配给训练计划。

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

## 使用 SageMaker AI Python 软件开发工具包根据计划运行训练作业
<a name="training-job-sdk"></a>

或者，您可以使用 [SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable/v2.html) 创建与训练计划关联的训练作业。

如果您 JupyterLab 在 Studio 中使用 SageMaker Python SDK 创建训练作业，请确保运行 JupyterLab应用程序的空间使用的执行角色具有使用 SageMaker 训练计划所需的权限。要了解使用 SageMaker 培训计划所需的权限，请参阅[用于 SageMaker 培训计划的 IAM](training-plan-iam-permissions.md)。

以下示例演示了在使用 SageMaker Python SDK 时如何使用`Estimator`对象中的`training_plan`属性创建 SageMaker 训练作业并将其与提供的训练计划关联起来。

有关 SageMaker 估算器的更多信息，请参阅[使用 SageMaker 估算器运行训练作](https://docs.aws.amazon.com/sagemaker/latest/dg/docker-containers-adapt-your-own-private-registry-estimator.html)业。

```
import sagemaker
import boto3
from sagemaker import get_execution_role
from sagemaker.estimator import Estimator
from sagemaker.inputs import TrainingInput

# Set up the session and SageMaker client
session = boto3.Session()
region = session.region_name
sagemaker_session = session.client('sagemaker')

# Get the execution role for the training job
role = get_execution_role()

# Define the input data configuration
trainingInput = TrainingInput(
    s3_data='s3://input-path',
    distribution='ShardedByS3Key',
    s3_data_type='S3Prefix'
)

estimator = Estimator(
    entry_point='train.py',
    image_uri="123456789123.dkr.ecr.{}.amazonaws.com/image:tag",
    role=role,
    instance_count=4,
    instance_type='ml.p5.48xlarge',
    training_plan="training-plan-arn",
    volume_size=20,
    max_run=3600,
    sagemaker_session=sagemaker_session,
    output_path="s3://output-path"
)

# Create the training job
estimator.fit(inputs=trainingInput, job_name=job_name)
```

创建训练作业后，您可以通过调用 `DescribeTrainingJob` API 来验证该作业是否已正确分配给训练计划。

```
# Check job details
sagemaker_session.describe_training_job(TrainingJobName=job_name)
```