Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

Julien Kervizic作者李海明、王欣校对黄继彦编辑陈之炎翻译

机器学习模型应用方法综述

本文整理比较模型部署到生产中使用的不同部署模型方式、生命周期管理方法及数据存储格式。


Mantas Hesthaven拍的发表在 Unspash上的照片

机器学习模型的应用方法多种多样,不一而足。 例如,在客户流失预测中,当客户呼叫服务时,系统中便可以查找到一个静态统计值,但对于特定事件来说,系统则可以获得一些额外值来重新运行模型。

通常,有很多方法可以对模型进行训练,并将其转化为应用产品:
  • 训练:一次性训练、批量训练和实时训练/在线训练

  • 应用:批训练、实时训练 (数据库触发器、Pub/Sub、Web服务、inApp)

每种方法都有各自的优劣,需要折中考虑。

一次性训练

模型在应用前,无需进行连续的多次训练。通常情况下,在数据科学家完成对模型的特定训练之后,便可进行应用,待模型性能无法满足使用要求时,再对其进行更新。

  • 从Jupyter到Prod

通常,数据科学家会在Jupyter Notebooks环境中组建原型和使用机器学习算法。Jupyter Notebooks是repl上的高级GUI,可以在这个环境中同时保存代码和命令行输出。

采用这种方法,完全可以将一个经过特别训练的模型从Jupyter中的某个代码推向量产。多种类型的库和其他笔记本环境有助于加强数据科学家工作台和最终产品之间的联系。
  • 模型格式


Pickle将python对象转换为比特流,并将其存储到磁盘以便后续重新加载。它提供了一种很好的格式来存储机器学习模型,亦可在python中构建其应用程序。

ONNX为开放式神经网络交换格式,作为一种开放格式,它支持跨库、跨语言存储和移植预测模型。大多数深度学习库都支持该格式, sklearn还有一个扩展库来将模型转换为ONNX格式。

PMML或预测模型标记语言,是另一种用于预测模型的交换格式。sklearn还有另一个扩展库,可用于将模型转换为PMML格式,这与ONNX是一致的。然而,它的缺点是只支持某些类型的预测模型,PMML从1997年开始出现,大量的应用程序均采用这种格式。例如:像SAP这样的应用程序能够利用PMML标准的某些版本,对于CRM应用程序(如PEGA)也是如此。

POJOMOJO是两种H2O.ai的导出格式,他们旨在为Java应用程序提供一个易于嵌入的模型。然而,这两种导出格式只在H2O平台上使用。
  • 训练

对一次性训练模型,可以由数据科学家专门对模型进行训练和精调,或者也可以通过AutoML库进行训练。通过简单设置,便可将模型产品化推进到下一个阶段,例如批训练。

批训练

虽然不是所有的模型都需要应用,但批训练可以根据最新的训练结果使模型的版本得到连续刷新。

批训练受益于AutoML框架,其通过AutoML能够自动执行一系列动作。例如:特征处理、特征选择模型选择参数优化。AutoML新近的表现与最勤奋的数据科学家不相上下,甚至超过了他们。

LinkedIn上的帖子

利用它们可以进行更为全面的模型训练,而不是做预训练:简单地重新训练模型的权重

目前有多种不同的技术来支持连续的批训练,例如,可以通过多种混合 airflow来管理不同的工作流和类似tpot的AutoML库。

不同的云服务提供商为 AutoML 提供了各种解决方案,并把这些解决方案放到数据工作流中。例如,Azure将机器学习预测和模型训练与其数据工厂进行了整合。

实时训练

实时训练可以通过“在线机器学习”模型实现,支持这种训练方法的算法包括:K-均值(通过小批处理)、线性回归和Logistic回归(利用随机梯度下降)以及朴素贝叶斯分类器。

Spark中包含 StreamingLinear算法/StreamingLinearRegressionWithSGD算法来执行这些操作,Skinlear具有SGDRegressor和SGD分类器,可实现增量训练。在sklearn中,增量训练通过partial_fit方法完成,如下所示:
在部署这类模型时,需要严格的操作支持和监控,因为模型对新的数据和噪声很敏感,所以需要动态地监控模型性能。在离线训练中,可以过滤掉高位的点值,并对输入数据进行校正。当需要根据新的数据流不断更新模型训练时,难度系数会高出许多。

