踩坑踩坑之Flask+ uWSGI + Tensorflow的Web服务部署
一、简介
作为算法开发人员,在算法模块完成后,拟部署Web服务以对外提供服务,从而将算法模型落地应用。本文针对首次基于Flask + uWSGI + Tensorflow + Nginx部署Web服务时可能会遇到的问题进行简要分析,并提供解决方案,以供大家参考。
二、环境介绍
OS:CentOS 7.0, 内存:16G,系统盘:40G,无挂载盘。
备注:本文作者因环境资源的限制,踩过环境的坑,故此对系统配置也给出。
三、报错异常与解决方案
1) cannot allocate memory for thread-local data: ABORT
在基于TensorFlow的服务启动过程中,在输出CPU频率后报出该错误,第一反应则为内存不够,查看了下内存,虽然只剩6G左右,但是考虑到还有交换分区的空间,应该不是问题,骤然查看硬盘空间,发现几乎快占用完了。
解决方案:若硬盘资源充分,可增加挂载盘;若资源紧张,可删减系统盘空间,以便给交换空间扩容,避免存在内存分配不足的风险。
2) what(): Resource temporarily unavailable
由于在服务配置uWSGI的参数中受buffer-size与limit-as的影响,导致分配的空间不够,导致服务不可用。
解决方案:合理调整一下buffer-size与limit-as的值,即提高上述参数的大小,以满足服务的需求。
备注:部署服务时中间链路较多,殊不知某个地方的参数配置则可能给自己挖了个坑。
3) terminate called after throwing an instance of ‘std: bad_alloc’
同上所示,受buffer-size与limit-as的影响,以致服务不可用。
解决方案:进一步调整一下buffer-size与limit-as的值,即提高上述参数的大小,以满足服务的需求。
4) 基于Tensorflow加载图模型后,调用session.run()后,Web服务卡住
由于考虑到服务部署采用全局的模型在后续的服务中调用,故对该全局模型进行加载,在普通Flask服务中测试通过,但是部署在uWSGI + Nginx时一直阻塞。主要是原因是uWSGI采用多线程调用Flask服务,即对于上述全局的模型,若是初始化后,会被每一个线程复制一次,即每个线程会有一个自己独立的全局图模型,但在后续调用服务时,会导致session的阻塞。
解决方案:使上述所有的线程共享同一个全局的图模型,即不在多个线程中进行复制,可基于Flask调用钩子函数before_first_request加载全局的图模型,从而解决上述问题。
备注:受经验影响,加载全局的模型后理所当然认为多线程共享同一个,但是多线程复制后,实则有一些影响,在此不再详细阐述。由于该问题在网络上检索时出现较少,困扰了本文作者大约半天时间,希望能给大家提供参考。
5) 服务调用中module未能正确识别,即uWSGI中Python解析器版本不一致
在采用pip install uwsgi后,潜意识中任务已经安装完毕uWSGI,但是在实际运行时,uWSGI识别的Python版本可能存在不一致,导致在开发环境上验证过的服务未能正确部署。
解决方案:首先基于uwsgi –python-version查看当前uWSGI识别的Python解析器,若出现与预期版本(主要为Python2与Python3)不一致时,可进行重装。若是多次重装无效,则直接采用uwsgi的源码进行安装。
四、总结
本文作者对首次采用uWSGI + Flask + Tensorflow部署web服务进行了实践,针对遇到的问题进行了简要分析,并提供了解决方案以供大家参考。至于出错部分的深入原理,例如session.run()卡住等问题,在后续将会逐步展开,敬请关注。
作者:志青云集 刘勇 lyssym@sina.com
出处:https://www.cnblogs.com/lyssym/p/11643256.html
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【志青云集】。
欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
踩坑踩坑之Flask+ uWSGI + Tensorflow的Web服务部署的更多相关文章
- Nginx+uwsgi+Django 的web应用环境部署-完整记录
Python作为当前最火爆最热门,也是最主要的Web开发语言之一,在其二十多年的历史中出现了数十种Web框架,比如Django.Tornado.Flask.Twisted.Bottle和Web.py等 ...
- python Linux flask uwsgi nginx 在centos7.3部署
0.直接上uwsgi和nginx安装命令 linux 安装uwsgi yum groupinstall "Development tools" yum install zlib-d ...
- 那些最全面的Windows10安装pytorch踩过的坑以及如何应用
那些最全面的Windows10安装pytorch踩过的坑以及如何应用 一.pytorch简介 2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch.它是一个基 ...
- 项目中踩过的坑之-sessionStorage
总想写点什么,却不知道从何写起,那就从项目中踩过的坑开始吧,希望能给可能碰到相同问题的小伙伴一点帮助. 项目情景: 有一个id,要求通过当前网页打开一个新页面(不是当前页面),并把id传给打开的新页面 ...
- web开发实战--弹出式富文本编辑器的实现思路和踩过的坑
前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...
- "开发路上踩过的坑要一个个填起来————持续更新······(7月30日)"
欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...
- 【转载】Fragment 全解析(1):那些年踩过的坑
http://www.jianshu.com/p/d9143a92ad94 Fragment系列文章:1.Fragment全解析系列(一):那些年踩过的坑2.Fragment全解析系列(二):正确的使 ...
- Redis Cluster踩过的坑
Redis Cluster踩过的坑请参考如下链接:http://www.iteye.com/blogs/subjects/Redis_Cluster_Devops
- 第八篇:web之前端踩的一些坑
前端踩的一些坑 前端踩的一些坑 本节内容 事件代理 清除标签的所有事件 bootstrap的模态框自定义方法 ajax在django里面实现post提交 ajax提交数据嵌套 1.事件代理 之前写 ...
随机推荐
- Atcoder/Topcoder 口胡记录
Atcoder/Topcoder 理论 AC Atcoder的❌游戏示范 兴致勃勃地打开一场 AGC 看 A 题,先 WA 一发,然后花了一年时间 Fix. 看 B 题,啥玩意?这能求? 睡觉觉. e ...
- CF994B Knights of a Polygonal Table 第一道 贪心 set/multiset的用法
Knights of a Polygonal Table time limit per test 1 second memory limit per test 256 megabytes input ...
- 8 分钟入门 K8s | 详解容器基本概念
作者| 阿里巴巴高级开发工程师 傅伟 一.容器与镜像 什么是容器? 在介绍容器的具体概念之前,先简单回顾一下操作系统是如何管理进程的. 首先,当我们登录到操作系统之后,可以通过 ps 等操作看到各式各 ...
- Maven依赖配置和依赖范围
Maven依赖配置 一个dependency的声明可以包含以下元素: <dependencies> <dependency> <groupId>org.apache ...
- Elasticsearch(7) --- 复合查询
Elasticsearch(7) ---复合查询 复合查询有:bool query(布尔查询).boosting query(提高查询).constant_score(固定分数查询).dis_max( ...
- AutoCompleteTextView自动完成文本框
AutoCompleteTextView是从EditText派生出来的,比普通编辑框多了一个功能,当用户输入一定字符后,自动完成文本框会显示一个下拉单,供用户选择,当选中一个后,被选中的内容会显示在文 ...
- Python中使用高德API实现经纬度转地名
场景 高德API提供给开发者们一些常用功能的接口,其中有一种叫地理/逆地理编码能实现 地名查询经纬度和经纬度查地名. 实现 高德API平台: https://lbs.amap.com/ 注册并登陆 找 ...
- SqlServer2014怎样还原数据库
场景 在SqlServer2014企业版上怎样进行数据库的还原,首先你得有一个其他数据 的备份文件. 实现 打开cmd,输入sql,打开SqlServer 2014 Management Studio ...
- jquery多级树形下拉菜单
效果图: 使用方法 (1)引入 jQuery 包,下载地址 (2)引入 zTree 包,下载地址 (3)引入 tree-select.js (4)$("#id").treeSele ...
- Salesforce学习之路-admin篇
Salesforce是一款非常强大的CRM(Customer Relationship Management)系统,国外企业使用十分频繁,而国内目前仅有几家在使用(当然,国内外企使用的依旧较多),因此 ...