为实时推理容器使用私有 Docker 注册表 - Amazon SageMaker

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

为实时推理容器使用私有 Docker 注册表

默认情况下,Amazon SageMaker 托管允许您使用存储在 Amazon ECR 中的图像来构建容器以进行实时推理。或者,您可以从私有 Docker 注册表中的映像来构建容器用于实时推理。私有注册表必须可以从您账户中的 Amazon VPC 访问。您基于存储在私有 Docker 注册表中的映像创建的模型,必须配置为连接到可以访问私有 Docker 注册表的同一个 VPC。有关连接到 VPC 中模型的更多信息,请参阅允许 SageMaker 托管终端节点访问您的 Amazon 中的资源 VPC

您的 Docker 注册表必须使用来自已知公共证书颁发机构 (CA) 的 TLS 证书进行保护。

注意

您的私有 Docker 注册表必须允许来自您在模型的 VPC 配置中指定的安全组的入站流量,以便 SageMaker 托管能够从您的注册表中提取模型映像。

SageMaker DockerHub 如果您的 VPC 内有通往开放互联网的路径,则可以从中提取模型图像。

在 Amazon Elastic Container Registry 以外的私有 Docker 注册表中存储映像

要使用私有 Docker 注册表来存储您的图像以进行 SageMaker 实时推理,请创建一个可从您的 Amazon VPC 访问的私有注册表。有关创建 Docker 注册表的信息,请参阅 Docker 文档中的部署注册表服务器。Docker 注册表必须遵守以下要求:

  • 注册表必须是 Docker 注册表 HTTP API V2 注册表。

  • Docker 注册表必须可以从您在创建模型时,在 VpcConfig 参数中指定的相同 VPC 访问。

使用来自私有 Docker 注册表的映像进行实时推理

创建模型并将其部署到 SageMaker 托管时,可以指定它使用私有 Docker 注册表中的镜像来构建推理容器。在您传递给 create_model 函数的调用的 PrimaryContainer 参数中,在 ImageConfig 对象中指定此项。

将存储在私有 Docker 注册表中的映像用于推理容器
  1. 创建映像配置对象并为 RepositoryAccessMode 字段指定 Vpc 的值。

    image_config = { 'RepositoryAccessMode': 'Vpc' }
  2. 如果您的私有 Docker 注册表需要身份验证,请添加 RepositoryAuthConfig 对象到映像配置对象。在RepositoryAuthConfig对象的RepositoryCredentialsProviderArn字段中,指定一个函数的 Amazon 资源名称 (ARN),该 AWS Lambda 函数提供允许对您的私有 Docker 注册 SageMaker 表进行身份验证的凭证。有关如何创建 Lambda 函数以提供身份验证的信息,请参阅允许 SageMaker 向私有 Docker 注册表进行身份验证

    image_config = { 'RepositoryAccessMode': 'Vpc', 'RepositoryAuthConfig': { 'RepositoryCredentialsProviderArn': 'arn:aws:lambda:Region:Acct:function:FunctionName' } }
  3. 创建要传递到 create_model 的主容器对象,使用您在上一步中创建的映像配置对象。

    摘要表中提供您的映像。如果您使用:latest标签提供图片,则存在 SageMaker 提取比预期更新的图像版本的风险。使用摘要表单可以确保 SageMaker 提取预期的图像版本。

    primary_container = { 'ContainerHostname': 'ModelContainer', 'Image': 'myteam.myorg.com/docker-local/my-inference-image:<IMAGE-TAG>', 'ImageConfig': image_config }
  4. 指定要传递给 create_model 的模型名称和执行角色。

    model_name = 'vpc-model' execution_role_arn = 'arn:aws:iam::123456789012:role/SageMakerExecutionRole'
  5. 为您模型的 VPC 配置指定一个或多个安全组和子网。您的私有 Docker 注册表必须允许来自您指定的安全组的入站流量。您指定的子网必须与私有 Docker 注册表位于同一 VPC 中。

    vpc_config = { 'SecurityGroupIds': ['sg-0123456789abcdef0'], 'Subnets': ['subnet-0123456789abcdef0','subnet-0123456789abcdef1'] }
  6. 获取 Boto3 客户端 SageMaker 。

    import boto3 sm = boto3.client('sagemaker')
  7. 通过调用 create_model 来创建模型,使用您在之前的步骤中为 PrimaryContainerVpcConfig 参数指定的值。

    try: resp = sm.create_model( ModelName=model_name, PrimaryContainer=primary_container, ExecutionRoleArn=execution_role_arn, VpcConfig=vpc_config, ) except Exception as e: print(f'error calling CreateModel operation: {e}') else: print(resp)
  8. 最后,调用 create_endpoint_configcreate_endpoint 以创建托管端点,使用您在之前步骤中创建的模型。

    endpoint_config_name = 'my-endpoint-config' sm.create_endpoint_config( EndpointConfigName=endpoint_config_name, ProductionVariants=[ { 'VariantName': 'MyVariant', 'ModelName': model_name, 'InitialInstanceCount': 1, 'InstanceType': 'ml.t2.medium' }, ], ) endpoint_name = 'my-endpoint' sm.create_endpoint( EndpointName=endpoint_name, EndpointConfigName=endpoint_config_name, ) sm.describe_endpoint(EndpointName=endpoint_name)

允许 SageMaker 向私有 Docker 注册表进行身份验证

要从需要身份验证的私有 Docker 注册表中提取推理映像,请创建一个提供证书的 AWS Lambda 函数,并在调用 create_model 时提供 Lambda 函数的亚马逊资源名称 (ARN)。 SageMaker 运行时create_model,它会调用您指定的 Lambda 函数来获取凭证,以便向 Docker 注册表进行身份验证。

创建 Lambda 函数

创建一个返回以下格式的响应的 AWS Lambda 函数:

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

根据您为私有 Docker 注册表设置的身份验证方式,Lambda 函数返回的凭证可能是以下任一内容:

  • 如果您将私有 Docker 注册表设置为使用基本身份验证,请提供登录凭证以便向注册表进行身份验证。

  • 如果您将私有 Docker 注册表设置为使用持有者令牌身份验证,则登录凭证将发送到您的授权服务器,该服务器将返回一个持有者令牌,然后可用于向私有 Docker 注册表进行身份验证。

向 Lambda 授予执行角色权限

用于调用的执行角色create_model必须具有调用 AWS Lambda 函数的权限。将以下内容添加到您执行角色的权限策略中。

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

myLambdaFunction的 Lambda 函数的名称在哪里。有关编辑角色权限策略的信息,请参阅《AWS Identity and Access Management 用户指南》中的修改角色权限策略(控制台)

注意

附加了AmazonSageMakerFullAccess托管策略的执行角色有权调用其名称SageMaker中包含的任何 Lambda 函数。

为 Lambda 创建接口 VPC 端点

创建接口端点,以便您的 Amazon VPC 无需通过互联网发送流量,即可与 AWS Lambda 函数通信。有关如何完成此操作的更多信息,请参阅《AWS Lambda 开发人员指南》中的为 Lambda 配置接口 VPC 端点

SageMaker 托管通过您的 VPC 向发送请求以lambda.region.amazonaws.com调用您的 Lambda 函数。如果您在创建接口端点时选择私有 DNS 名称,则 Amazon Route 53 会将调用路由到 Lambda 接口端点。如果您使用不同的 DNS 提供商,请务必将 lambda.region.amazonaws.com 映射到您的 Lambda 接口端点。