码迷,mamicode.com
首页 > 编程语言 > 详细

基于Python技术栈的算法落地踩坑

时间:2018-11-11 14:18:23      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:通信   预处理   包含   数据   lru cache   java   inux   src   开源   

背景介绍

  在一些业务场景,我们需要把离线训练好的模型以微服务部署线上,如果是简单的使用sklearn pipeline,可以保存为XML格式的pmml供Java调用,
在配置为4 core,8G内存的docker环境可以提供8K左右的高并发,并且这种docker可以快速大规模部署到PaaS云平台,优势相当明显,实际情况是
算法人员会基于Python自定义lambda处理数据,而自定义的lambda是很难保存到pmml中的,并且很多公司的算法团队也是要求基于Python技术栈是

落地的。

踩坑过程

  算法人员序列化训练好的模型无外乎pkl 、h5,就以pkl为例,pkl中包含了数据的预处理、模型的pipeline等,把这种模型包装为微服务也不难,可以

选择flak+gevent+Gunicorn,前两个可以包装标准的API接口,Gunicorn是web容器可以提供异步高并发服务,在测试服务器(8 cores, 16G内存)QPS达到

10K +,性能还是可以的。

  1)docker部署踩坑,Python工程根目录下自己编写docker file,可以从开源镜像库选择自己的一款,Dockerfile里面命令行类似shell,比如下图:

技术分享图片

Python以来的相关模块、工程路径等要加上,接着docker build构建镜像,把镜像push到公司镜像库,在PaaS云平台pull镜像,整个流程不是太复杂,

但是压测的时候,几秒之内会发现docker的使用情况是CPU全部满负载100%,内存倒是50%左右,其实模型就是简单的分类算法,这其中的瓶颈主要是

两方面的:

  a)docker内部的Python应用与外部的通信链路比较耗时,优化代价较高,需要专业的docker专家来优化;

  b)Python应用本身既要有多线程、多协程的开销,是消耗CPU资源的,并且分类算法本身就是很耗费CPU资源的,属于计算密集型,所以docker的CPU很快

满负载,除非把算法的计算单独剥离出去;

至此基于docker的Python微服务行不通。

  2)直接把Python应用部署物理机,gunicorn作为web容器可以设置IP、port、工作进程数、最大并发数等等,可以参照gunicorn docs,具体策略有:

  a)application部署采用多进程部署,代码内部采用多线程、协程处理请求响应;

  b)对于一些重复的请求参数,引入LRU cache既降低了延时也避免了重复调用;

  c)由于Python是动态解释语言,可以想办法做到静态语言的水平,借助cython可以把Python工程编译为C文件及.so(linux)文件,这时可以把请求响应

延时进一步降低30%以上;

   延伸:YouTube在使用Python构建高并发服务值得借鉴,使用Python做到快速灵活的开发和部署,使用psyco,一种Python到C的动态编译器,该编译器

使用一种JIT编译方法来优化内层循环,再将内容完整的Python对象缓存起来,整体达到很高的性能。

refer:

https://gunicorn.org/#docs

https://www.cnblogs.com/break-python/p/5459169.html

https://docs.docker.com/engine/reference/builder/#format 

https://blog.csdn.net/wo18237095579/article/details/80540571

http://www.browserwork.com/architecture/youtube-architecture

基于Python技术栈的算法落地踩坑

标签:通信   预处理   包含   数据   lru cache   java   inux   src   开源   

原文地址:https://www.cnblogs.com/John-Geek-2018/p/9941943.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!