缘起
因为最近想学习机器学的相关知识,课程也看了几个,书也读了几本,但是还是没有什么清晰的感觉,始终找不到门的钥匙。好像黑崎一护成为死神时,身边无数的丝带,却始终看不见真正的红色的那条。
既然效果不佳,作为程序员,还是先从代码开始吧。
因为一直做后台开发,都是对外提供服务。那么同样角度思考机器学习这事儿,除了通过算法计算数据,生成模型外,最重要的应该还是提供能力吧,否则不就只是自嗨版的单机程序了。
既然这样,那就应该先提供一个服务,输出机器学习的能力。
因为机器学习的语言特性,直接使用pyhton开发服务。
搭建
经过一番查找,确定技术栈:
- flask + gunicorn + gevent
有些还在这基础上通过Supervisor守护进城服务,Nginx做反向代理,因为目前只是自己练习使用,暂时不用。
简单介绍一下上面几个组件。
Flask:python实现的一个轻量级微服务框架,基本功能简单,可以通过插件的方式加入其它功能。简单且灵活。
gunicorn:支持wsgi协议的http容器服务,兼容性强,使用简单。
gevent:python并发框架,提供系统性能。
以上三个工具因为之前没有用过,只是简单了解了一下。后续会多总结。
- 环境
Anaconda3 + python3.6
因为以后可能会加入TensorFlow的功能,目前TensorFlow支持python3.7还有点问题。所以决定使用3.6版本。
操作
- 安装工具
Anaconda3就是好用,直接查找 flask,gunicorn,gevent 安装即可。都是基本操作,基本无脑。
这里要注意的一点是,因为使用zsh,多以要想直接使用工具,需要配置zsh的环境变量,把当前用的python环境配置到zsh。否则不能全局使用命令工具。
- 新建工程
这一步其实真是比想象的简单的多的多的多(对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的那一套,脑中回想起:"我们不一样……不一样…不一样..."
- 运行
文件目录下,执行: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微服务貌似就这么结束了。
接下来还有更重要的工作,真正要做的才刚开始:
- 机器学习赋能,需要实现机器学习的算法功能,实现计算能力
- 能力输出,完善web框架的能力,达到企业级程度
感想
别人的代码越好用,自己的代码可能就越难写。机器学习这个领域虽然靠代码落地,但是真正支撑它的还是底层的知识结构。如果将理解事物的思维方式限定在代码层面,那对后面的学习还是有很大阻碍的。
所以代码不是目的,这个一定要定位清楚。
网友评论