东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2485|回复: 0
打印 上一主题 下一主题

[课堂笔记] 使用Flask+Gunicorn+Nginx在Ubuntu上打造高并发的深度学习API接口

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14437
QQ
跳转到指定楼层
楼主
发表于 2020-5-20 09:00:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
使用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




















4个进程_gunicorn.png (69.83 KB, 下载次数: 107)

4个进程_gunicorn.png

8个进程_gunicorn.png (92.36 KB, 下载次数: 105)

8个进程_gunicorn.png
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-5-3 17:11 , Processed in 0.198277 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表