

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

# 调整您的训练作业，以访问私有 Docker 注册表中的映像
<a name="docker-containers-adapt-your-own-private-registry"></a>

您可以使用私有 [Docker 注册表来代替亚马逊弹性容器注册表](https://docs.docker.com/registry/) (Amazon ECR) Container Registry 来托管用于人工智能训练的映像。 SageMaker 以下说明向您展示如何创建 Docker 注册表、配置虚拟私有云 (VPC) 和训练作业、存储映像以及如何让 SageMaker AI 访问私有 docker 注册表中的训练映像。这些说明还向您展示了如何使用 SageMaker 训练作业需要身份验证的 Docker 注册表。

## 创建映像并将其存储在私有 Docker 注册表中
<a name="docker-containers-adapt-your-own-private-registry-prerequisites"></a>

创建私有 Docker 注册表来存储您的映像。注册表必须：
+ 使用 [Docker Registry HTTP API](https://docs.docker.com/registry/spec/api/) 协议
+ 可以从 `CreateTrainingJob` API [VpcConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html#API_CreateTrainingJob_RequestSyntax)参数中指定的相同 VPC 进行访问。在创建训练作业时输入 `VpcConfig`。
+ 使用来自已知公共证书颁发机构的 [TLS 证书](https://aws.amazon.com/what-is/ssl-certificate/)来保护。

有关创建 Docker 注册表的更多信息，请参阅[部署注册表服务器](https://docs.docker.com/registry/deploying/)。

## 配置您的 VPC 和 SageMaker 训练作业
<a name="docker-containers-adapt-your-own-private-registry-configure"></a>

SageMaker AI 使用您的 VPC 内的网络连接来访问您的 Docker 注册表中的镜像。要将您 Docker 注册表中的映像用于训练，注册表必须可以从您账户中的 Amazon VPC 访问。有关更多信息，请参阅 [使用需要身份验证的 Docker 注册表进行训练](docker-containers-adapt-your-own-private-registry-authentication.md)。

您还必须配置训练作业，将其连接到您的 Docker 注册表有权访问的同一 VPC。有关更多信息，请参阅[为 Amazon VPC 访问配置训练作业](https://docs.aws.amazon.com/sagemaker/latest/dg/train-vpc.html#train-vpc-configure)。

## 使用私有 Docker 注册表中的映像创建训练作业
<a name="docker-containers-adapt-your-own-private-registry-create"></a>

要使用私有 Docker 注册表中的映像进行训练，请使用以下指南配置您的映像、配置和创建训练作业。以下代码示例使用 适用于 Python (Boto3) 的 AWS SDK 客户端。

1. 创建训练映像配置对象，并如下所示为 `TrainingRepositoryAccessMode` 字段输入 `Vpc`。

   ```
   training_image_config = {
       'TrainingRepositoryAccessMode': 'Vpc'
   }
   ```
**注意**  
如果您的私有 Docker 注册表需要身份验证，则必须将 `TrainingRepositoryAuthConfig` 对象添加到训练映像配置对象。您还必须使用对象的`TrainingRepositoryCredentialsProviderArn`字段指定向 A SageMaker I 提供访问凭证的 AWS Lambda 函数的 Amazon 资源名称 (ARN)。`TrainingRepositoryAuthConfig`有关更多信息，请参阅以下示例代码结构。  

   ```
   training_image_config = {
      'TrainingRepositoryAccessMode': 'Vpc',
      'TrainingRepositoryAuthConfig': {
           'TrainingRepositoryCredentialsProviderArn': 'arn:aws:lambda:Region:Acct:function:FunctionName'
      }
   }
   ```

   有关如何创建 Lambda 函数以提供身份验证的信息，请参阅[使用需要身份验证的 Docker 注册表进行训练](docker-containers-adapt-your-own-private-registry-authentication.md)。

1. 使用 Boto3 客户端创建训练作业，并将正确的配置传递给 [create\$1training\$1job](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html) API。以下说明向您演示如何配置组件和创建训练作业。

   1. 创建要传递到 `create_training_job` 的 `AlgorithmSpecification` 对象。使用在上一步中创建的训练映像配置对象，如以下代码示例所示。

      ```
      algorithm_specification = {
         'TrainingImage': 'myteam.myorg.com/docker-local/my-training-image:<IMAGE-TAG>',
         'TrainingImageConfig': training_image_config,
         'TrainingInputMode': 'File'
      }
      ```
**注意**  
要使用映像的固定版本而不是更新版本，请引用映像的[摘要](https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier)，而不是引用名称或标签。

   1. 指定您要传递给 `create_training_job` 的训练作业名称和角色，如以下代码示例中所示。

      ```
      training_job_name = 'private-registry-job'
      execution_role_arn = 'arn:aws:iam::123456789012:role/SageMakerExecutionRole'
      ```

   1. 为您的训练作业的 VPC 配置指定安全组和子网。您的私有 Docker 注册表必须允许来自您指定的安全组的入站流量，如以下代码示例所示。

      ```
      vpc_config = {
          'SecurityGroupIds': ['sg-0123456789abcdef0'],
          'Subnets': ['subnet-0123456789abcdef0','subnet-0123456789abcdef1']
      }
      ```
**注意**  
如果您的子网与私有 Docker 注册表不在同一 VPC 中，则必须在这两 VPCs者之间建立网络连接。 SeeConnect VPCs 使用 [VPC 对等](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-peering.html)连接了解更多信息。

   1. 指定资源配置，包括训练使用的机器学习计算实例和存储卷，如以下代码示例所示。

      ```
      resource_config = {
          'InstanceType': 'ml.m4.xlarge',
          'InstanceCount': 1,
          'VolumeSizeInGB': 10,
      }
      ```

   1. 指定输入和输出数据配置、训练数据集的存储位置以及用于存储模型构件的位置，如以下代码示例所示。

      ```
      input_data_config = [
          {
              "ChannelName": "training",
              "DataSource":
              {
                  "S3DataSource":
                  {
                      "S3DataDistributionType": "FullyReplicated",
                      "S3DataType": "S3Prefix",
                      "S3Uri": "s3://your-training-data-bucket/training-data-folder"
                  }
              }
          }
      ]
      
      output_data_config = {
          'S3OutputPath': 's3://your-output-data-bucket/model-folder'
      }
      ```

   1. 指定模型训练作业可以运行的最大秒数，如以下代码示例所示。

      ```
      stopping_condition = {
          'MaxRuntimeInSeconds': 1800
      }
      ```

   1. 最后，使用在上一步中指定的参数创建训练作业，如以下代码示例所示。

      ```
      import boto3
      sm = boto3.client('sagemaker')
      try:
          resp = sm.create_training_job(
              TrainingJobName=training_job_name,
              AlgorithmSpecification=algorithm_specification,
              RoleArn=execution_role_arn,
              InputDataConfig=input_data_config,
              OutputDataConfig=output_data_config,
              ResourceConfig=resource_config,
              VpcConfig=vpc_config,
              StoppingCondition=stopping_condition
          )
      except Exception as e:
          print(f'error calling CreateTrainingJob operation: {e}')
      else:
          print(resp)
      ```

# 使用 A SageMaker I 估算器来运行训练作业
<a name="docker-containers-adapt-your-own-private-registry-estimator"></a>

您还可以使用 Pyth SageMaker on SDK 中的[估算器](https://sagemaker.readthedocs.io/en/stable/api/training/estimators.html)来处理 SageMaker 训练作业的配置和运行。以下代码示例显示如何使用私有 Docker 注册表中的映像配置和运行估算器。

1. 导入所需的库和依赖项，如以下代码示例中所示。

   ```
   import boto3
   import sagemaker
   from sagemaker.estimator import Estimator
   
   session = sagemaker.Session()
   
   role = sagemaker.get_execution_role()
   ```

1. 向您的训练映像、安全组和子网提供统一资源标识符 (URI)，用于您的训练作业 VPC 配置，如以下代码示例所示。

   ```
   image_uri = "myteam.myorg.com/docker-local/my-training-image:<IMAGE-TAG>"
   
   security_groups = ["sg-0123456789abcdef0"]
   subnets = ["subnet-0123456789abcdef0", "subnet-0123456789abcdef0"]
   ```

   有关`security_group_ids`和的更多信息`subnets`，请参阅 Pyth SageMaker on SDK 的 “[估算器](https://sagemaker.readthedocs.io/en/stable/api/training/estimators.html)” 部分中的相应参数描述。
**注意**  
SageMaker AI 使用您的 VPC 内的网络连接来访问您的 Docker 注册表中的镜像。要将您 Docker 注册表中的映像用于训练，注册表必须可以从您账户中的 Amazon VPC 访问。

1. 或者，如果您的 Docker 注册表需要身份验证，则还必须指定向 AI 提供访问凭证 SageMaker 的函数的 AWS Lambda 亚马逊资源名称 (ARN)。以下示例演示了如何指定 ARN。

   ```
   training_repository_credentials_provider_arn = "arn:aws:lambda:us-west-2:1234567890:function:test"
   ```

   有关使用需要身份验证的 Docker 注册表中的映像的更多信息，请参阅下文中的**使用需要身份验证的 Docker 注册表进行训练**。

1. 使用前面步骤中的代码示例来配置估算器，如以下代码示例所示。

   ```
   # The training repository access mode must be 'Vpc' for private docker registry jobs 
   training_repository_access_mode = "Vpc"
   
   # Specify the instance type, instance count you want to use
   instance_type="ml.m5.xlarge"
   instance_count=1
   
   # Specify the maximum number of seconds that a model training job can run
   max_run_time = 1800
   
   # Specify the output path for the model artifacts
   output_path = "s3://your-output-bucket/your-output-path"
   
   estimator = Estimator(
       image_uri=image_uri,
       role=role,
       subnets=subnets,
       security_group_ids=security_groups,
       training_repository_access_mode=training_repository_access_mode,
       training_repository_credentials_provider_arn=training_repository_credentials_provider_arn,  # remove this line if auth is not needed
       instance_type=instance_type,
       instance_count=instance_count,
       output_path=output_path,
       max_run=max_run_time
   )
   ```

1. 使用您的作业名称和输入路径作为参数来调用 `estimator.fit`，以启动训练作业，如以下代码示例所示。

   ```
   input_path = "s3://your-input-bucket/your-input-path"
   job_name = "your-job-name"
   
   estimator.fit(
       inputs=input_path,
       job_name=job_name
   )
   ```

# 使用需要身份验证的 Docker 注册表进行训练
<a name="docker-containers-adapt-your-own-private-registry-authentication"></a>

如果您的 Docker 注册表需要身份验证，则必须创建一个向 SageMaker AI 提供访问凭据的 AWS Lambda 函数。然后，创建一个训练作业并在 [create\$1training\$1job](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.create_training_job) API 中提供此 Lambda 函数的 ARN。最后，您可以选择创建接口 VPC 端点，以便您的 VPC 可以与 Lambda 函数通信，而无需通过互联网发送流量。以下指南演示如何创建 Lambda 函数、为其分配正确的角色以及创建接口 VPC 端点。

## 创建 Lambda 函数
<a name="docker-containers-adapt-your-own-private-registry-authentication-create-lambda"></a>

创建一个将访问凭证传递给 SageMaker AI 并返回响应的 AWS Lambda 函数。以下代码示例创建 Lambda 函数处理程序，如下所示。

```
def handler(event, context):
   response = {
      "Credentials": {"Username": "username", "Password": "password"}
   }
   return response
```

设置私有 Docker 注册表所用的身份验证类型决定了您的 Lambda 函数返回的响应内容，如下所示。
+ 如果您的私有 Docker 注册表使用基本身份验证，则 Lambda 函数将返回所需的用户名和密码，以便向注册表进行身份验证。
+ 如果您的私有 Docker 注册表使用[持有者令牌身份验证](https://docs.docker.com/registry/spec/auth/token/)，则用户名和密码发送到您的授权服务器，该服务器将返回一个持有者令牌。然后，此令牌用于对您的私有 Docker 注册表进行身份验证。

**注意**  
如果您在同一个账户的注册表中有多个 Lambda 函数，并且您的训练作业的执行角色相同，则一个注册表的训练作业可以访问其他注册表的 Lambda 函数。

## 将正确的角色权限授予 Lambda 函数
<a name="docker-containers-adapt-your-own-private-registry-authentication-lambda-role"></a>

您在 [IAMrole](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-roles.html)`create_training_job`API 中使用的必须具有调用 AWS Lambda 函数的权限。以下代码示例演示如何将扩展 IAM 角色的权限，使其能够调用 `myLambdaFunction`。

```
{
    "Effect": "Allow",
    "Action": [
        "lambda:InvokeFunction"
    ],
    "Resource": [
        "arn:aws:lambda:*:*:function:*myLambdaFunction*"
    ]
}
```

有关编辑角色权限策略的信息，请参阅《AWS Identity and Access Management 用户指南》**中的[修改角色权限策略（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-modify_permissions-policy)。

**注意**  
附加了**AmazonSageMakerFullAccess**托管策略的 IAM 角色有权调用名称中带有 “SageMaker AI” 的任何 Lambda 函数。

## 为 Lambda 创建接口 VPC 端点
<a name="docker-containers-adapt-your-own-private-registry-authentication-lambda-endpoint"></a>

通过创建接口端点，您的 Amazon VPC 可以与 Lambda 函数通信而无需通过互联网发送流量。有关更多信息，请参阅《AWS Lambda 开发人员指南》**中的[为 Lambda 配置接口 VPC 终端节点](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc-endpoints.html)。

创建接口终端节点后， SageMaker 培训将通过您的 VPC 向发送请求，从而调用您的 Lambda 函数。`lambda.region.amazonaws.com`如果您在创建接口端点时选择**启用 DNS 名称**，则 [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 会将调用路由到 Lambda 接口端点。如果您使用不同的 DNS 提供商，则必须将 `lambda.region.amazonaws.co`m 映射到您的 Lambda 接口端点。