全文共8336字,预计学习时长24分钟
来源:Pexels
Apache Kafka和机器学习的关系很微妙。
本文旨在讨论建立机器学习框架的一个特定部分:在Kafka应用程序中部署一个分析模型来进行实时预测。
模式训练和模型部署可以是两个独立的过程。但是相同的步骤也可应用于数据集成和数据预处理,因为模型训练和模型推导需要呈现同样的数据集成、过滤、充实和聚合。
本文将讨论和比较两种模型部署的不同选择:有RPC的服务端模型(RPCs)和本地嵌入Kafka客户端应用的模型。本文的例子特地使用了TensorFlow,但是相关原则对其他机器学习/深度学习框架或者产品同样适用。这些框架和产品包括H2O.ai,Deeplearning4j,谷歌云端机器学习引擎和统计分析系统(SAS)。
TensorFlow — 机器学习/深度学习的开源软件库
Tensorflow是一个为高效计算打造的开源软件库.它灵活的架构让多个平台(cpu、gpu、TPUs等)间的计算部署变得更加容易,应用范围从桌面到服务器集群再到移动和边缘设备。该软件由谷歌人工智能组织的研发团队研究员和工程师开发,作为机器学习和深度学习的强力支持,Tensorflow应用于多个领域,是一个完整的生态系统而不是一个孤立的元件。
鉴于本文聚焦于模型服务,主要对保存和加载模型感兴趣。保存和加载模型就是存储训练模型,并将Tensorflow作为模型服务器。
存储模型本质上是一个二进制文件,使用协议缓冲区(Protobuf)序列化。接着模型在C,Python,Java等软件中分类数据、加载数据、存储和处理数据。文件格式是可读的文本格式(.pbtxt)或压缩的二进制协议缓冲区(.pb)。图表对象是在TensorFlow中进行计算的基础。权重保存在单独的TensorFlow检查点文件中。
由于本文关注的是TensorFlow的模型部署,因此如何预训练模型并不重要。可以利用云端服务和像云端机器学习引擎和其谷歌云端平台(GCP)的集成管线,或者建立自己的模型训练途径。Kafka不但在模型部署方面很重要,在数据集成、数据预处理和数据监控方面也扮演重要角色。
使用模型服务器和RPC进行流处理
模型服务器可以自我管理,也可以由分析或者云端供应商托管。模型服务器并不仅为模型推导部署和存储模型,而且还提供诸如版本控制或A/B测试之类的附加功能。从应用程序到模型服务器的交流经常通过请求-响应协议(HTTP)或者谷歌RPC(gRPC)等RPC框架来完成。每次项目运行,都会发生这种介于Kafka应用和模型服务器之间的请求-响应式交流,
有很多模型服务器可供选择。可以从像Seldon Server,PredictionIO,Hydrosphere.io等开源模型服务器中选择或者从H2O.ai,DataRobot,国际商业机器公司(IBM),统计分析系统(SAS)等分析供应商中利用模型服务器。
本文使用TensorFlow提供的服务,即来自TensorFlow的模型服务器。该模型服务器可以实现自我管理,也可以使用云端机器学习引擎服务。TensorFlow服务拥有以下特征。
·包含谷歌RPC(gRPC)和请求-响应协议终端(HTTP)
·呈现模型版本,无需改变客户端代码
·将单个模型推导请求分组,以便联合执行请求
·优化模型推导时间以便最小化延迟
·支持许多可服务项(可服务项是一个模型或者是一个和模型一起提供数据的任务)
o TensorFlow 模型
o 嵌入函数
o 词汇查找表格
o 特征转换
o 不基于TensorFlow的模型
·有能力开展金丝雀发布及A/B测试
下图是Kafka应用和模型服务器的交流过程
执行Kafka应用的过程是直接的。下面是Kafka应用数据流的代码片段以及TensorFlow服务端的RPC。
1.输入Kafka以及TensorFlow服务API
import org.apache.kafka.common.serialization.Serdes;import org.apache.kafka.streams.KafkaStreams;import org.apache.kafka.streams.StreamsBuilder;import org.apache.kafka.streams.StreamsConfig;import org.apache.kafka.streams.kstream.KStream;
import com.github.megachucky.kafka.streams.machinelearning.TensorflowObjectRecogniser;
2.配置Kafka数据流应用
// Configure Kafka Streams ApplicationfinalString bootstrapServers = args.length >