对实时推理容器使用私有 Docker 注册表 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

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

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

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

注意

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

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

在亚马逊弹性容器注册表以外的私有 Docker 注册表中存储映像

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

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

  • Docker 注册表必须可从您在VpcConfig在创建模型时指定的参数。

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

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

将存储在私有 Docker 注册表中的图像用于推理容器

  1. 创建映像配置对象并指定一个值Vpc(对于 )RepositoryAccessMode字段中返回的子位置类型。

    image_config = { 'RepositoryAccessMode': 'Vpc' }
  2. 如果您的私人 Docker 注册表需要身份验证,请添加RepositoryAuthConfig对象转换到映像配置对象。对于RepositoryCredentialsProviderArn字段中的RepositoryAuthConfig对象中,指定对象的 Amazon 资源名称 (ARN)Amazon Lambda函数,提供凭据,允许 SageMaker 向您的私有 Docker 注册表进行身份验证。有关如何创建 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. 最后,打电话创建 _endpoint_config创建 _终端点使用您在上一步中创建的模型来创建托管终端节点。

    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 注册表中提取推理映像,请创建Amazon Lambda函数提供凭据,并在调用时提供 Lambda 函数的 Amazon 资源名称 (ARN)。create_model. 当 SageMaker 运行时create_model,它会调用您指定的 Lambda 函数,以获取凭据以向 Docker 注册表进行身份验证。

创建 Lambda 函数

创建Amazon Lambda返回带有以下形式的响应的函数:

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

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

  • 如果您将私有 Docker 注册表设置为使用基本身份验证,则这是用户名密码向注册表进行身份验证。

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

向 Lambda 授予执行角色权限

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

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

其中mylambDAF 函数是 Lambda 函数的名称。有关编辑角色权限策略的信息,请参阅修改角色权限策略(控制台)中的Amazon Identity and Access Management用户指南.

注意

具有AmazonSageMakerFullAccess与其附加的托管策略有权使用SageMaker以它的名义执行。

为 Lambda 创建接口 VPC 终端节点

创建接口终端节点,以便您的 Amazon VPC 可以与您的Amazon Lambda在不通过 Internet 发送流量的情况下运行。有关如何执行此操作的信息,请参阅为 Lambda 配置接口 VPC 终端节点中的Amazon Lambda开发人员指南.

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