模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST
机器学习/深度学习模型可以通过不同的方式进行预测。 我的首选方法是将分析模型直接部署到流处理应用程序(如Kafka Streams或KSQL )中。 您可以例如使用TensorFlow for Java API 。 这样可以实现最佳延迟和外部服务的独立性。 在我的Github项目中可以找到几个示例: 使用TensorFlow,H2O.ai,Deeplearning4j(DL4J)在Kafka Streams微服务中进行模型推断 。
但是, 直接部署模型并不总是可行的方法 。 有时有意义或需要在另一个服务基础架构中部署模型,例如TensorFlow Serving for TensorFlow模型。 然后通过RPC /请求响应通信完成模型推断。 组织或技术原因可能会迫使这种方法。 或者,您可能希望利用内置功能来管理模型服务器中的不同模型并对其进行版本控制。
因此,您将流处理与RPC /请求-响应范例结合在一起。 该体系结构如下所示:
诸如TensorFlow Serving之类的外部模型服务基础架构的优点:
- 与现有技术和组织流程的简单集成
- 如果您来自非流媒体世界,则更容易理解
- 以后也可以迁移到真实流
- 内置用于不同模型和版本控制的模型管理
缺点:
- 作为远程呼叫而不是本地推断的更糟糕的延迟
- 没有离线推断(设备,边缘处理等)
- 将Kafka Streams应用程序的可用性,可伸缩性以及延迟/吞吐量与RPC接口的SLA耦合在一起
- Kafka处理未涵盖的副作用(例如,发生故障时)(例如,恰好一次)
使用Apache Kafka,Kafka Streams和TensorFlow服务将流处理和模型服务器结合在一起
我创建了Github Java项目“ TensorFlow Serving + gRPC + Java + Kafka Streams ”,以演示如何使用Apache Kafka,Kafka Streams和使用TensorFlow Serving部署的TensorFlow模型进行模型推断 。 这些概念与其他ML框架和Cloud Providers非常相似,例如,您还可以将Google Cloud ML Engine用于TensorFlow(在后台使用TensorFlow Serving)或Apache MXNet和AWS模型服务器 。
大多数用于模型服务的ML服务器也可扩展为服务其他类型的模型和数据,例如,您也可以将非TensorFlow模型部署到TensorFlow服务。 许多ML服务器可用作云服务并用于本地部署。
TensorFlow服务
让我们快速讨论TensorFlow服务 。 它可以用来托管您训练有素的分析模型。 与大多数模型服务器一样,您可以通过请求-响应范例进行推理。 gRPC和REST / HTTP是使用的两种常见技术和概念。
博客文章“ 如何使用TF Serving将TensorFlow模型部署到生产中 ”很好地解释了如何将经过训练的TensorFlow模型导出和部署到TensorFlow Serving基础架构。 您可以在任何地方部署自己的基础架构,也可以利用Google Cloud ML Engine等云服务。 TensorFlow推荐使用SavedModel的格式来保存模型,这是使用TensorFlow Serving或在Goodle Cloud ML Engine上部署经过训练的TensorFlow模型所需的格式。
TensorFlow Serving的架构概述中详细描述了核心架构:
这种体系结构允许部署和管理不同模型以及这些模型的版本,包括A / B测试之类的附加功能。 在下面的演示中,我们仅部署一个单一的TensorFlow模型进行图像识别(基于著名的Inception神经网络)。
演示:使用RPC混合流处理:TensorFlow服务+ Kafka流
免责声明:以下是该步骤的简化版本。 有关包括源代码和脚本的完整示例,请转到我的Github项目“ TensorFlow Serving + gRPC + Java + Kafka Streams ”。
要做的事
- 安装并启动ML服务引擎
- 部署预建的TensorFlow模型
- 创建Kafka集群
- 实施Kafka Streams应用程序
- 部署Kafka Streams应用程序(例如在笔记本电脑上本地或Kubernetes集群上)
- 生成流数据以测试Kafka流和TensorFlow服务的结合
步骤1:创建一个TensorFlow模型并将其导出为'SavedModel'格式
我只是简单地添加了一个使用TensorFlow构建的现有预训练图像识别模型。 您只需要使用TensorFlow的API导出模型,然后使用导出的文件夹。 TensorFlow使用Protobuf来存储模型图并添加神经网络权重的变量。
Google ML Engine展示了如何使用“ ML Engine入门指南 ”创建简单的TensorFlow模型以进行普查。 在第二步中,您可以按照指南“ 使用Flowers数据集进行图像分类”,使用 “转移学习”构建更高级的图像识别示例。
您还可以将云服务和本地服务相结合,例如,使用Google ML Engine构建分析模型,然后像我们一样使用TensorFlow Serving在本地部署它。
步骤2:安装并启动TensorFlow Serving Server +部署模型
提供不同的选项。 在Mac上安装TensforFlow在2018年年中仍然很痛苦。apt-get在Linux操作系统上更容易工作。 不幸的是,您无法在Mac上使用“ brew”命令或简单的zip文件。 备择方案:
- 您可以使用Bazel构建系统来构建项目并编译所有内容 –从字面上看,这将永远(在我的笔记本电脑上)花费很多时间。
- 通过Docker容器安装和运行TensorFlow Serving 。 这也需要构建项目。 此外,文档不是很好并且过时。
- 初学者的首选选项=>使用带有TensorFlow Serving的预构建Docker容器 。 我使用了Thamme Gowda的示例 。 构建项目不仅包含TensorFlow Serving Docker映像,而且还展示了如何在Java应用程序和TensorFlow Serving之间进行gRPC通信的示例,他对此表示赞扬。
如果您要使用自己的模型,请阅读指南“将TensorFlow模型部署到TensorFlow服务 ”。 或者使用云服务,例如查看“ Google ML Engine入门 ”。
步骤3:建立Kafka丛集和Kafka主题
创建一个本地Kafka环境(Apache Kafka代理+ Zookeeper)。 最简单的方法是开源Confluent CLI ,它也是Confluent开源和Confluent Enteprise平台的一部分。 只需输入“ confluent start kafka ”即可。
您也可以使用Kafka即服务创建集群。 最好的选择是Confluent Cloud – Apache Kafka即服务 。 您可以在Confluent Cloud Professional上进行“游玩”,也可以在AWS,GCP或Azure上进行Confluent Cloud Enterprise进行任务关键型部署,包括99.95%SLA和高达2 GB /秒的超大吞吐量。 第三种选择是在内部或在云中连接到现有的Kafka集群(请注意,在构建项目之前,您需要在Kafka Streams Java代码中更改代理URL和端口)。
接下来,为该示例创建两个Kafka主题(“ ImageInputTopic”用于图像的URL,而“ ImageOutputTopic”用于预测结果):
步骤4构建和部署Kafka Streams应用+发送测试消息
Kafka Streams微服务(即Java类) “ Kafka Streams TensorFlow服务gRPC示例”是Kafka Streams Java客户端。 微服务使用gRPC和Protobuf与TensorFlow Serving服务器进行请求-响应通信,以进行模型推断以预测图像的内容。 请注意,Java客户端不需要任何TensorFlow API,而只需gRPC接口。
本示例执行Java main方法,即,它启动运行Kafka Streams微服务的本地Java进程。 它持续等待新事件到达“ ImageInputTopic”以进行模型推断(通过对TensorFlow Serving的gRCP调用),然后将预测结果实时发送至“ ImageOutputTopic”(以毫秒为单位)。
同样,您可以在任何地方(包括Kubernetes(例如,内部OpenShift集群或Google Kubernetes Engine),Mesosphere,Amazon ECS或什至在Java EE应用程序中)部署此Kafka Streams微服务,并动态地进行放大和缩小。
现在发送消息,例如使用kafkacat ,并使用kafka-console-consumer消耗预测。
再一次,如果您想查看源代码和脚本,请转到我的Github项目“ TensorFlow Serving + gRPC + Java + Kafka Streams ”。
翻译自: https://www.javacodegeeks.com/2018/07/model-serving-stream-processing.html