502错误的网关错误与上游过早关闭的连接?

时间:2018-11-08 17:33:14

标签: python nginx flask gunicorn amazon-sagemaker

我正在尝试使用AWS sagemaker,Flask,Nginx和Gunicorn在docker容器上运行机器学习推理服务器。我曾尝试在AWS sagemaker上使用c5.xlarge实例和c5.4xlarge实例运行,并且在c5.xlarge实例上运行时总是会中断。

当请求通过加载大约300 mb的ML模型来检查应用程序的运行状况时。调用推断端点时,它将检查模型是否已在工作器中启动并且正在运行,如果尚未启动ML模型,然后使用数据运行预测。我通常用<= 5MB数据来调用模型。

Nginx配置:

worker_processes auto;
daemon off; # Prevent forking


pid /tmp/nginx.pid;
error_log /var/log/nginx/error.log;

events {
  # defaults
}

http {
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  access_log /var/log/nginx/access.log combined;

  upstream gunicorn {
    server unix:/tmp/gunicorn.sock;
  }

  server {
    listen 8080 deferred;
    client_max_body_size 5m;

    keepalive_timeout 10000;

    location ~ ^/(ping|invocations) {
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://gunicorn;
    }

    location / {
      return 404 "{}";
    }
  }
}

独角兽:

subprocess.Popen(['gunicorn',
                             '--timeout', str(model_server_timeout),
                             '-k', 'gevent',
                             '-b', 'unix:/tmp/gunicorn.sock',
                             '-w', str(model_server_workers),
                             '--error-logfile', '-',
                             '--access-logfile', '-',
                             '--preload',
                             'wsgi:app'])

我已经查看了超时(对于gunicorn已经设置为60秒),尝试预加载应用程序,并且在读取错误响应时,向stdout抛出的日志只有上游过早关闭的连接。

1 个答案:

答案 0 :(得分:0)

您的容器通常多长时间响应一次请求?如果您在托管端点中使用容器,则该容器必须在60秒内响应请求。将Gunicorn超时设置为略低于60秒可能会有所帮助。 https://docs.aws.amazon.com/sagemaker/latest/dg/API_runtime_InvokeEndpoint.html

响应时间似乎取决于实例类型。如果是这种情况,并且您确实想使用例如c5.xlarge实例类型,则可以尝试创建批处理转换作业,而不是使用实时推断端点。批量转换作业确实允许每个请求> 60秒的响应时间。 https://docs.aws.amazon.com/sagemaker/latest/dg/API_CreateTransformJob.html

希望这会有所帮助!

-汉