问题描述:
invoke_endpoint 调用 SageMaker 实时推理(real-time inference)端点时,遇到了请求无限循环的问题,直到通过 Ctrl+C 中断。通过排查发现,问题出在实时推理端点的默认超时时间为 60 秒,而调用的任务需要大约 2 分钟才完成。由于超时机制和某些容器配置的交互行为,可能导致重复请求的现象。最终,切换到异步推理(async inference)解决了这个问题。
模型部署在 AWS SageMaker 上的实时推理端点中。调用方式:
aws sagemaker-runtime invoke-endpoint \
--endpoint-name my-endpoint \
--body '{"input":"some data"}' \
--content-type application/json \
output.json \
--region us-east-1
当请求运行时间超过 60 秒时,终端可能会卡住,CloudWatch 日志中会重复打印如下的日志:
INFO: 169.254.x.x:xxxx - "POST /invocations HTTP/1.1" 200 OK
INFO: 169.254.x.x:xxxx - "GET /ping HTTP/1.1" 200 OK
该现象表明,推理请求被重新发送了多次,直到强制停止请求( Ctrl+C)。
解决办法一:调整超时时间
如果必须使用实时推理端点,可以调整超时时间以适应长时间的推理任务。更新 EndpointConfig 时,设置自定义的超时时间,例如 120 秒:
import boto3
sagemaker = boto3.client('sagemaker')
response = sagemaker.update_endpoint_config(
EndpointConfigName='my-endpoint-config',
ProductionVariants=[
{
'VariantName': 'variant-1',
'ModelName': 'my-model',
'InstanceType': 'ml.m5.large',
'InitialInstanceCount': 1,
'InitialVariantWeight': 1,
'ContainerStartupHealthCheckTimeoutInSeconds': 120
}
]
)
当然你的调用 SDK 或 CLI 命令也要支持较长的超时时间。
解决办法二:切换到异步推理
异步推理(Async Inference)适合长时间任务,配置异步推理端点:
aws sagemaker create-endpoint-config \
--endpoint-config-name my-async-config \
--production-variants '[
{
"VariantName": "AllTraffic",
"ModelName": "my-model",
"InstanceType": "ml.m5.large",
"InitialInstanceCount": 1
}
]' \
--async-inference-config '{"OutputConfig":{"S3OutputPath":"s3://your-bucket/output/"}}'
调用异步推理端点:
aws sagemaker-runtime invoke-endpoint-async \
--endpoint-name my-async-endpoint \
--body '{"input":"some data"}' \
--content-type application/json \
--region us-east-1
将所有的输入数据存储在 S3 中,批量运行推理任务,然后通过 S3 获取生成的摘要结果。这样,不必等待响应,在 S3OutputPath 中查看结果文件即可。