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

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

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

允许列表

要对基于 GPU 的实例使用多容器直接调用,您必须联系客户支持并将您的账户列入允许列表。要创建支持案例,请访问 AWS Support 中心

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

要通过直接调用来调用多容器端点,请像调用任何其他端点一样调用 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 角色的更多信息,请参阅《AWS 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 条件键的信息,请参阅《AWS Identity and Access Management 用户指南》中的 SageMaker 条件键

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

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

对于进行直接调用的多容器端点,每个容器的指标位于 CloudWatch 中,并分类到两个命名空间中:AWS/SageMakeraws/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%。与 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 会自动提供此值。