502 ошибка шлюза при преждевременном закрытии соединения в восходящем направлении? - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь запустить сервер логических выводов машинного обучения в докер-контейнере с AWS sagemaker, Flask, Nginx и Gunicorn. Я попытался запустить с экземпляром c5.xlarge и c5.4xlarge на AWS sagemaker, и он всегда прерывается при запуске на экземпляре c5.xlarge.

Когда приходит запрос проверить работоспособность приложения, загрузив модель ML, которая составляет около 300 МБ. Когда вызывается конечная точка вывода, она проверяет, работает ли модель на рабочем месте, а если нет, запускает модель ML, а затем запускает прогноз с данными. Я обычно называю модель с данными <= 5 МБ. </p>

Конфигурация 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 "{}";
    }
  }
}

gunicorn:

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'])

Я посмотрел на тайм-аут (он уже установлен на 60 секунд для gunicorn), попытался предварительно загрузить приложение, и журналы, выброшенные на стандартный вывод, имеют только восходящее преждевременно закрытое соединение при чтении ответа об ошибке.

1 Ответ

0 голосов
/ 22 ноября 2018

Как долго ваш контейнер обычно отвечает на запросы?Если вы используете контейнер в размещенной конечной точке, контейнер должен отвечать на запросы в течение 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

Надеюсь, это поможет!

-Хан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...