首页 > 解决方案 > Sagemaker 推理管道 - 自定义容器无法通过 ping 检查,但未发送 ping 请求?

问题描述

我有一个自定义容器,当它自己部署到端点时可以正常工作。我也在使用 SageMaker 模型容器。我试图在推理管道中将这两者堆叠在一起。两者都托管在 Elastic Container Registry 上。

当我将自定义容器部署为常规端点时,SageMaker 开始发出 ping 请求,这些请求在日志中如下所示

10.32.0.2 - - [18/Aug/2021:09:05:26 +0000] "GET /ping HTTP/1.1" 200 1 "-" "AHC/2.0"

但是,当我将其部署为推理管道内的容器时,使用

response = sm_client.create_model(
    ModelName=pipeline_name,
    Containers=[
        {
            "Image": 'ACCOUNTID.dkr.ecr.us-west-2.amazonaws.com/model-v1-0-0-0:latest',
            "ModelDataUrl": "s3://bucket/models/artifacts/custom-image-training-2021-08-18-07-55-00-997/output/model.tar.gz"
        },
        {
            "Image": '174872318107.dkr.ecr.us-west-2.amazonaws.com/object2vec:1',
            "ModelDataUrl": "s3://bucket/models/income/output/o2v-08-13-13-03-11-train/output/model.tar.gz"
        }
    ],
    ExecutionRoleArn=role,
    InferenceExecutionConfig={
        'Mode': 'Serial'
    },
)

print("{}\n".format(response))

自定义容器未通过 ping 检查。

在日志中,我可以看到 gunicorn 服务器正在启动,但是没有记录任何 GET 请求,最终它会因健康检查失败而超时。为什么这(不)会发生?看起来容器已准备好响应 ping 请求,但没有发出任何请求。

对于预构建的 SageMaker 模型映像,日志看起来完全不同 - 它以“使用参数调用的 Docker 入口点:服务”开头,并且没有任何持续的运行状况 ping。所以我想知道预建图像的执行方式是否与自定义图像不同,以及是否需要在 create_model 请求中指定我正在使用自定义模型。我尝试了一些不同的参数,但没有运气。但是我很困惑它如何要求容器通过健康 ping 检查,然后不发出 GET 请求?

就像我说的那样,我可以将它们部署到自己的端点。当部署为单个端点时,日志看起来相同,除了作为单个端点定期发生的 GET /ping 请求,但当容器包含在推理管道中时不会发生。

endpoint_config 和端点的其余代码

response = sm_client.create_endpoint_config(
EndpointConfigName=pipeline_name,
ProductionVariants=[
    {
        "VariantName": "DefaultVariant",
        "ModelName": pipeline_name,
        "InitialInstanceCount": 1,
        "InstanceType": "ml.m4.xlarge",
    },
],
)
response = sm_client.create_endpoint(
    EndpointName=pipeline_name,
    EndpointConfigName=pipeline_name
    )
   print("{}\n".format(response))

标签: amazon-web-servicesdockerflaskgunicornamazon-sagemaker

解决方案


推荐阅读