使用 Kafka 在生产环境构建大规模机器学习

    智能实时应用为全部行业带来了革命性变化。机器学习及其分支深度学习正蓬勃发展,由于机器学习让计算机可以在无人指引的状况下挖掘深藏的洞见。这种能力正是多种领域所须要的,如非结构化数据分析、图像识别、语音识别和智能决策,这彻底不一样于传统的编程方式(如 Java、.NET 或 Python)。机器学习并不是新生事物,大数据集的出现和处理能力的进步让每个企业都具有了构建分析模型的能力。各行各业都在将分析模型应用在企业应用和微服务上,用以增加利润、下降成本,或者改善用户体验。    html

可伸缩的任务关键型实时系统git


    互联网、智能手机持续在线思惟的出现改变了人们的行为方式。其中就包括人们对与设备、产品和服务交互方式的期待:人们但愿可以实时地得到信息。这也给企业带来了巨大挑战:如何快速地采起行动才能把握先机。批处理系统已经没法知足需求,取而代之的应该是实时系统。传统企业能够实现很是强大的实时处理机制来知足平常的业务需求。这一般须要借助领域知识来理解各类应用场景,并构建新的流式分析模型来增长业务价值。流式处理已经存在于各个行业中。github

  • 欺诈检测:将支付信息与历史数据或已知的模式关联起来,在欺诈发生以前将其检测出来。这对处理速度提出了很高的要求,由于你必须在交易发生以前将其取消掉。
  • 交叉销售:利用客户数据为客户提供定制化的销售方案或折扣,争取让客户在离开商店以前成交订单。这种状况下,你须要利用实时数据(好比位置数据、支付数据)和历史数据(来自你的 CRM 系统或 Loyalty 平台)为每一个客户提供最合适的销售方案。
  • 预测性维护:使用机器数据来预测机器故障,在发生故障以前将旧的部件更换掉。从实际状况来看,这能够节省大量的金钱(制造)、增长利润(自动售卖机)或提高用户体验(电信网络故障预测)。

全部这些场景都有一个共同点,那就是在数据产生的同时处理数据。你必须尽快地处理已经发生的事件,是主动处理,而不是被动处理。你的系统须要在欺诈发生以前,或在顾客离开商店以前,或在机器发生故障以前作出决策。算法

固然,这并非说必定要求毫秒级别的响应时间。在某些状况下,即便是批处理也是没有问题的。好比,大部分制造行业或物联网场景中,预测性维护能够容许几个小时甚至几天的时间间隔,更换部件能够在当天或当周内完成。这样能够节省大量的金钱,由于你能够在问题发生以前检测出它们,避免形成更大范围的损失。数据库

在智能实时系统中应用机器学习apache


 任务关键型实时应用系统在不使用机器学习的状况下已经存在多年,那为何说机器学习将给这一领域带来革命性的变化? 若是你读过有关机器学习及其分支深度学习的资料,你常常会看到以下的一些场景。编程

  • 图像识别:上传一张图片到 Facebook 上,图像中的物体——好比你的朋友、背景或你手中的啤酒——就会被分析出来。
  • 语音翻译:机器人所以能够经过生成的文本或声音与人类进行互动。
  • 仿人类行为:IBM Watson 击败了最强大的 Jeopardy 选手;Google 的 AlphaGo 打败了最专业的 Go 选手。

上述的例子与那些想要构建创新型应用系统并从竞争当中脱颖而出的企业有着愈来愈紧密的联系。相似的,咱们能够将机器学习应用在“传统场景”里,好比欺诈检测、交叉销售或预测性维护,以此来加强业务流程,基于数据驱动作出更好的决策。已有的业务流程能够保持原样,你只须要将业务逻辑和规则替换成分析模型来改进自动化决策便可。服务器

机器学习——分析模型的开发生命周期网络


 先让咱们了解一下分析模型的开发生命周期:架构

  • 构建:使用机器学习算法(如 GLM、Naive Bayes、Random Forest、Gradient Boosting、Neural Networks 等)分析历史数据,挖掘洞见。在这一步需要进行数据的收集、准备和转换
  • 验证:使用一些验证技术(如交叉验证)再次确认分析模型可以处理新的输入数据。
  • 运营:将分析模型部署到生产环境。
  • 监控:观察分析模型的输出。这里包含了两部份内容:在达到某个阈值时发送告警(业务层面的监控);保持结果的准确性和度量指标的质量(分析模型的监控)。
  • 持续循环:重复上述步骤来改进分析模型,能够经过手动批次的方式来完成,也能够在线完成,在新事件达到时更新模型。

