将多容器终端节点与直接调用结合使用 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

将多容器终端节点与直接调用结合使用

SageMaker 多容器终端节点使客户能够部署多个容器以在SageMaker终端节点上部署不同的模型。您可以在单个终端节点上托管最多 5 个不同的推理容器。通过使用直接调用,您可以将请求发送到多容器终端节点上托管的特定推理容器。

使用直接调用来调用多容器终端节点

要使用直接调用来调用多容器终端节点,请像调用任何其他终端节点一样调用 https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker-runtime.html#SageMakerRuntime.Client.invoke_endpoint invoke_endpoint,并使用 TargetContainerHostname 参数指定要调用的容器。

以下示例直接调用多容器终端节点secondContainer的 来获取预测。

import boto3 runtime_sm_client = boto3.Session().client('sagemaker-runtime') response = runtime_sm_client.invoke_endpoint( EndpointName ='my-endpoint', ContentType = 'text/csv', TargetContainerHostname='secondContainer', Body = body)

对于每个针对多容器终端节点的直接调用请求,只有具有 的容器TargetContainerHostname来处理调用请求。如果您执行以下任一操作,您将收到验证错误:

  • 指定TargetContainerHostname终端节点中不存在的

  • 请勿在针对为直接调用配置的终端节点的请求TargetContainerHostname中为 指定值

  • 在对终端节点的 请求TargetContainerHostname中为 指定未配置为直接调用的值。

使用具有直接调用的多容器终端节点的安全性

对于具有直接调用的多容器终端节点,通过共享内存和存储卷,单个实例中托管了多个容器。您有责任使用安全容器,维护请求到目标容器的正确映射,并为用户提供对目标容器的正确访问权限。 SageMaker 使用 IAM 角色来提供基于IAM身份的策略,这些策略可用于指定是允许还是拒绝对该角色的访问,以及在什么条件下访问。有关 IAM 角色的信息,请参阅 IAM 用户指南中的 AWS Identity and Access Management 角色。有关基于身份的策略的信息,请参阅基于身份的策略和基于资源的策略

默认情况下,在具有直接调用的多容器终端节点上具有IAM权限的 InvokeEndpoint 委托人可以使用您在调用 时指定的终端节点名称调用终端节点中的任何容器invoke_endpoint。如果您需要限制对多容器终端节点内一组有限的容器invoke_endpoint的访问,请使用 sagemaker:TargetContainerHostname IAM 条件键。以下策略说明如何限制对终端节点中特定容器的调用。

以下策略仅在 invoke_endpoint 字段的值与指定的正则表达式之一匹配时允许TargetContainerHostname请求。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "sagemaker:InvokeEndpoint" ], "Effect": "Allow", "Resource": "arn:aws:sagemaker:region:account-id:endpoint/endpoint_name", "Condition": { "StringLike": { "sagemaker:TargetContainerHostname": ["customIps*", "common*"] } } } ] }

invoke_endpoint 字段的值与TargetContainerHostname语句中的指定正则表达式之一匹配时,以下策略将拒绝Deny请求。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "sagemaker:InvokeEndpoint" ], "Effect": "Allow", "Resource": "arn:aws:sagemaker:region:account-id:endpoint/endpoint_name", "Condition": { "StringLike": { "sagemaker:TargetContainerHostname": ["*"] } } }, { "Action": [ "sagemaker:InvokeEndpoint" ], "Effect": "Deny", "Resource": "arn:aws:sagemaker:region:account-id:endpoint/endpoint_name", "Condition": { "StringLike": { "sagemaker:TargetContainerHostname": ["special*"] } } } ] }

有关 SageMaker 条件键的信息,请参阅 SageMaker 用户指南 AWS Identity and Access Management中的 的条件键。

具有直接调用的多容器终端节点的指标

除了中列出的终端节点指标之外使用 Amazon SageMaker 监控 Amazon CloudWatch, SageMaker 还提供了每个容器的指标。

具有直接调用的多容器终端节点的每容器指标位于 中CloudWatch,并分为两个命名空间: AWS/SageMakeraws/sagemaker/EndpointsAWS/SageMaker 命名空间包括与调用相关的指标, aws/sagemaker/Endpoints 命名空间包括内存和 CPU 利用率指标。

下表列出了具有直接调用的多容器终端节点的每容器指标。所有指标都对特定变体使用 [EndpointName, VariantName, ContainerName] 维度,该维度筛选特定终端节点上的指标,并与特定容器对应。这些指标与推理管道的指标名称相同,但位于每个容器级别 [EndpointName, VariantName, ContainerName]。

