

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

# SageMaker 人工智能 AWS Batch 入门
<a name="getting-started-sagemaker"></a>

AWS Batch 服务作业使您能够通过具有计划、优先级划分和排队功能的 AWS Batch 作业队列提交 SageMaker 训练作业。本教程演示如何使用 AWS Batch 服务作业设置和运行简单的 SageMaker 训练作业。

**Contents**
+ [概述](#getting-started-sagemaker-context)
+ [先决条件](#getting-started-sagemaker-prerequisites)
+ [步骤 1：创建 A SageMaker I 执行角色](#getting-started-sagemaker-step-1)
+ [第 2 步：创建服务环境](#getting-started-sagemaker-step-2)
+ [步骤 3：创建 SageMaker 任务队列](#getting-started-sagemaker-step-3)
+ [第 4 步：创建和提交训练作业](#getting-started-sagemaker-step-4)
+ [第 5 步：监控作业状态](#getting-started-sagemaker-step-5)
+ [第 6 步：查看作业输出](#getting-started-sagemaker-step-6)
+ [第 7 步：清理教程资源](#getting-started-sagemaker-step-7)
+ [其他资源](#getting-started-sagemaker-additional-resources)

## 概述
<a name="getting-started-sagemaker-context"></a>

本教程演示如何使用为 SageMaker 训练作业设置 AWS Batch 服务作业 AWS CLI。

**目标受众**  
本教程专为负责大规模设置和运行机器学习训练作业的数据科学家和开发人员设计。

**使用的功能**  
本教程向您展示了如何使用 t AWS CLI o：  
+ 为 SageMaker 训练作业创建服务环境
+ 创建 SageMaker 训练作业队列
+ 使用 `SubmitServiceJob` API 提交服务作业
+ 监控作业状态并查看输出
+ 访问训练作业的 CloudWatch 日志

**所需时间**  
完成本教程大约需要 15 分钟。

**区域限制**  
本教程可以在任何同时提供 SageMaker AI AWS Batch 和 AI 的 AWS 地区完成。

**资源使用成本**  
创建 AWS 账户不收取任何费用。但是，实施此解决方案可能需要为以下资源付费：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/batch/latest/userguide/getting-started-sagemaker.html)

## 先决条件
<a name="getting-started-sagemaker-prerequisites"></a>

在开始本教程之前，必须安装和配置以下工具和资源，以便创建和管理两者 AWS Batch 以及 SageMaker AI 资源。
+ **AWS CLI**— 用于处理 AWS 服务（包括 AWS Batch 和 SageMaker AI）的命令行工具。本指南要求您使用 2.8.6 或更高版本。有关更多信息，请参阅《AWS Command Line Interface 用户指南》**中的[安装、更新和卸载 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)。安装完成后 AWS CLI，我们建议您也对其进行配置。有关更多信息，请参阅《AWS Command Line Interface 用户指南》中的[使用 `aws configure` 进行快速配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。**

## 步骤 1：创建 A SageMaker I 执行角色
<a name="getting-started-sagemaker-step-1"></a>

SageMaker AI 使用执行角色代表您使用其他 AWS 服务执行操作。您必须创建执行角色并授予 SageMaker AI 权限，才能使用训练作业所需的服务和资源。使用 `AmazonSageMakerFullAccess` 托管式策略，因为该策略包含了 Amazon S3 权限。

**注意**  
按照以下说明为本教程创建 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)”。

1. 

**创建 IAM 角色**

   使用以下信任策略创建名为 `sagemaker-trust-policy.json` 的 JSON 文件：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "sagemaker.amazonaws.com"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

   使用信任策略创建 IAM 角色：

   ```
   aws iam create-role \
       --role-name SageMakerExecutionRole \
       --assume-role-policy-document file://sagemaker-trust-policy.json \
       --description "Execution role for SageMaker training jobs"
   ```

1. 

**附加 托管式策略**

   将所需的托管式策略附加到该角色：

   ```
   aws iam attach-role-policy \
       --role-name SageMakerExecutionRole \
       --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess
   ```

   ```
   aws iam attach-role-policy \
       --role-name SageMakerExecutionRole \
       --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
   ```

1. 

**记下角色 ARN**

   获取角色 ARN，您将在后续步骤中使用它：

   ```
   aws iam get-role --role-name SageMakerExecutionRole --query 'Role.Arn' --output text
   ```

   保存此 ARN，因为您将在创建训练作业有效载荷时使用它。

## 第 2 步：创建服务环境
<a name="getting-started-sagemaker-step-2"></a>

服务环境定义了 SageMaker 训练作业的容量限制。服务环境包含了可以同时运行的最大训练实例数。

**重要**  
当您为 T SageMaker raining 创建第一个服务环境时，会在您的账户`AWSServiceRoleForAWSBatchWithSagemaker`中 AWS Batch 自动创建一个名为的服务相关角色。此角色 AWS Batch 允许您代表您对 SageMaker 培训作业进行排队和管理。有关此服务相关角色及其权限的更多信息，请参阅[在 SageMaker AI 中 AWS Batch 使用角色](using-service-linked-roles-batch-sagemaker.md)。

创建一个最多可处理 5 个实例的服务环境：

```
aws batch create-service-environment \
    --service-environment-name TutorialServiceEnvironment \
    --service-environment-type SAGEMAKER_TRAINING \
    --capacity-limits capacityUnit=NUM_INSTANCES,maxCapacity=5
```

输出：

```
{
    "serviceEnvironmentName": "TutorialServiceEnvironment",
    "serviceEnvironmentArn": "arn:aws:batch:your-region:your-account-id:service-environment/TutorialServiceEnvironment"
}
```

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

```
aws batch describe-service-environments --service-environments TutorialServiceEnvironment
```

输出：

```
{
    "serviceEnvironments": [
        {
            "serviceEnvironmentName": "TutorialServiceEnvironment",
            "serviceEnvironmentArn": "arn:aws:batch:your-region:your-account-id:service-environment/TutorialServiceEnvironment",
            "serviceEnvironmentType": "SAGEMAKER_TRAINING",
            "state": "ENABLED",
            "status": "VALID",
            "capacityLimits": [
                {
                    "maxCapacity": 5,
                    "capacityUnit": "NUM_INSTANCES"
                }
            ],
            "tags": {}
        }
    ]
}
```

有关服务环境的更多信息，请参阅[的服务环境 AWS Batch](service-environments.md)。

## 步骤 3：创建 SageMaker 任务队列
<a name="getting-started-sagemaker-step-3"></a>

 SageMaker 作业队列管理服务作业的调度和执行。提交到该队列的作业将根据可用容量分配到您的服务环境。

创建 SageMaker 训练作业队列：

```
aws batch create-job-queue \
    --job-queue-name my-sm-training-fifo-jq \
    --job-queue-type SAGEMAKER_TRAINING \
    --priority 1 \
    --service-environment-order order=1,serviceEnvironment=TutorialServiceEnvironment
```

输出：

```
{
    "jobQueueName": "my-sm-training-fifo-jq",
    "jobQueueArn": "arn:aws:batch:your-region:your-account-id:job-queue/my-sm-training-fifo-jq"
}
```

验证作业队列是否已成功创建：

```
aws batch describe-job-queues --job-queues my-sm-training-fifo-jq
```

输出：

```
{
    "jobQueues": [
        {
            "jobQueueName": "my-sm-training-fifo-jq",
            "jobQueueArn": "arn:aws:batch:your-region:your-account-id:job-queue/my-sm-training-fifo-jq",
            "state": "ENABLED",
            "status": "VALID",
            "statusReason": "JobQueue Healthy",
            "priority": 1,
            "computeEnvironmentOrder": [],
            "serviceEnvironmentOrder": [
                {
                    "order": 1,
                    "serviceEnvironment": "arn:aws:batch:your-region:your-account-id:service-environment/TutorialServiceEnvironment"
                }
            ],
            "jobQueueType": "SAGEMAKER_TRAINING",
            "tags": {}
        }
    ]
}
```

有关 SageMaker 任务队列的更多信息，请参阅[在 AWS Batch 中创建 SageMaker 训练作业队列](create-sagemaker-job-queue.md)。

## 第 4 步：创建和提交训练作业
<a name="getting-started-sagemaker-step-4"></a>

现在，您将创建一个简单的训练作业并将其提交到您的作业队列中。此示例使用一个基本的“hello world”训练作业来演示服务作业的功能。

使用以下内容创建名为 `my_training_job.json` 的文件。*your-account-id*用您的 AWS 账户 ID 替换：

**注意**  
`S3OutputPath`是创建 SageMaker 训练任务所必需的，但是本教程的结果未存储在 Amazon S3 存储桶中，您可以使用以下 JSON 中的路径。在生产环境中，如果您选择使用 Amazon S3 存储桶来存储输出，则需要有效的存储桶。

```
{
    "TrainingJobName": "my-simple-training-job",
    "RoleArn": "arn:aws:iam::your-account-id: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-s3-bucket/output"
    },
    "StoppingCondition": {
        "MaxRuntimeInSeconds": 30
    }
}
```

使用 [SubmitServiceJob](https://docs.aws.amazon.com/batch/latest/APIReference/API_SubmitServiceJob.html)API 提交训练作业：

```
aws batch submit-service-job \
    --job-queue my-sm-training-fifo-jq \
    --job-name my-batch-sm-job \
    --service-job-type SAGEMAKER_TRAINING \
    --retry-strategy attempts=1 \
    --timeout-config attemptDurationSeconds=60 \
    --service-request-payload file://my_training_job.json
```

输出：

```
{
    "jobArn": "arn:aws:batch:your-region:your-account-id:service-job/your-job-id",
    "jobName": "my-batch-sm-job",
    "jobId": "your-job-id"
}
```

有关服务作业有效载荷的更多信息，请参阅[中的服务任务有效负载 AWS Batch](service-job-payload.md)。有关提交服务作业的更多信息，请参阅[在中提交服务作业 AWS Batch](service-job-submit.md)。

## 第 5 步：监控作业状态
<a name="getting-started-sagemaker-step-5"></a>

您可以使用以下方法监控您的训练作业 AWS Batch APIs：[DescribeServiceJob[ListServiceJobs](https://docs.aws.amazon.com/batch/latest/APIReference/API_ListServiceJobs.html)](https://docs.aws.amazon.com/batch/latest/APIReference/API_DescribeServiceJob.html)、和[GetJobQueueSnapshot](https://docs.aws.amazon.com/batch/latest/APIReference/API_GetJobQueueSnapshot.html)。本节介绍检查作业状态和队列信息的不同方法。

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

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

输出：

```
{
    "jobSummaryList": [
        {
            "latestAttempt": {
                "serviceResourceId": {
                    "name": "TrainingJobArn",
                    "value": "arn:aws:sagemaker:your-region:your-account-id:training-job/AWSBatch<my-simple-training-job><your-attempt-id>"
                }
            },
            "createdAt": 1753718760,
            "jobArn": "arn:aws:batch:your-region:your-account-id:service-job/your-job-id",
            "jobId": "your-job-id",
            "jobName": "my-batch-sm-job",
            "serviceJobType": "SAGEMAKER_TRAINING",
            "status": "RUNNING",
            "startedAt": 1753718820
        }
    ]
}
```

查看处于 `RUNNABLE` 状态的作业：

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

获取队列中即将执行的作业的快照：

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

输出：

```
{
    "frontOfQueue": {
        "jobs": [
            {
                "jobArn": "arn:aws:batch:your-region:your-account-id:service-job/your-job-id",
                "earliestTimeAtPosition": 1753718880
            },
            {
                "jobArn": "arn:aws:batch:your-region:your-account-id:service-job/your-job-id-2",
                "earliestTimeAtPosition": 1753718940
            }
        ],
        "lastUpdatedAt": 1753718970
    }
}
```

按名称搜索作业：

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

输出：

```
{
    "jobSummaryList": [
        {
            "latestAttempt": {
                "serviceResourceId": {
                    "name": "TrainingJobArn",
                    "value": "arn:aws:sagemaker:your-region:your-account-id:training-job/AWSBatch<my-simple-training-job><your-attempt-id>"
                }
            },
            "createdAt": 1753718760,
            "jobArn": "arn:aws:batch:your-region:your-account-id:service-job/your-job-id",
            "jobId": "your-job-id",
            "jobName": "my-batch-sm-job",
            "serviceJobType": "SAGEMAKER_TRAINING",
            "status": "RUNNING"
        }
    ]
}
```

有关作业状态映射的更多信息，请参阅[将 AWS Batch 服务作业状态映射到 SageMaker AI 状态](service-job-status.md)。

## 第 6 步：查看作业输出
<a name="getting-started-sagemaker-step-6"></a>

任务完成后，您可以通过两者和 SageMaker AI 查看其输出 AWS Batch 和日志 APIs。

从 AWS Batch以下地址获取有关您的工作的详细信息：

```
aws batch describe-service-job \
    --job-id your-job-id
```

输出：

```
{
    "attempts": [
        {
            "serviceResourceId": {
                "name": "TrainingJobArn",
                "value": "arn:aws:sagemaker:your-region:your-account-id:training-job/AWSBatch<my-simple-training-job><your-attempt-id>"
            },
            "startedAt": 1753718820,
            "stoppedAt": 1753718880,
            "statusReason": "Received status from SageMaker: Training job completed"
        }
    ],
    "createdAt": 1753718760,
    "jobArn": "arn:aws:batch:your-region:your-account-id:service-job/your-job-id",
    "jobId": "your-job-id",
    "jobName": "my-batch-sm-job",
    "jobQueue": "arn:aws:batch:your-region:your-account-id:job-queue/my-sm-training-fifo-jq",
    "latestAttempt": {
        "serviceResourceId": {
            "name": "TrainingJobArn",
            "value": "arn:aws:sagemaker:your-region:your-account-id:training-job/AWSBatch<my-simple-training-job><your-attempt-id>"
        }
    },
    "retryStrategy": {
        "attempts": 1,
        "evaluateOnExit": []
    },
    "serviceRequestPayload": "your-training-job-request-json",
    "serviceJobType": "SAGEMAKER_TRAINING",
    "startedAt": 1753718820,
    "status": "SUCCEEDED",
    "statusReason": "Received status from SageMaker: Training job completed",
    "stoppedAt": 1753718880,
    "tags": {},
    "timeoutConfig": {
        "attemptDurationSeconds": 60
    }
}
```

此命令返回全面的作业信息，包括 SageMaker 训练作业 ARN，您可以使用该信息直接通过 SageMaker AI 访问作业：

```
aws sagemaker describe-training-job \
    --training-job-name AWSBatch<my-simple-training-job><your-attempt-id>
```

要查看训练作业的 CloudWatch 日志，请先获取日志流名称：

```
aws logs describe-log-streams \
    --log-group-name /aws/sagemaker/TrainingJobs \
    --log-stream-name-prefix AWSBatchmy-simple-training-job
```

输出：

```
{
    "logStreams": [
        {
            "logStreamName": "your-log-stream-name",
            "creationTime": 1753718830,
            "firstEventTimestamp": 1753718840,
            "lastEventTimestamp": 1753718850,
            "lastIngestionTime": 1753718860,
            "uploadSequenceToken": upload-sequence-token,
            "arn": "arn:aws:logs:your-region:your-account-id:log-group:/aws/sagemaker/TrainingJobs:log-stream:AWSBatch<my-simple-training-job><your-attempt-id>/algo-1-algo-id",
            "storedBytes": 0
        }
    ]
}
```

然后使用上一响应中的日志流名称检索日志：

```
aws logs get-log-events \
    --log-group-name /aws/sagemaker/TrainingJobs \
    --log-stream-name your-log-stream-name
```

输出：

```
{
    "events": [
        {
            "timestamp": 1753718845,
            "message": "hello world",
            "ingestionTime": 1753718865
        }
    ],
    "nextForwardToken": "next-forward-token",
    "nextBackwardToken": "next-backward-token"
}
```

日志输出会显示来自训练作业的“hello world”消息，确认作业已成功执行。

## 第 7 步：清理教程资源
<a name="getting-started-sagemaker-step-7"></a>

完成本教程后，请清除您创建的资源，以免持续产生费用。

首先，禁用并删除作业队列：

```
aws batch update-job-queue \
    --job-queue my-sm-training-fifo-jq \
    --state DISABLED
```

等待作业队列被禁用，然后将其删除：

```
aws batch delete-job-queue \
    --job-queue my-sm-training-fifo-jq
```

然后禁用并删除服务环境：

```
aws batch update-service-environment \
    --service-environment TutorialServiceEnvironment \
    --state DISABLED
```

等待服务环境被禁用，然后将其删除：

```
aws batch delete-service-environment \
    --service-environment TutorialServiceEnvironment
```

## 其他资源
<a name="getting-started-sagemaker-additional-resources"></a>

完成本教程后，您可以探索以下主题：
+ 我们建议使用 PySDK 创建服务作业并将其提交到您的作业队列，因为 PySDK 提供了帮助程序类和实用程序。有关使用 pySDK 的示例，请参阅上的 [SageMaker AI 示例](https://github.com/aws/amazon-sagemaker-examples)。 GitHub
+ 了解有关 [中的服务职位 AWS Batch](service-jobs.md) 的更多信息。
+ 探索 [中的服务任务有效负载 AWS Batch](service-job-payload.md)，以了解更复杂的训练作业配置。
+ 了解有关 [在中提交服务作业 AWS Batch](service-job-submit.md) 和 `SubmitServiceJob` API 的信息。
+ 参阅[将 AWS Batch 服务作业状态映射到 SageMaker AI 状态](service-job-status.md)以了解作业状态变换。
+ 请访问 [SageMaker AI Python SDK 文档](https://sagemaker.readthedocs.io/en/stable/)，了解更多使用 Python 创建和提交 SageMaker 训练作业的功能丰富的方法。
+ 浏览[SageMaker示例笔记本](https://github.com/aws/amazon-sagemaker-examples)，了解更复杂的机器学习工作流程。