一、简介

作为算法开发人员,在算法模块完成后,拟部署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服务部署的更多相关文章

  1. Nginx+uwsgi+Django 的web应用环境部署-完整记录

    Python作为当前最火爆最热门,也是最主要的Web开发语言之一,在其二十多年的历史中出现了数十种Web框架,比如Django.Tornado.Flask.Twisted.Bottle和Web.py等 ...

  2. python Linux flask uwsgi nginx 在centos7.3部署

    0.直接上uwsgi和nginx安装命令 linux 安装uwsgi yum groupinstall "Development tools" yum install zlib-d ...

  3. 那些最全面的Windows10安装pytorch踩过的坑以及如何应用

    那些最全面的Windows10安装pytorch踩过的坑以及如何应用 一.pytorch简介 2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch.它是一个基 ...

  4. 项目中踩过的坑之-sessionStorage

    总想写点什么,却不知道从何写起,那就从项目中踩过的坑开始吧,希望能给可能碰到相同问题的小伙伴一点帮助. 项目情景: 有一个id,要求通过当前网页打开一个新页面(不是当前页面),并把id传给打开的新页面 ...

  5. web开发实战--弹出式富文本编辑器的实现思路和踩过的坑

    前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...

  6. "开发路上踩过的坑要一个个填起来————持续更新······(7月30日)"

    欢迎转载,请注明出处! https://gii16.github.io/learnmore/2016/07/29/problem.html 踩过的坑及解决方案记录在此篇博文中! 个人理解,如有偏颇,欢 ...

  7. 【转载】Fragment 全解析(1):那些年踩过的坑

    http://www.jianshu.com/p/d9143a92ad94 Fragment系列文章:1.Fragment全解析系列(一):那些年踩过的坑2.Fragment全解析系列(二):正确的使 ...

  8. Redis Cluster踩过的坑

    Redis Cluster踩过的坑请参考如下链接:http://www.iteye.com/blogs/subjects/Redis_Cluster_Devops

  9. 第八篇:web之前端踩的一些坑

    前端踩的一些坑   前端踩的一些坑 本节内容 事件代理 清除标签的所有事件 bootstrap的模态框自定义方法 ajax在django里面实现post提交 ajax提交数据嵌套 1.事件代理 之前写 ...

随机推荐

  1. 五月月赛 寻宝 exkmp + 主席树

    : 寻宝 时间限制: Sec 内存限制: MB 提交: 解决: [提交] [状态] [讨论版] [命题人:admin] 题目描述 采蘑菇的小西佬找到了一张上古年间的藏宝图,上面画着m座连绵不断的山,他 ...

  2. P1073 最优贸易 建立分层图 + spfa

    P1073 最优贸易:https://www.luogu.org/problemnew/show/P1073 题意: 有n个城市,每个城市对A商品有不同的定价,问从1号城市走到n号城市可以最多赚多少差 ...

  3. codeforces 733D Kostya the Sculptor(贪心)

    Kostya is a genial sculptor, he has an idea: to carve a marble sculpture in the shape of a sphere. K ...

  4. Educational Codeforces Round 68 Editorial

    题目链接:http://codeforces.com/contest/1194                                            A.Remove a Progre ...

  5. Unity 3D,地形属性

    Terrain Width 地形高度 Terrain Height 地形宽度 Terrain Lenght 地形长度 HeughtMap Resolution  地形高度图的分辨率 Detail Re ...

  6. .net core 部署到windows上的方法与 系统中相关问题的解决

    前言 Net core 项目部门在Windows有很多种方式,大致有以下几种, dotnet 命令, iis(windowshosts), 一些开源的应用容器(docker ) 基于一些exe 程序, ...

  7. yolo进化史之yolov2

    yolov1和当时最好的目标检测系统相比,有很多缺点.比如和Fast R-CNN相比,定位错误更多.和基于区域选择的目标检测方法相比,recall也比较低.yolov2的目标即在保证分类准确度的情况下 ...

  8. Linux下编译提示arm-none-linux-gnueabi-gcc: command not found

    自己的Linux系统中已经正确安装了交叉编译器arm-2009q3,路径设置正常. 但是在使用arm-none-linux-gnueabi-gcc编译时提示  arm-none-linux-gnuea ...

  9. Django-开放静态资源-获取请求携带的数据-pychram连接数据库-修改Django默认数据库-DjangoORM操作--表管理-记录管理-01

    目录 关于静态资源访问 为什么要配置静态文件才能获取静态资源 常见的静态文件种类 如何配置来开启访问权限 禁用浏览器缓存 django的自动重启机制(热启动) 静态文件接口动态解析 向服务器发送数据 ...

  10. android 端缓存清理的实现

    首先关于缓存清理,网上已经有太多的工具类,但是遗憾的是,基本上都不完善,或者说根本就不能用,而项目中又要求实现这个烂东西(其实这玩意真没一点屁用,毕竟第三方清理/杀毒软件都带这么一个功能),但是只好硬 ...