整个团队在一开始就要在一块儿工做,并考虑以下问题:

  • 它须要在生产环境有怎样的表现?
  • 生产环境系统支持哪些技术?
  • 如何监控模型的推理和性能?
  • 是构建一个完整的机器学习基础设施仍是使用已有的框架来分离模型训练和模型推理?

例如,一个数据科学家开发出一个 Python 程序,建立了一个精确度很是高的模型,但若是你没法将它部署到生产环境(由于它没法伸缩也没法表现得如预期同样),它就毫无用处。这个时候,或许你已经能够意识到为何 Apache Kafka 如此适合用在生产环境的分析模型上。

机器学习和 Apache Kafka 架构参考


 在了解了机器学习开发生命周期以后,接下来咱们来看一个用于构建、营运和监控分析模型的架构参考:

该架构的核心之处在于它使用 Kafka 做为各类数据源、模型构建环境以及生产环境应用程序之间的媒介

用于构建模型的特征数据从各个应用程序和数据库流入 Kafka。模型构建环境能够是一个数据仓库一个大数据环境(如 Spark 或 Hadoop)或者一个运行 Python 脚本的服务器。模型能够被部署在某个地方,只要生产环境的应用程序可以访问到它们,并把它们应用在输入样本数据上。生产环境的应用程序能够从 Kafka 数据管道接收数据,或者使用 Kafka Streams API。

Kafka 成为整个系统的中枢神经,这也带来了以下好处

  • 数据管道变得更简单的了
  • 分析模型的构建和服务之间再也不耦合
  • 根据具体状况使用实时模式或批处理模式
  • 分析模型能够被部署到高性能、可伸缩的任务关键型环境里

除了 Kafka 自己,还能够加入 Kafka 生态系统的其余开源组件,如 Kafka Connect、Kafka Streams、Confluent REST Proxy、Confluent Schema Registry 或者 KSQL,而不只仅是使用 Kafka Producer 和 Consumer API。

 

机器学习开发生命周期示例


   如今咱们来深刻了解一个围绕 Kafka 构建的机器学习架构示例:

  

  • 在绿色区域,咱们能够看到用于构建和验证分析模型的组件。在橙色区域,咱们能够看到流式平台,分析模型就部署在该平台上,用于对新事件作出推理以及执行监控。
  • 数据生产者持续地发送事件,分析平台以批次或实时的方式接收这些数据,而后使用机器学习算法来构建分析模型

  • 分析模型被部署在流式平台上,流式平台将分析模型应用在事件上,从而推理出结果(也就是预测),最后结果被发送给数据消费者

在这个例子里,咱们将模型训练和模型推理分离开,这在当今的大部分机器学习项目中是很常见的作法。

  • 模型训练:  数据经由 Kafka 集中到 Hadoop 集群上,进而使用 H2O.ai 分析这些历史数据,构建出神经网络。数据科学家可使用各类接口来完成这项工做——R 语言、Python、Scala、Web UI Notebook 等。模型的构建和验证就发生在 Hadoop 集群上,最后获得一个 Java 字节码形式的分析模型,接下来就能够将它们部署到生产环境。
  • 模型推理:神经网络被部署到 Kafka Streams 应用程序里。Streams 应用程序能够运行在任何地方,它能够做为单独的 Java 进程运行,也能够运行在 Docker 容器里或 Kubernetes 集群上。模型被实时地应用在每个新生成的事件上。Kafka Streams 借助 Kafka 集群为咱们提供了可伸缩、任务关键型的分析模型操做以及高性能的模型推理。

  • 在线模型训练:除了分离模型训练和模型推理,咱们也能够为在线模型训练构建一个完整的基础设施。不少巨头科技公司(好比 LinkedIn)在过去就将 Apache Kafka 做为模型的输入、训练、推理和输出的基础。固然,这种作法存在一些权衡。大部分传统的公司会使用第一种方案,它能够知足现今大部分的使用场景。

  • 模型监控和告警:将分析模型部署到生产环境只是第一步,对模型的准确性、分数、SLA 和其余度量指标进行监控并自动实时地发出告警也一样重要。度量指标能够经过 Kafka 反馈给机器学习工具,用于改进模型。使用 H2O.ai 开发分析模型

