点亮技术栈

搭建python机器学习restful服务

2019-04-09  本文已影响0人  刘笔尖儿

缘起

因为最近想学习机器学的相关知识,课程也看了几个,书也读了几本,但是还是没有什么清晰的感觉,始终找不到门的钥匙。好像黑崎一护成为死神时,身边无数的丝带,却始终看不见真正的红色的那条。

既然效果不佳,作为程序员,还是先从代码开始吧。

因为一直做后台开发,都是对外提供服务。那么同样角度思考机器学习这事儿,除了通过算法计算数据,生成模型外,最重要的应该还是提供能力吧,否则不就只是自嗨版的单机程序了。

既然这样,那就应该先提供一个服务,输出机器学习的能力。

因为机器学习的语言特性,直接使用pyhton开发服务。


搭建

经过一番查找,确定技术栈:

  1. flask + gunicorn + gevent

有些还在这基础上通过Supervisor守护进城服务,Nginx做反向代理,因为目前只是自己练习使用,暂时不用。

简单介绍一下上面几个组件。

Flask:python实现的一个轻量级微服务框架,基本功能简单,可以通过插件的方式加入其它功能。简单且灵活。

gunicorn:支持wsgi协议的http容器服务,兼容性强,使用简单。

gevent:python并发框架,提供系统性能。

以上三个工具因为之前没有用过,只是简单了解了一下。后续会多总结。

  1. 环境

Anaconda3 + python3.6

因为以后可能会加入TensorFlow的功能,目前TensorFlow支持python3.7还有点问题。所以决定使用3.6版本。


操作

  1. 安装工具

Anaconda3就是好用,直接查找 flask,gunicorn,gevent 安装即可。都是基本操作,基本无脑。

这里要注意的一点是,因为使用zsh,多以要想直接使用工具,需要配置zsh的环境变量,把当前用的python环境配置到zsh。否则不能全局使用命令工具。

  1. 新建工程

这一步其实真是比想象的简单的多的多的多(对python的好感进一步提升)…...

pyCharm新建一个工程,新建app.py。

from flask import Flask

app = Flask(__name__)

@app.route('/api/simpleApi')
def isPerson():
    return 'yeah, I\'m the machine who can compute you!'

if __name__ == '__main__' :

    from werkzeug.contrib.fixers import ProxyFix
    app.wsgi_app = ProxyFix(app.wsgi_app)
    app.run()

这就是一个微服务,想象Spring的那一套,脑中回想起:"我们不一样……不一样…不一样..."

  1. 运行

文件目录下,执行:gunicorn -w 2 -b 127.0.0.1:8000 -k gevent app:app

这里介绍一下gunicorn的参数。

-w:指定进程的数量,这里配置2,所以下面的输出里启动了两个进程:44227,44228

-b:指定地址和端口号,如果不指定默认是 localhost:5000

-k: 指定gunicorn的work-class 模式,默认是sync同步模式,这里通过gevent提升并发能力。

如果出现下面输出,那就说明服务启动成功。

[44223] [INFO] Starting gunicorn 19.9.0
[44223] [INFO] Listening at: http://127.0.0.1:8000 (44223)
[44223] [INFO] Using worker: gevent
[44227] [INFO] Booting worker with pid: 44227
[44228] [INFO] Booting worker with pid: 44228

PostMan 直接访问接口 http://localhost:8000/api/simpleApi

返回:yeah, I'm the machine who can compute you!

说明没啥问题。


然后

一个简单的python微服务貌似就这么结束了。

接下来还有更重要的工作,真正要做的才刚开始:

  1. 机器学习赋能,需要实现机器学习的算法功能,实现计算能力
  2. 能力输出,完善web框架的能力,达到企业级程度

感想

别人的代码越好用,自己的代码可能就越难写。机器学习这个领域虽然靠代码落地,但是真正支撑它的还是底层的知识结构。如果将理解事物的思维方式限定在代码层面,那对后面的学习还是有很大阻碍的。

所以代码不是目的,这个一定要定位清楚。

上一篇下一篇

猜你喜欢

热点阅读