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

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

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

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

注意

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

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

在 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 Lambda 函数的 Amazon 资源名称 (ARN),该函数提供允许 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. 最后,调用 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 注册表中提取推理映像,请创建提供凭证的 Amazon Lambda 函数,并在您调用 create_model 时提供 Lambda 函数的 Amazon 资源名称 (ARN)。当 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*" ] }

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

注意

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

为 Lambda 创建接口 VPC 端点

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

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