在线模型训练的另一个挑战是,过往历史信息得不到衰减。 这意味着,如果数据集的结构有新的变化,则需要重新对模型训练,这在模型生命周期管理中将是一个很大的挑战。

批量预测与实时预测的比较

 
当选择是设置批量预测还是设置实时预测时,必须了解实时预测的重要性。如果发生重大事件,有可能会获得新的分数,例如当客户呼叫联络中心时,客户流失评分又会是多少。在实时预测时,需要对这些因素进行加权,以克服由于进行实时预测而产生的复杂性和成本影响。
  • 载荷的影响

在进行实时预测时,需要有一种处理高峰负荷的方法。需要根据所采用的途径以及使用的预测如何结束,来选择一种实时方法,可能还需要有具有额外计算能力的超级机器,以便在某个SLA中提供预测。这与批量预测的处理方法形成了对比,在批量预测中,可以根据可用容量将预测计算分散到一整天。
  • 架构的影响

在实时预测时,运营责任会更高一些,人们需要对系统是如何工作进行监测,在出现问题时有告警,并考虑到故障转移责任。 对于批量预测来说,运营责任要低得多,只需要对告警进行一些必要的监测,而对于了解产生问题的直接原因的需求要低得多。
  • 成本的影响

实时预测也受成本因素的影响,一味追求高算力,而却没有选择将计算负荷分散在全天进行,可能会迫使你购买那些超出算力需求的硬件设备或提高现货价格。根据所用方法和需求,可能还需要投入额外的成本购买更强大的计算能力来满足SLA的需求。此外,在选择实时预测时,可能会有更高的架构要求。需要注意的是,在应用程序中,所做出的选择要依赖应用程序的预测,对于这样的特定场景,实时预测的成本最终可能会比批量预测的成本更低。
  • 评估的影响

实时预测的预测性能评估比批量预测的预测性能评估更具挑战性。例如,当在短时间内遇到一连串的突发行为时,如何评估性能,会不会为特定的客户产生多个预测结果?实时预测模型的评估和调试要复杂得多,它还需要一个日志收集机制,既允许收集不同的预测结果和特征,也可以生成分数以供进一步评估。

批量预测集成

批量预测依赖于两个不同的信息:一个是预测模型,另一个是提供给模型的特征。在大多数批处理预测体系结构中,ETL既可以从特定的数据存储(特征存储)中获取预先计算的特征,也可以跨多个数据集执行某种类型的转换,并向预测模型提供输入。然后,预测模型对数据集中所有的行数据进行迭代,并输出不同的分值。

用于批量预测的示例流模型

一旦计算得到所有的预测结果,便可以将分数“投入”到那些有信息使用需求的不同系统中。可以根据不同的应用实例,并通过不同的方式来实现分数的使用。例如,如果想在前端应用程序上使用分数,则很可能将数据推送到“缓存”或NoSQL数据库:比如Redis,这样可以提供毫秒的响应;而对于某些用例,比如创建电子邮件,可能只是依赖CSV SFTP导出或将数据加载到更传统的RDBMS。

实时预测集成

基于实时应用的模型使用需要3个基本组件:客户/用户配置文件、一组触发器和预测模型。

  • 配置文件:客户配置文件包含和客户相关的所有属性,以及给出预测所必需的不同属性(例如:计数器)。对于客户级预测,为了减少从多个地方提取信息的延迟,以及简化机器学习模型的量产化过程,配置文件是必须的。在大多数情况下,为了更有效地获取数据,需要相似的数据存储类型。

  • 触发器:触发器是引导进程启动的事件,它们可以用于客户流失的预测。例如调用客户服务中心、检查订单历史记录中的信息等。

  • 模型: 模型需要经过预先训练,通常导出到前面提到的 3 种格式之一 (pickle、 ONNX 或 PMML) ,以便可以将其移植到量产中。

