|
使用Flask+Gunicorn+Nginx在Ubuntu上打造高并发的深度学习API接口
前提是先安装好了:
pip3 install flask
pip3 install gunicorn
sudo apt-get install nginx
意外之喜:GPU显存占用大幅度减少!
详情参考:
http://www.ai111.vip/thread-1033-1-1.html flask服务器的启动与使用Gunicorn容器
http://www.ai111.vip/thread-1034-1-1.html 怎样在Ubuntu 18.04上安装Nginx?
单纯使用flask的简单服务器:只能开发调试使用 生产环境是不够的 需要WSGI server 且GPU占用比较大 我的模型占6837M
Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
我们这里采用Gunicorn做wsgi容器,来部署flask程序
为了方便管理多个flask app应用 创建一个wsgi.py文件(叫WSGI的入口点) 引入即可
gunicorn --config gunicorn_conf_small.py wsgi:app
发现GPU的占用还是比较大的:
如果开启2个子进程(线程都是1) :6831 + 1201M
如果开启4个子进程(线程都是1) :6831+1197+1201+1199 会提示 CUDA_ERROR_OUT_OF_MEMORY
下一步将nginx融入进来 安装教程看前面的链接
继续走步骤:
让我们创建systemd服务单元文件。 创建系统单元文件将使Ubuntu的初始化系统能够在服务器启动时自动启动Gunicorn并为Flask应用程序提供服务
在目录/etc/systemd/system下创建一个.service的单元文件
sudo vim /etc/systemd/system/keras_small_face_embed.service
[Unit]
Description=Gunicorn的实例描述信息
After=network.target 这是表示在网络可达后启动服务
[Service]
User=dfy888 换成你自己的系统用户名
Group=www-data
WorkingDirectory=/home/dfy888/py3_dongfangyao_works 换成你自己的(当前的项目目录 就是wsgi.py文件的目录)
Environment="PATH=/home/dfy888/miniconda3/envs/py3_dongfangyao/bin" (项目的环境目录 会加到环境变量中去)
ExecStart=/home/dfy888/miniconda3/envs/py3_dongfangyao/bin/gunicorn --config gunicorn_conf_small.py -m 007 wsgi:app
(项目的环境目录的gunicorn命令)
[Install]
WantedBy=multi-user.target
解释一下(Create and bind to a Unix socket file):
gunicorn_conf_small.py配置文件中的bind = 'unix:small.sock' 改成这个 之前是'0.0.0.0:5000'
后面的 -m 007 是给small.sock文件的修改权限
我们将umask值设置为007,以便创建socket文件以授予所有者和组访问权限,同时限制其他访问权限
到此,我们的系统服务文件已完成。
sudo systemctl start keras_small_face_embed (启动服务 gunicorn gpu显存占用明显减少(猜是因为系统服务的原因) 配置了4个子进程 199+199+199+199M)
sudo systemctl enable keras_small_face_embed(设置开机自启)
sudo systemctl status keras_small_face_embed
sudo systemctl stop keras_small_face_embed
使用systemctl命令,要记住start,stop,restart,status,enable,disable,is-enabled。就可以很好的使用!
$ sudo systemctl enable keras_small_face_embed
Created symlink /etc/systemd/system/multi-user.target.wants/keras_small_face_embed.service → /etc/systemd/system/keras_small_face_embed.service.
查看服务状态:
$ sudo systemctl status keras_small_face_embed
● keras_small_face_embed.service - Gunicorn instance to serve dfy_keras_small_face embedding
Loaded: loaded (/etc/systemd/system/keras_small_face_embed.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2020-05-20 10:00:59 CST; 2min 11s ago
Main PID: 12784 (gunicorn)
是这个active (running)就一切OK! 否则需要解决问题后 才能继续下面的操作哦!
开始配置Nginx的请求
我们的Gunicorn应用服务器现在应该已启动并正在运行,正在等待项目目录中套接字文件上(small.sock)的请求。
现在,通过对Nginx的配置文件进行一些小的添加,将Nginx配置为将Web请求传递给该套接字
sudo vim /etc/nginx/sites-available/nginx_small_face_embed
加入下面的配置(pass给sock文件):
server {
listen 5000;
server_name 0.0.0.0;
location / {
include proxy_params;
proxy_pass http://unix:/home/dfy888/py3_dongfangyao_works/small.sock;
}
}
要启用刚刚创建的Nginx服务器块配置,请将文件链接到启用站点的目录
sudo ln -s /etc/nginx/sites-available/nginx_small_face_embed /etc/nginx/sites-enabled
$ sudo nginx -t 测试语法错误
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
如果没有任何错误,请重新启动Nginx进程以读取新配置(使上面的配置生效)
sudo systemctl restart nginx
sudo systemctl stop nginx 停止nginx服务的命令
接下来 可以测试API接口了 一切ok! 如果你还不ok 看看是否设置了防火墙
例子:
sudo ufw allow 5001 之前的防火墙配置
sudo ufw delete allow 5000
提示:无法删除不存在的规则
sudo ufw allow 'Nginx Full'
规则已更新
在接口对外提供访问的时候 如果出错,需要查看一些日志:
sudo less /var/log/nginx/error.log
sudo less /var/log/nginx/access.log
sudo journalctl -u nginx
checks your Flask app’s Gunicorn logs:
sudo journalctl -u keras_small_face_embed
|
|