指标名称 描述 维度 NameSpace
Invocations 发送到终端节点中的容器InvokeEndpoint的请求数。要获取发送到该容器的请求总数,请使用 Sum 统计数据。单位:无 有效统计数据Sum:、 Sample Count EndpointName, VariantName, ContainerName AWS/SageMaker
Invocation4XX Errors 模型在特定容器上返回 的 InvokeEndpoint HTTP 响应代码4xx的请求数。对于每个 4xx 响应,SageMaker 都会发送 1。单位:无 有效统计数据Average:、 Sum EndpointName, VariantName, ContainerName AWS/SageMaker
Invocation5XX Errors 模型在特定容器上返回 的 InvokeEndpoint HTTP 响应代码5xx的请求数。对于每个 5xx 响应,SageMaker 都会发送 1。单位:无 有效统计数据Average:、 Sum EndpointName, VariantName, ContainerName AWS/SageMaker
ContainerLatency 目标容器从 查看时响应所用的时间SageMaker。ContainerLatency 包括发送请求、从模型的容器中提取响应以及在容器中完成推理所用的时间。单位:微秒 有效统计数据Average:、SumMinMaxSample Count EndpointName, VariantName, ContainerName AWS/SageMaker
OverheadLatency 为 响应客户端请求SageMaker开销所花费的时间增加的时间。OverheadLatency 计算从 SageMaker 收到请求到它将响应返回给客户端的时间减去 ModelLatency。除其他因素外,开销延迟还可能由于请求和响应负载大小、请求频率以及请求的身份验证或授权而变化。单位:微秒 有效统计数据Average:、SumMinMax、“样本数” EndpointName, VariantName, ContainerName AWS/SageMaker
CPUUtilization 实例上运行的每个容器所使用的 CPU 单元的百分比。值范围从 0% 到 100%,并且乘以 CPU 数目。例如,如果有四个 CPU,CPUUtilization 可以介于 0% 到 400% 之间。对于具有直接调用的终端节点CPUUtilization 指标的数量等于该终端节点中的容器数量。单位:百分比 EndpointName, VariantName, ContainerName aws/sagemaker/Endpoints
MemoryUtilizaton 实例上运行的每个容器所使用的内存的百分比。此值范围从 0% 到 100%。与 CPUUtilization 类似,在具有直接调用的终端节点中MemoryUtilization 指标的数量等于该终端节点中的容器数。单位:百分比 EndpointName, VariantName, ContainerName aws/sagemaker/Endpoints

上表中的所有指标特定于具有直接调用的多容器终端节点。除了这些特殊的每容器指标之外,变体级别还有一些指标,这些指标具有 维度[EndpointName, VariantName],该表中的所有指标都预期使用 ContainerLatency

自动扩展多容器终端节点

如果要使用 InvocationsPerInstance 指标为多容器终端节点配置自动扩展,我们建议每个容器中的模型在每个推理请求上都显示相似的 CPU 利用率和延迟。建议这样做是因为,如果流向多容器终端节点的流量从高 CPU 使用率模型转移到低 CPU 使用率模型,但整体调用量保持不变,则终端节点不会向外扩展,并且可能没有足够的实例来处理对高 CPU 使用率模型的所有请求。有关自动扩展终端节点的信息,请参阅自动扩展 Amazon SageMaker 模型

对多容器终端节点进行故障排除

以下部分可帮助您排查多容器终端节点的错误。

Ping 运行状况检查错误

对于多个容器,终端节点内存和 CPU 在终端节点创建期间压力更大。具体而言, MemoryUtilizationCPUUtilization 指标高于单容器终端节点,因为利用率压力与容器数成正比。因此,我们建议您选择具有足够内存和 CPU 的实例类型,以确保实例上有足够的内存来加载所有模型 (相同的指南适用于部署推理管道)。否则,您的终端节点创建可能会失败,并出现错误,例如 XXX did not pass the ping health check

缺少 accept-bind-to-port=true Docker 标签

多容器终端节点中的容器侦听在 SAGEMAKER_BIND_TO_PORT 环境变量中指定的端口,而不是端口 8080。当容器在多容器终端节点中运行时, SageMaker 会自动向容器提供此环境变量。如果此环境变量不存在,则容器应默认为使用端口 8080。要指示您的容器使用此要求进行编译,请使用以下命令将标签添加到您的 Dockerfile:

LABEL com.amazonaws.sagemaker.capabilities.accept-bind-to-port=true

否则,您将看到一条错误消息,例如 Your Ecr Image XXX does not contain required com.amazonaws.sagemaker.capabilities.accept-bind-to-port=true Docker label(s).

如果您的容器需要侦听第二个端口,请在 SAGEMAKER_SAFE_PORT_RANGE 环境变量指定的范围中选择端口。以 格式将值指定为包含范围 XXXX-YYYY,其中 XXXX 和 YYYY 是多位数整数。当您在多容器终端节点中运行容器时, 会自动SageMaker提供此值。