如下是使用 H2O 来构建分析模型的例子。H2O 是一个开源的机器学习框架,它在内部使用了其余框架,如 Apache Spark 或 TensorFlow。数据科学家能够在上面使用他们喜欢的编程语言,如 R 语言、Python 或 Scala。H2O 引擎会生成 Java 字节码,能够很方便地经过 Streams 进行伸缩。

下面是使用 H2O.ai Flow(Web UI 或 Notebook)和 R 语言构建分析模型的截图:

  

 

输出的是一个字节码形式的分析模型,它能够直接部署到任务关键型的生产环境里。所以,咱们就再也不须要花时间去考虑如何将 Python 或 R 生成的模型“移植”到基于 Java 平台的生产系统里。

这个例子使用 H2O 来产生 Java 字节码,固然,你也可使用其余框架(如 TensorFlow、Apache MXNet 或 DeepLearning4J)完成相似的工做。

使用 Kafka Steams API 部署分析模型


 使用 Kafka Streams 来部署分析模型很是简单,只要将模型添加到基于 Streams 构建的应用程序里就能够了,而后将其应用在新生成的事件上。

由于 Kafka Streams 应用程序实际上用到了 Kafka 的特性,因此已经具有了伸缩性和任务关键型用途,不须要对模型作出任何调整。 例子的代码能够在 GitHub 上找到: https://github.com/kaiwaehner/kafka-streams-machine-learning-examples  拉取项目代码,运行 maven 构建命令,就能够看到 H2O 模型是如何与 Kafka Streams 应用集成在一块儿的。后续咱们会不断扩充这个例子,加入更多复杂的应用场景,不只使用 H2O,还会加入 TensorFlow 和 DeepLearning4J。

借助一些 CI/CD 工具,如 Maven、Gradle、Chef、Puppet、Jenkins,机器学习与流式处理相结合的方式能够很容易地被集成到自动化持续集成工做流当中。

使用开放标准在训练和推理之间共享分析模型


 如下是其余一些用于在数据科学家之间共享和更新模型以及 DevOps 团队部署模型的方式。

  • 原生模型(Native Model):直接将模型部署到流式处理引擎里,好比经过 JNI 将 Python 模型部署到 Java 应用程序里
  • 字节码生成(Generated Code):无论使用哪种编程语言来构建模型,均可以经过生成二进制库或源代码的方式将它们部署到流式处理应用里。它们通过优化,能够得到更好的性能。例如,数据科学家使用 R 语言或 Python 训练的模型能够转成 Java 字节码的形式。
  • 外部服务器(External Server):以请求和响应的方式调用外部的分析服务器。外部调用能够经过 SAS、MATLAB、KNIME 或 H2O 这类分析工具来完成,它们通常会提供 REST 接口。
  • PMML(预测模型标记语言):这是一种比较古老的 XML 标准,尽管还存在一些局限和不足,一些分析工具仍然在支持它。
  • PFA(可移植分析格式):一种新标准,能够为模型提供预处理,利用了 JSON、Apache Avro,并支持 Hadrian。不过大部分分析工具并无为它提供开箱即用的支持。

以上这些方案之间存在权衡的关系。例如,PFA 带来了独立性和可移植性,但同时也存在一些限制。从 Kafka 角度来看,若是要部署大规模的任务关键型系统,使用 Java 字节码生成的方式会更加合适,由于这种方式具备更高的性能、更容易伸缩,而且更容易嵌入到 Kafka Streams 应用中。同时,在进行模型预测时,它免去了与外部 REST 服务器交互的成本。

结论


 机器学习为行业带来了价值,Kafka 迅速成为不少企业的中枢神经系统。咱们能够借助 Kafka 来:

  • 进行实时的模型推理
  • 监控和告警
  • 在线训练模型
  • 将数据摄取到批次层或分析集群上进行分析模型的训练 

参考:


相关文章
相关标签/搜索