还有许多方法可以将模型应用至评分产品中:
  • 取决于数据库集成:诸多数据库供应商为在数据库中绑定高级分析用例做出了重大努力,既可以直接集成Python或R代码,也可以导入PMML模型。

  • 利用Pub/Sub模型:预测模型本质上是对数据流的输入执行某些操作,例如提取客户配置信息等。

  • Webservice:围绕模型预测设置API封装器,并将其部署为Web服务。根据Web服务的设置方式,它可能执行或不执行驱动模型所需的数据操作。

  • inApp:也可以将模型直接部署到本地或Web应用程序中,并让模型在本地或外部数据源上运行。

数据库集成

如果数据库的总体大小不大 (用户配置文件<1M),并且更新频率也不大,那么将一些实时更新过程直接集成到数据库中会很有意义。

Postgres允许将Python代码作为函数或称为PL/Python的存储过程来运行。该实现可以访问所有作为PYTHONPATH的一部分库,也可以使用Pandas和SKLearning等库来运行某些操作。

此外,还可以与Postgres的触发器机制相结合来运行数据库,并更新客户流失分数。比如,如果在投诉表中输入了一个新条目,那么让模型实时重新运行的话便很有价值。
  • 流程

流程以如下方式设置:
  • 新事件: 当在投诉表中插入新行时,将生成事件触发器。

  • 触发器: 触发器功能将更新该客户在客户配置文件表中提出的投诉数量,并为客户更新记录。

  • 预测请求:使用PL/Python重新运行客户流失模型并检索预测结果。

  • 用户配置文件的更新:根据更新后的预测结果重新更新客户配置文件。然后,当检查客户配置文件是否已经用客户流失预测值进行更新时,就会生成下游流。

  • 技术

Different databases are able to support the running of多种数据库支持Python脚本的运行,如前所述, Postgres集成有本地Python, MSSQL Server也可以通过其“机器学习服务(在数据库中)”运行R/Python脚本,诸如Teradata等其他数据库可以通过外部脚本命令运行R/Python脚本。Oracle通过其数据挖掘扩展支持PMML模型。

Pub/Sub


通过pub/sub模型实现实时预测,可以通过节流正确地处理负载。对于工程师而言,这也意味着可以通过一个单独的“日志”提要来输入事件数据,不同的应用程序均可以订阅这个提要。

设置示例:

页面查看事件被触发到特定的事件主题,在该主题中,两个应用程序订阅一个页面查看计数器和一个预测器。这两个应用程序都从主题中筛选出特定的相关事件,并在该主题中使用不同的消息。页面查看计数器为仪表板提供数据,而预测应用程序则负责更新客户配置文件。

  • 流程

事件消息在发生时被推送到pub/sub主题,预测应用程序会轮询新消息的主题。当预测应用程序检索到新消息时,该程序将请求并检索客户配置文件,并使用消息和配置文件信息进行预测,预测结果最终返回客户配置文件以供进一步使用。
还可以设置一个稍微不同的流程:数据首先被一个“富集应用程序”使用,该应用程序将配置文件信息添加到消息中,然后返回一个新主题,并最终交由预测应用程序推送到客户配置文件上。
  • 技术

您会发现,在数据生态系统中支持这种用例的典型的开源组合是Kafka和SPark流的组合,但是云上可能有不同的设置。值得注意的是:Google发布的pub-sub /数据流(BEAM)提供了一个很好的替代方案,在Azure上,Azure-Service总线或Eventub和Azure函数的组合可以作为一种很好的方式来利用消息生成这些预测。

网络服务Web Service
 
我们还可以将模型作为互联网服务产品。将预测模型作为互联网服务产品对于工程团队尤为有用,这些团队通常需要处理Web、桌面和移动等多个不同的接口。

可以有多种方式设置Web服务的接口:

  • 提供标识符,然后让web服务提取所需的信息,计算预测值,然后返回该值

  • 或者通过接受有效载荷,将其转换为数据帧,进行预测并返回该值。

