本文使用 Zhihu On VSCode 创作并发布
快速上手
Python部署对外访问的算法服务,往往是很多小型算法公司的痛点,因为虽然有很多Python的Web库,但是往往都是针对IO请求的,但是我们机器学习往往都是CPU或者GPU,所以固然需要使用到多进程。
通常针对上述问题,我们通常的解决方法如下:
- Socket中加入多进程
- 直接使用tf-service
- 建立一个生产者消费者,用多进程去消费队列
- 直接使用
FastApi+gunicorn
今天我们就是直接使用FastApi
+gunicorn
的方式进行实现
下面直接上代码:
'''
@Author: TangZhiFeng
@LastEditors: TangZhiFeng
@LastEditTime: 2020-06-06 17:58:21
@Description: 算法服务
'''
import uvicorn
from fastapi import FastAPI
from offline.sorted import sorted_videos
app = FastAPI()
@app.post("/video_recommended") #这个就是定义请求方式POST,路由是/video_recommended
def video_recommended(user_id: int, last: str): # 定义请求的参数
# sorted_videos.timely_file_generate_suggestion_single 这是一个需要计算的函数
# 通常这里可以替换成任意一个算法的接口
code = sorted_videos.timely_file_generate_suggestion_single(user_id, last)
result = {
"code": code,
"code_describe" : "200:请求正常,400:缺少用户点赞信息文件"
}
# 返回一个dict, 这里会将这个dict转化成json类型
return result
直接使用gunicorn
:
gunicorn -k uvicorn.workers.UvicornWorker -w8 -b 0.0.0.0:8003 service:app
-k 对应着我使用的这个uvicorn
-w8 代表8个进程
-b 定义算法服务的host:port
service:app service对应当前这个文件
这里再提一句FastApi这个python web框架,真的很简单,而且在浏览器直接访问https://host:port/docs
可以直接出现算法服务的接口,并且可以直接访问测试。
截止到这里,一个快速上手的教程就结束了,另外gunicorn中会出现,重复加载模型的问题,在这里可以看参考资料[1]中直接定义,或者直接看gunicorn的文档。
参考资料
- 机器学习web服务化实战:一次吐血的服务化之路 - haolujun - 博客园
- gunicorn官方文档
- fastapi文档