业务背景
随着机器学习慢慢得业界认可,很多银行开始引入机器学习模型辅助规则引擎做决策,银行也做很多离线机器学习模型探索,效果都不错,但是却很少最后应用于在线环境,主要有以下几个原因
- 在风控场景,在线推理需要高性能,要求tp99 20ms,大部分模型性能很难达到
- 特征实效性要求高,基于真正滑动时间窗口做时序特征,大部分的基础设施无法满足
- 特征计算复杂且量大,上线成本非常高
- 离线特征计算与在线一致性保持困难,最终出现离线效果好,在线效果差情况
今天作为一个机器学习应用开发者,来告诉大家基于openmldb(https://github.com/4paradigm/OpenMLDB)是如何解决这些问题的
如何使用OpenMLDB解决一致性问题
在没有使用OpenMLDB之前,完成一个反欺诈模型上线项目需要做以下事情去解决一致性问题
- 因为数据科学家离线使用SQL处理数据,而再在线需要实时计算特征,需要转写特征方案,就需要和数据科学家对齐特征处理逻辑,还需要考虑数据科学家方案变化的风险
- 根据反欺诈在线系统架构设计一套在线适合实时数据处理架构
- 需要人肉开发每一个特征处理逻辑,每个特征方案如果几千特征,会有大量开发成本,如果要对接多个模式是不可能的
在这个过程中特征处理会消耗大量时间去对齐,有时候还会因为特征无法上线砍掉科学家的部分特征,而使用OpenMLDB之后,数据科学家的SQL特征处理逻辑能够直接给我使用,也就是说我只用做一件事情,拿着数据科学家的sql 扔到OpenMLDB里面执行拿到结果做模型推理,再也不用关心数据科学家的特征处理逻辑是什么,所以OpenMLDB给我带来的好处
- 不用理解数据科学家的特征方案逻辑,即使方案调整,我也只需要更新SQL到OpenMLDB里面就行
- 不用设计整套在线数据计算流,使用OpenMLDB让我感觉就像使用MySQL开发传统应用一样简单
- 告别人肉开发特征,人生苦短,开发机器学习应用我用OpenMLDB
这里大家可能会好奇,OpenMLDB是如何做到一个SQL不用做任何修改就能批量和实时执行,因为OpenMLDB支持两种执行模式
- 批量模式,针对训练过程产生样本,类似传统数据库执行SQL
- Request模式,针对推理过程实时产生样本,只会计算与请求相关的特征
如何使用OpenMLDB解决性能问题
OpenMLDB自带了一些列编译优化技术,比如函数动态循环绑定以及在线部分数据完全是in-memory的,能够保证非常高执行性能,以下是OpenMLDB github自带的性能数据
我们可以看出OpenMLDB的执行性能比SingleStore和Hana有很大的优势,接下来我们看一个实际SQL执行效率,SQL如下
select * from (select card_no, trx_time, merchant_id, month(trx_time) as fea_month,
dayofmonth(trx_time) as fea_day_of_month, hour(trx_time) as fea_hour,
week(trx_time) as fea_week, substr(card_no, 1, 6) as card_no_prefix,
max(trx_amt) over w30d as w30d_trx_max , min(trx_amt) over w30d as w30d_trx_min,
sum(trx_amt) over w30d, avg(trx_amt) over w30d, max(usd_amt) over w30d,
min(usd_amt) over w30d, sum(usd_amt) over w30d, avg(usd_amt) over w30d,
max(org_amt) over w30d, min(org_amt) over w30d, sum(org_amt) over w30d,
avg(org_amt) over w30d, distinct_count(merchant_id) over w30d,
count(merchant_id) over w30d, distinct_count(term_city) over w30d,
count(term_city) over w30d, max(trx_amt) over w10d, min(trx_amt) over w10d,
sum(trx_amt) over w10d, avg(trx_amt) over w10d, max(usd_amt) over w10d,
min(usd_amt) over w10d, sum(usd_amt) over w10d, avg(usd_amt) over w10d,
max(org_amt) over w10d, min(org_amt) over w10d, sum(org_amt) over w10d,
avg(org_amt) over w10d, distinct_count(merchant_id) over w10d,
count(merchant_id) over w10d, distinct_count(term_city) over w10d,
count(term_city) over w10d
from tran window w30d as (PARTITION BY tran.card_no ORDER BY tran.trx_time ROWS_RANGE BETWEEN 30d PRECEDING AND CURRENT ROW),
w10d as (PARTITION BY tran.card_no ORDER BY tran.trx_time ROWS_RANGE BETWEEN 10d PRECEDING AND CURRENT ROW)) as trx_fe
last join card_info order by card_info.crd_lst_isu_dte on trx_fe.card_no = card_info.crd_nbr and trx_fe.trx_time >= card_info.crd_lst_isu_dte ;
先分析一下这个SQL,影响起性能的因素
- 时间窗口里面数据条数
- 特征个数
因为特征个数是特定的,所以我们测试在不同条数的时间窗口的性能表现
使用OpenMLDB在线业务效果
业务效果,是大家非常关心的事情,目前我上线了多个银行的反欺诈场景,在线效果与离线评估效果保持了一致,模型效果对比客户的专家规则有2~8提升,在同样的召回率情况下,客户非常认可我们的工作,希望我的分享能够帮助大家
关于OpenMLDB
OpenMLDB是一个面向机器学习应用提供正确、高效数据供给的开源数据库。除了超过10倍的机器学习数据开发效率的提升,OpenMLDB也提供了统一的计算与存储引擎减少开发运维的复杂性与总体成本。
欢迎大家参与到https://github.com/4paradigm/OpenMLDB 社区中