使用进行直接调用的多容器端点 - Amazon SageMaker
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用进行直接调用的多容器端点

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

通过直接调用来调用多容器端点

要通过直接调用来调用多容器端点,请像调用任何其他端点一样调用 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 角色的更多信息,请参阅《Amazon Identity and Access Management 用户指南》中的 IAM 角色。有关基于身份的策略的信息,请参阅基于身份的策略和基于资源的策略

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

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

{ "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*"] } } } ] }

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

{ "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 条件键的信息,请参阅《Amazon Identity and Access Management 用户指南》 SageMaker中的条件键

进行直接调用的多容器端点的指标

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

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

下表列出进行直接调用的多容器端点中每个容器的指标。所有指标都使用 [EndpointName, VariantName, ContainerName] 维度,它过滤特定端点、特定变体以及与特定容器对应的指标。这些指标与推理管线的指标名称相同,但处于单个容器级别 [EndpointName, VariantName, ContainerName]。

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