当发生大量交互,并且使用本地缓存与后端系统的同步,或者当需要在不同的粒度上进行预测时,比如:在进行基于会话的预测时,通常建议使用第二种方法。
 
使用本地存储的系统往往具有还原功能,其作用是计算客户配置文件的内容,因此,它提供了基于本地数据的客户配置文件的近似值。
 

  • 流程

使用移动应用程序处理预测的流程可分为4个阶段进行描述:
  • 应用程序初始化(1至3)阶段:应用程序初始化,向客户配置文件发出请求,检索其初始值,在本地存储中初始化配置文件。

  • 应用程序(4)阶段:应用程序将与该程序中出现的不同事件存储到本地存储区的数组中。

  • 预测准备阶段(5-8):如果应用程序想要检索一个新的客户流失预测,那么它需要将互联网服务所需的信息准备好。首先对本地存储进行初始请求,并检索客户配置文件的值及其存储的事件数组,检索完成后,向还原器函数提出请求,将这些值作为参数,还原器函数输出一个更新后的客户配置文件,并将本地事件合并到这个客户配置文件中。

  • Web服务预测阶段(9至10):应用程序向客户流失预测的互联网服务产品发出请求,将第8步骤中的有效载荷提供给更新后的客户配置文件。然后,互联网服务产品可以使用载荷提供的信息生成预测并将其值输出给应用程序。

  • 技术

有很多技术可以用来支持互联网服务产品预测:
  • 函数

AWS Lambda函数、GoogleCloud函数和MicrosoftAzure函数(尽管目前只支持Beta版Python)提供了一个易于设置的界面,可以轻松地部署可伸缩的Web服务。

例如,在Azure上,可以通过如下函数实现web-service预测:

  • 容器

除了函数之外的另一种选择是通过docker容器(AmazonECS、Azure容器实例或Google Kubernetes引擎)部署一个Flask或Django应用程序。例如,Azure通过“AzureMachineLearning服务”提供了一种简单的方法来设置预测容器。
  • 笔记簿

不同的笔记薄提供商,如Databricks和dataiku,都致力于简化其环境中的模型部署。它们具有将webservice设置到本地环境或部署到外部系统(如Azure ML服务、Kubernetes引擎等)的功能。

应用程序内部

在某些情况下,因为法律和隐私的要求,不允许数据被存储在应用程序外部时,或者必须上传大量文件时,往往会在应用程序内部调用模型。

Android-MLKit 或 Caffe2类似的工具允许在本地应用程序中调用模型,而Tensorflow.js和ONNXJS允许直接在浏览器中或在JavaScript的应用程序中运行模型。

需要综合考虑的几点

除了模型的部署方法外,部署模型到量产时需要考虑以下重要因素。
  • 模型的复杂度

模型本身的复杂程度,是应首先要考虑的因素。像线性回归和Logistic回归这样的模型非常容易部署,通常不会占用太多的存储空间。使用更为复杂的模型,如神经网络或复杂集成决策树,计算将占用更长时间,冷启动时加载到内存中的时间也会更长,而且运行成本会更高。
  • 数据来源

需要着重考虑的是实际应用中的数据源与用于训练的数据源之间可能存在的差异。虽然用于训练的数据必须与生产中实际使用数据内容同步,但是重新计算每个值以使其完全同步是不切实际的。
  • 实验框架

建立一个实验框架,用于客观度量不同模型性能的A/B测试,并确保有足够的跟踪来准确地调试和评估模型的性能。

小结

选择如何将预测模型部署到生产中是一件相当复杂的事情,可以有多种不同的方法来处理预测模型的生命周期管理,也可以用不同的格式来存储它们,从多种方法中选取恰当的方法来部署模型,包含非常宽泛的技术含量。
 
深入理解特定的用例、团队的技术和分析成熟度、整体组织结构及其交互,有助于找到将预测模型部署到生产中的正确方法。

原文标题:

Overview of the different approaches to putting Machine Learning (ML) models in production

原文链接:

https://medium.com/analytics-and-data/overview-of-the-different-approaches-to-putting-machinelearning-ml-models-in-production-c699b34abf86

