我正在尝试使用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抛出的日志只有上游过早关闭的连接。
答案 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
希望这会有所帮助!
-汉