踩坑踩坑之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.事件代理 之前写 ...
随机推荐
- 牛客多校第十场 A Rikka with Lowbit 线段树
链接:https://www.nowcoder.com/acm/contest/148/A来源:牛客网 题目描述 Today, Rikka is going to learn how to use B ...
- SQL数据同步到ELK(二)- Elastic Search 安装
开篇废话 没错,前面扯了一堆SQL SERVER,其实我连Elastic Search根本没动手玩过(是不是与时代有点脱节了?),那今天我就准备尝试安装一个ELK的简单集群出来(这个集群是使用我的小米 ...
- Erlang模块gen_tcp翻译
概述 TCP/IP套接字接口 描述 gen_tcp模块提供了使用TCP / IP协议与套接字进行通信的功能. 以下代码片段提供了一个客户端连接到端口5678的服务器的简单示例,传输一个二进制文件并关闭 ...
- 记一次tomcat内存大涨到溢出的经历
前一段时间提交了一个产品版本给测试人员测试,测试结果简直出人意料! 测试一段时间后页面就卡死了,当时根据这个现象下意识的怀疑是卡到数据库这一层,然后查看数据库连接相关的参数,如意料之中的相似,连接数太 ...
- mariadb+haproxy实现负载均衡(一)
根据实际情况,数据生产无论是量还是使用地方都在稳步增加,单一服务器的稳定性也越来越受到关注,所以想提前做好技术准备. 因为之前就安装好了数据库,现在只讨论haproxy的安装及相关使用. haprox ...
- python科学计算与可视化视频教程
目录: 下载链接:https://www.yinxiangit.com/616.html 第一单元TVTK入门-1.mp4第一单元TVTK入门-2.mp4第一单元TVTK入门-3.mp4 第一单元TV ...
- springCloud相关学习资料
SpringCloud相关学习资料 SpringCloud资料参考: 1. 史上最简单的 SpringCloud 教程 | 终章 2. Spring Cloud基础教程 SpringCloud相关: ...
- Log4Net 日志记录的实现
一.前言 在上一篇文章[(转载)非常完善的Log4net配置详细说明]介绍了Log4Net的配置说明,如果不知道的可以去看看,这里我们就介绍一下日志记录的实现,说得都比较基础,所以大神请绕过. 二.L ...
- 并发编程之线程创建到销毁、常用API
在前面一篇介绍了线程的生命周期[并发编程之多线程概念],在本篇将正式介绍如何创建.中断线程,以及线程是如何销毁的.最后,我们会讲解一些常见的线程API. 线程创建 Java 5 以前,实现线程有两种方 ...
- Winform中跨窗体设置Zedgraph的属性并刷新曲线图
场景 在使用ZedGraph时,经常有图形选项功能,设置曲线图相关属性后, 点击保存会设置另一个窗体的属性并刷新图. 效果 实现 在设置图形的选项的类中,声明委托和事件 //委托的定义 public ...