THU数据派
THU数据派

THU数据派"基于清华,放眼世界",以扎实的理工功底闯荡“数据江湖”。发布全球大数据资讯,定期组织线下活动,分享前沿产业动态。了解清华大数据,敬请关注姐妹号“数据派THU”。

理论机器学习模型数据库
7
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

数据科学技术

数据科学,又称资料科学,是一门利用数据学习知识的学科,其目标是通过从数据中提取出有价值的部分来生产数据产品。它结合了诸多领域中的理论和技术,包括应用数学、统计、模式识别、机器学习、数据可视化、数据仓库以及高性能计算。数据科学通过运用各种相关的数据来帮助非专业人士理解问题。

数据库技术

数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。 所谓“数据库”系以一定方式储存在一起、能予多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

封装器技术

智能代理和外部知识源之间的接口称为封装器。 封装器在智能代理使用的知识表示和外部知识源待处理的查询之间进行转换。 通常,封装器被封装器通常被用来使得通过一个智能代理可以对多个知识源进行相同的查询。 Wrapper方法寻找所有特征子集中能使后续学习算法达到较高性能的子集,在特征选择阶段,wrapper可以看做:搜索方法+学习算法。

数据挖掘技术

数据挖掘(英语:data mining)是一个跨学科的计算机科学分支 它是用人工智能、机器学习、统计学和数据库的交叉方法在相對較大型的数据集中发现模式的计算过程。 数据挖掘过程的总体目标是从一个数据集中提取信息,并将其转换成可理解的结构,以进一步使用。

线性回归技术

在现实世界中,存在着大量这样的情况:两个变量例如X和Y有一些依赖关系。由X可以部分地决定Y的值,但这种决定往往不很确切。常常用来说明这种依赖关系的最简单、直观的例子是体重与身高,用Y表示他的体重。众所周知,一般说来,当X大时,Y也倾向于大,但由X不能严格地决定Y。又如,城市生活用电量Y与气温X有很大的关系。在夏天气温很高或冬天气温很低时,由于室内空调、冰箱等家用电器的使用,可能用电就高,相反,在春秋季节气温不高也不低,用电量就可能少。但我们不能由气温X准确地决定用电量Y。类似的例子还很多,变量之间的这种关系称为“相关关系”,回归模型就是研究相关关系的一个有力工具。

朴素贝叶斯技术

朴素贝叶斯是一种构建分类器的简单方法。该分类器模型会给问题实例分配用特征值表示的类标签,类标签取自有限集合。它不是训练这种分类器的单一算法,而是一系列基于相同原理的算法:所有朴素贝叶斯分类器都假定样本每个特征与其他特征都不相关。举个例子,如果一种水果其具有红,圆,直径大概3英寸等特征,该水果可以被判定为是苹果。尽管这些特征相互依赖或者有些特征由其他特征决定,然而朴素贝叶斯分类器认为这些属性在判定该水果是否为苹果的概率分布上独立的。

随机梯度下降技术

梯度下降(Gradient Descent)是遵循成本函数的梯度来最小化一个函数的过程。这个过程涉及到对成本形式以及其衍生形式的认知,使得我们可以从已知的给定点朝既定方向移动。比如向下朝最小值移动。 在机器学习中,我们可以利用随机梯度下降的方法来最小化训练模型中的误差,即每次迭代时完成一次评估和更新。 这种优化算法的工作原理是模型每看到一个训练实例,就对其作出预测,并重复迭代该过程到一定的次数。这个流程可以用于找出能导致训练数据最小误差的模型的系数。

特征选择技术

在机器学习和统计学中,特征选择(英语:feature selection)也被称为变量选择、属性选择或变量子集选择。 它是指:为了构建模型而选择相关特征(即属性、指标)子集的过程。

模型选择技术

模型选择是从给定数据的一组候选模型中选择统计模型的任务。对于具有类似预测或解释力的候选模型,最简单的模型最有可能是最佳选择(奥卡姆剃刀)。

暂无评论
暂无评论~