东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[课堂笔记] flask服务器的启动与使用Gunicorn容器

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14437
QQ
跳转到指定楼层
楼主
发表于 2020-5-19 11:04:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
flask服务器的启动与使用Gunicorn容器






app.run 的参数
app.run(host="0.0.0.0", port=5001, debug=False, processes=2, threaded=False)


注意:绝对不能在生产环境中使用调试器


host设定为0.0.0.0,则可以让服务器被公开访问


port:指定端口号,默认为5000


debug:是否开启 debug 模型,如果你打开 调试模式,那么服务器会在修改应用代码之后自动重启,并且当应用出错时还会提供一个 有用的调试器。


processes:进程数量,默认是1


threaded:bool类型,是否开启多线程。注:当开启多个进程时,不支持同时开启多线程。


使用 route() 装饰器来告诉 Flask 触发函数的 URL;


函数名称被用于生成相关联的 URL。函数最后返回需要在用户浏览器中显示的信息




当我们执行上面的app.run()时,使用的flask自带的服务器,完成了 web 服务的启动。
在生产环境中,flask 自带的服务器,无法满足性能要求,我们这里采用Gunicorn做wsgi容器,来部署flask程序




Gunicorn(绿色独角兽)是一个Python WSGI UNIX HTTP服务器。
从 Ruby 的独角兽(Unicorn )项目移植。该Gunicorn服务器作为wsgi app的容器,能够与各种 Web 框架兼容,实现非常简单,
轻量级的资源消耗。Gunicorn 直接用命令启动,不需要编写配置文件,相对 uWSGI 要容易很多




pip3 install gunicorn


如果想让Gunicorn支持异步workers的话需要安装以下三个包:
pip3 install gevent
pip3 install eventlet
pip3 install greenlet




指定进程和端口号,启动服务器:


gunicorn -w 4 -b 127.0.0.1:5001 运行文件名称:Flask程序实例名


以上述 hello.py 文件为例:


gunicorn -w 4 -b 127.0.0.1:5001 hello:app


参数:-w: 表示进程(worker)。-b:表示绑定 ip 地址和端口号(bind)


查看 gunicorn 的具体参数,可执行gunicorn -h 通常将配置参数写入到配置文件中,如gunicorn_conf.py


重要参数:


bind: 监听地址和端口


workers: worker 进程的数量。建议值:2~4 x (NUM_CORES),缺省值是 1.


worker_class:worker 进程的工作方式。有:sync (缺省值),eventlet, gevent, gthread, tornado


threads:工作进程中线程的数量。建议值:2~4 x (SUM_CORES),缺省值是 1.


reload: 当代码有修改时,自动重启 workers。适用于开发环境,默认为False


daemon:应用是否以daemon方式运行,是否以守护进程启动,默认False


accesslog:访问日志文件路径


errorlog:错误日志路径


loglevel:日志级别。debug, info, warning, error, critical.



if __name__ == "__main__":
    load_known_face_encodings_names()
    app.run(debug=False)    # 使用gunicorn了
    # app.run(host='0.0.0.0', port=5001, debug=False)
    # 注意:绝对不能在生产环境中使用调试器  processes:线程数量,默认是1
    # threaded:bool类型,是否开启多线程。注:当开启多个进程时,不支持同时开启多线程。
    # app.run(host="0.0.0.0", port=5001, debug=False, processes=1, threaded=False)
    # app.run(host='172.20.7.25', port=5001, debug=False)

# gunicorn -w 4 -b 127.0.0.1:5001 web_server_facenet_keras_small:app
# gunicorn -c gunicorn_conf_small.py web_server_facenet_keras_small:app


gunicorn --config gunicorn_conf_small.py web_server_facenet_keras_small:app


  1. # -*- coding: utf-8 -*-
  2. __author__ = u'东方耀 微信:dfy_88888'
  3. __date__ = '2020/5/19 上午11:15'
  4. __product__ = 'PyCharm'
  5. __filename__ = 'gunicorn_conf_small'

  6. bind = '0.0.0.0:5001'  # 监听地址和端口号
  7. backlog = 2048
  8. workers = 2  # 进程数
  9. worker_class = 'sync'  # 工作模式,可选sync, gevent, eventlet, gthread, tornado等
  10. threads = 1  # 指定每个进程的线程数,默认为1
  11. worker_connections = 2000  # 最大客户并发量
  12. timeout = 200  # 超时时间,默认30s
  13. keepalive = 2   # 默认值
  14. reload = True  # 开发模式,代码更新时自动重启
  15. daemon = False  # 守护Gunicorn进程,默认False

  16. accesslog = './logs/access.log'  # 访问日志文件
  17. errorlog = './logs/error.log'
  18. loglevel = 'debug'  # 日志输出等级,debug, info, warning, error, critical
复制代码





问题1:
使用 Flask 启动服务,加载两次模型,占用两份显存
出现该问题的原因是使用Flask启动服务的时候,开启了 debug 模式,即debug=True。dubug模式会开启一个tensorflow的线程,此时查看 GPU 显存占用情况,会发现有两个进程都占用相同份的显存。

关闭 debug 模型(debug=False)即可
app.run(debug=False)    # 使用gunicorn了


问题2:
无法启动服务,[CRITICAL] WORKER TIMEOUT
当使用 gunicorn 启动 flask 服务时,查看服务器状态和日志文件发现一直在尝试启动,但是一直没有成功。

CRITICAL WORKER TIMEOUT

这是 gunicorn 配置参数timeout导致的。默认值为30s,即超过 30s,就会 kill 掉进程,然后重新启动restart。

当启动服务进行初始化的时间超过 timeout 值时,就会一直启动,kill, restart。

可根据具体情况,适当增加该值。  比如我调整为200s







2个进程.png (40.93 KB, 下载次数: 103)

2个进程.png

4个进程.png (64.69 KB, 下载次数: 101)

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 15:47 , Processed in 0.238147 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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