当我部署 Amazon SageMaker 端点或执行 BatchTransform 任务时,连接超时并出现如下错误:
"upstream timed out (110: Connection timed out) while reading response header from upstream, client: 169.xxx.xxx.xxx, server: , request: "POST /invocations HTTP/1.1", upstream: "http://unix:/tmp/gunicorn.sock/invocations" , host: "169.xxx.xxx.xxx:8080"
简短描述
此错误表示 NGINX 和 Web 服务器之间的连接存在问题。无论您使用自己的容器还是预构建的容器,这两个组件都会在模型容器中运行。这些组件与 SageMaker 托管或批量转换没有直接关系。但是,当 NGINX 和 Web 服务器之间的连接超时时,SageMaker 无法从 /invocations 端点获得推理。
要解决此问题,请执行以下操作:
- 减少算法容器的延迟或增加容器的超时限制。
- 增加 NGINX.conf 超时设置。
解决方法
减少算法容器的延迟或增加超时限制
- **如果您正在运行托管服务的推理代码:**您的模型容器必须在 60 秒内响应请求。模型本身可能具有最长 60 秒的处理时间。如果您知道自己的模型需要 50-60 秒的处理时间,请将开发工具包套接字超时设置为 70 秒。有关更多信息,请参阅容器应如何响应推理请求。
- **如果您正在运行批量转换的推理代码:**使用 ModelClientConfig 配置 InvocationsTimeoutInSeconds 和 InvocationsMaxRetries 参数。
Amazon SageMaker 会在容器上设置已在 CreateModel 和 CreateTransformJob 中指定的环境变量。调整以下 API 参数以减少算法容器的延迟。例如,如果输入是可拆分的,则在创建转换作业时通过设置 MaxPayLoadInMB 字段来限制每个请求的有效负载大小。
- **MaxPayLoadInMB:**发送到容器的最大有效负载大小。如果容器可以快速处理批量转换,请增加此属性。如果批量转换花费的时间超出预期,请减少此属性。
- **MaxConcurrentTransforms:**默认值为 1。如果您有多个 NGINX 工作线程,请增加此设置。
- **BatchStrategy:**要在一个小批量中容纳尽可能多的记录(最大限制为 MaxPayloadInMB),请将 BatchStrategy 设置为 MultiRecord,并将 SplitType 设置为“行”。
如果您使用的是用于实施 Gunicorn 的 SageMaker 框架容器,请将这些属性作为环境变量传递给 Docker 容器:
- **SAGEMAKER _MODEL_SERVER_TIMEOUT:**Gunicorn 服务器的超时。要在关闭连接之前留出更多时间来处理请求,请增加此值。
- **SAGEMAKER _MODEL_SERVER_WORKERS:**每个 CPU 的工作线程数。
增加 NGINX.conf 超时设置
如果您使用的是 Amazon SageMaker 预构建的 Docker 容器之一,则无法修改 NGINX.conf 文件。只有在使用自己的 Docker 容器时,您才能修改 NGINX.conf。
NGINX 超时可能导致故障,因为 Amazon SageMaker 会在超时后关闭连接。如果您的容器尝试读取或写入关闭的连接,则请求将失败。修改以下一个或多个属性以适应网络开销。
- **proxy_read_timeout:**这是 NGINX 在 request.send 调用之后等待模型响应的时间。增加此值以让 Amazon SageMaker 在关闭连接之前有更多时间来处理请求。
- **worker_processes:**这是入站连接的线程数。在大多数情况下,该值应等于或大于 CPU 内核数量。例如,对于双核实例类型(如 ml.m5.large),请将此属性至少设置为 2。
- **worker_connections:**这是每个工作进程同时连接的最大数量。最佳实践是将此值的起始值设置为 1024。
有关配置设置的更多信息,请参阅 NGINX 文档中的 Module ngx_http_proxy_module。