- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章机器学习模型python在线服务部署的两种实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
背景 。
众所周知python在机器学习实践中的应用广泛深入,而在我们业务中的应用集中在提供线上实时风控输出服务,比如国内业务的模型在线服务架构和海外业务的后台决策引擎架构。这两种应用的结合就要求我们考虑如何高效安全便捷地来实现模型的在线部署,为上游提供服务。 在我们的考虑中,无论是代码复杂程度和业务场景,还是语言本身的特点,模型部署都有趋于向微服务架构转型的趋势和需要。一方面,需要进行代码分离来明确责任分工提高开发效率和容错性。另外一个方面,python在CPU密集型的应用中表现是无法令人满意的。为了使用协程来提高异步性从而处理更多的并发请求,最直接地就是将CPU密集转化为IO密集,因为Python天生就适合IO密集型的网络应用。 因此,我们生产中将模型计算抽取为model_lib代码库,并且通过微服务online_model进行交互。这里我们调研过两种模型部署的方式,最终选择了第一种.
。
Flask是一个轻量级的可定制框架,具有灵活、轻便且高效的特点,并且是标准的wsgi接口框架,易于扩展和维护.
1. 为什么选用nginx+uwsgi+flask这种技术架构 。
1) Uwsgi搭配nginx性能快,内存占用低,高度可定制,自带详尽日志功能,支持平滑重启.
2) Flask完全兼容了wsgi标准; 微框架,扩展性强; 完全基于unicode,不需处理编码问题;自带服务可独立做单元测试及开发.
3) 我们客户端采用了tornado协程,已经实现了将cpu计算转为io操作,服务端完全是CPU密集的模型计算,不会释放进程,异步框架保持大量文件描述符状态耗费内存,因此不适用异步IO框架.
2. 业务流程框架 。
3. 部署方式:
部署方式采用nginx+uwsgi+flask的方式,uwsgi可直接接受socket而不是http请求提高性能,再将服务转发给flask框架,这里注意flask此类wsgi标准接口的服务框架比如djangoweb.py在生产中一般不使用自带服务,而是在上层部署uwsgi或者gunicorn作为服务器来进行服务转发,上层再用nginx来做负载均衡,这样可以提高服务稳定性和性能.
4. 代码示例:
uwsgi服务配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
[uwsgi]
# 监听端口
socket=127.0.0.1:8200
# 进程数
processes=20
;async=4
;threads=2
;enable-threads = true
# 运行的目录
chdir = /home/rong/www/online_model
# wsgi文件
wsgi-file = model_main.py
callable=app
# 是否要有主进程
master = true
# 后台运行及其打印的日志
daemonize = /home/rong/www/log/uwsgi.log
# 主进程pid文件
pidfile = /home/rong/www/log/online_model/pid/uwsgi.pid
# 日志切割大小
log-maxsize = 5000000
# 不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中。
disable-logging = false
# 超时时间
http-timeout= 3
# 传输数据大小限制
buffer-size = 1048576
# 每个进程单独加载
lazy-apps = true
|
flask服务关键代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
import importlib
import json
import cProfile
import pstats
import StringIO
import time
import traceback
from flask import Flask, request
from common import rong_logger
from common.global_variable import StaticCacheClass
import autopath # 不能去掉
app = Flask(__name__)
# 这里是模型代码库的统一入口,模型代码库中是通过抽象类实现的规范化的模型代码实例,通过此服务提供调用,也通过离线调度进行跑批任务。保证线上线下模型调用一致性
online_model_main = importlib.import_module('online_model_main')
MUST_PARAMS = ['resource_id', 'feature_dict']
SUCCESS_STATUS = 0
ERROR_STATUS = 1
# 路由函数只允许post请求
@app.route("/", methods=['POST'])
def model_main():
uniq_id = '[%s][%s]' % (request.form.get('resource_id', ''), request.url)
try:
status, msg, params = _check_params(request)
if status != SUCCESS_STATUS:
rong_logger.error(uniq_id + 'params error, detail: %s' % msg)
status, msg, result = status, msg, None
else:
resource_id, feature_dict = params['resource_id'], json.loads(params['feature_dict'])
status, msg, result = online_model_main.main(resource_id, feature_dict, request, rong_logger)
rong_logger.info(uniq_id + '[%s][%s][%s]' % (status, msg, result))
except Exception as e:
rong_logger.error(uniq_id + 'error: %s, detail: %s' % (str(e), traceback.format_exc()))
status, msg, result = 5, 'online_model_error:' + str(e), None
return _get_response(status, msg, result)
|
模型代码库模型实例:
其中 XgboostExecutor类是基于xgb模型抽象类实现的类,通过它来实例化一个模型对象,给flask应用提供调用。具体我们不再深究,有兴趣可以再写一个专题来介绍模型代码库的部署.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# -*- coding:utf-8 -*-
# !/usr/bin/python
import logging
import os
from executor.src.load_helper import read_cur_path
from executor.xgboost_model_executor import XgboostExecutor
logging.basicConfig(level=logging.INFO, format='%(asctime)s:%(message)s')
[model_path, features_path,feature_importance_path] = map(
read_cur_path, ["xgb_model", "feature_list","feature_importance"]
)
model = XgboostExecutor(model_path, features_path,
feature_check_white_list=["n21_score"],
white_or_weight=False,
feature_check_weight_limit= 1,
feature_importance_path=feature_importance_path,
manager="qutianhang@xx.com",
developer="qutianhang@xx.com",
correlation="negative")
|
5. 性能比对 。
微服务改造后20并发请求模型: 微服务改造前20并发请求模型:
本机测试并发性能就提高了20%,但注意这是在高并发的情况下,就单条请求来看,微服务并不能显著提高性能.
。
在 gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,能够更容易地创建分布式应用和微服务。与许多 RPC 系统类似,gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够执行在服务端实现的一样的方法(这个方法就类似于接口) 。
1. 为什么选用grpc进行模型部署 。
2. 部署方式(业务流程与之前相同) 。
部署方式采用nginx+grpc,要求nginx支持http2.0。在客户端将json特征字典转为protobuf。(https://github.com/NextTuesday/py-pb-converters/blob/master/pbjson.py 这里附上json和protobuf互相转化的脚本。) 。
3. 服务发现与负载均衡 。
4. 开发流程 。
客户端:
服务端:
。
1) grpc使用protbuf更加复杂,需要在客户端服务端均保留protbuf文件并做校验,而flask只需要做好统一的接口标准规范即可.
2) grpc使用http2.0更适用移动端的在线模型预测,或者基于tensorflowd的大规模线上模型部署和预测,flask更适用后端面向服务的手动模型部署和预测.
3) grpc节省数据空间,但与python交互需要做json和protbuf数据转换,flask兼容wsgi标准,适用于RESTful类服务,但数据传输占用空间较大.
原文地址:https://segmentfault.com/a/1190000024544688 。
最后此篇关于机器学习模型python在线服务部署的两种实例的文章就讲到这里了,如果你想了解更多关于机器学习模型python在线服务部署的两种实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个 PowerBI Online 数据集,它是在 PowerBI 桌面中创建然后在线发布的。到目前为止,一切都很好。 我通过 PowerBI pusblish 从 Excel 连接到数据集,按预
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 2 年前。
我必须对一些太大而无法放入内存的数据训练分类模型,我正在使用 scikit learn 和 pandas 来进行分析。所以这是我的问题,如何在在线学习管道中使用验证来调整超参数? 我使用带有chuck
我正在开发一个应用程序,该应用程序将从 webservice 获取数据和图像并将其存储在设备中以供离线使用。同时,应用程序会将一些数据存储在 sqlite db 中,并将一些图像作为默认数据。 这是应
是否可以使用 FileReader API 和 onprogress 事件访问随 HTML5 传入的数据? 如果是这样,是否有 MD5 或其他快速散列算法的“在线”版本,以便我可以在文件完全读取之前开
希望任何人都可以帮助我更改下面的代码,我的临时文件包含以下代码: Temp=8.4* Humidity=70.4% 代替代码 Temp = 24 *C, Hum = 40 % 适用于以下脚本。 我需
我必须创建一个功能类似于联系人应用程序的应用程序。您可以在客户的 iPhone 上添加一个联系人,它应该会上传到客户的 iPad 上。如果客户在他们的 iPad 上更新联系人,它应该会在他们的 iPh
在 gitlab.com 上审查 merge 请求时,有时我必须在完成 merge 之前进行 rebase。 在 gitlab 上按“Rebase”后,我有一个特定的管道步骤失败,因为它无法验证用户的
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我正在尝试在 azure 上托管 SQL 服务器以与节点应用程序进行通信。我已经成功地完成了创建数据库服务器和数据库本身的过程。现在,我想编辑我的数据库结构。据我发现online ,应该有一种方法可以
我在 Quickbooks Intuit 开发人员 API 中使用 Oauth 2 获得了访问 token 。 范围是 com.intuit.quickbooks.accounting 我能够使用 Q
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
是否可以使Angular Material progress spinner与文本并大致与字符的大小一致地显示? 我想要类似的东西: please wait 微调器仅与“请稍候”文本成行出现。 这可
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个每天运行的Powershell脚本。今天它失败了,因为我正在使用的域 Controller 不可用。在继续执行脚本的其余部分之前,我想确保可以连接到可用的DC。 $LdapServer = "
我想制作一款在线 Flash 游戏,它将具有社交功能,但游戏玩法将主要是单人游戏。例如,屏幕上不会同时出现两个玩家,社交互动将通过异步消息进行,不会有实时聊天或其他任何内容。大部分逻辑将发生在客户端中
这几天我开始在线玩OpenShift。我部署了一个非常简单的“Hello World”Java 示例(1 行代码!),没有任何依赖项(没有 Spring!)命令行是这样的: oc.exe new-a
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
所以我一直在网上学习Java(初学者),并且我一直在尝试制作一个用于制作矩形的类文件。但是,我的在线 java 评估器指出它找不到实例变量。 This is the comment on it.我的代
我是一名优秀的程序员,十分优秀!