一、简介

作为算法开发人员,在算法模块完成后,拟部署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. QFramework 使用指南 2020(七):Res Kit (1)概述与基本使用

    在上一篇,我们刚刚结束了 脚本生成专题,我们知道 QF 提供了两种脚本生成模式,一种是 ViewController + Bind ,另一种是 UI Kit 模式. 本来打算,介绍完 ViewCont ...

  2. Trace 2018徐州icpc网络赛 思维+二分

    There's a beach in the first quadrant. And from time to time, there are sea waves. A wave ( xx , yy) ...

  3. gulp的介绍和手动安装

    gulp, 前端自动化工具, 文件操作, 项目上线之前,将碎片文件合并,将ES6转成ES5,文件压缩,快速搭建服务器... gulp基于node环境 gulp就是node的一个非内置的小模块 gulp ...

  4. 入门MySQL——备份与恢复

    前言:  前面几篇文章为大家介绍了 MySQL 各种语句语法的用法及用户权限相关知识.本篇文章将主要讲解 MySQL 数据库数据备份与恢复相关知识,主要聚焦于逻辑备份,介绍mysqldump工具的使用 ...

  5. MySQL 之 pymysql

    MySQL 之 pymysql 一.概述 pymysql是python用来连接mysql的工具,安装方式:pip install pymysql -i https://pypi.douban.com/ ...

  6. 超实用!K8s 开发者必须知道的 6 个开源工具

    文章来源:云原生实验室,点击查看原文. 导读:Kubernetes 作为云原生时代的"操作系统",熟悉和使用它是每名用户(User)的必备技能.如果你正在 Kubernetes 上 ...

  7. H5实现扫描二维码功能

    为了实现H5扫描二维码功能,我在网上找到了可用的代码:https://github.com/zhiqiang21/WebComponent/tree/master/html5-Qrcode 该程序能基 ...

  8. Java EE—最轻量级的企业框架?

    确保高效发展进程的建议 很久以前,J2EE,特别是应用程序服务器被认为过于臃肿和"重量级".对于开发人员来说,使用此技术开发应用程序会非常繁琐且令人沮丧.但是,由于 J2EE 框架 ...

  9. jps虚拟机进程状态工具

    jps(JVM Process Status Tool) jps工具可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine ...

  10. 美团集群调度系统HULK技术演进

    本文根据美团基础架构部/弹性策略团队负责人涂扬在2019 QCon(全球软件开发大会)上的演讲内容整理而成.本文涉及Kubernetes集群管理技术,美团相关的技术实践可参考此前发布的<美团点评 ...