kafka grpc_模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST

kafka grpc

机器学习/深度学习模型可以通过不同的方式进行预测。 我的首选方法是将分析模型直接部署到流处理应用程序(如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 Serving的流处理和模型服务器的组合

我创建了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 ”。

要做的事

  1. 安装并启动ML服务引擎
  2. 部署预建的TensorFlow模型
  3. 创建Kafka集群
  4. 实施Kafka Streams应用程序
  5. 部署Kafka Streams应用程序(例如,在笔记本电脑上本地或Kubernetes集群上)
  6. 生成流数据以测试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

kafka grpc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux命令gitview,使用linux的gitview命令查看文件内容

使用linux的gitview命令查看文件内容发布时间:2020-07-22 10:23:42来源:亿速云阅读:99作者:清晨栏目:服务器这篇文章将为大家详细讲解有关使用linux的gitview命令查看文件内容,小编觉得挺实用的&#xff0c…

通过 PL/SQL Developer 建表

点击菜单栏的【文件】-【新建】-【表】,如下图所示:

nutshell_Nutshell中的Java 8语言功能-第2部分

nutshell编者注:您也可以在此处检查Part-1。 嗨,朋友,这是简明系列的Java 8语言功能的第2部分。 在这里,我们将讨论Java 8的以下功能: 接口中的静态方法 流 1.接口中的静态方法 什么是静态方法? 静态方…

Windows 7 下安装 Oracle 数据库和 PL/SQL Developer

win7下无论是32bits还是64bits,建议只安装oracle 11g 32bits,然后直接安装pl/sql developer,不需要额外的配置,就可以通过pl/sql developer来访问数据库了,如果真要配置,就是配置下pl/sql developer的连接&…

linux临时文件创建失败,-bash: 无法为立即文档创建临时文件: 设备上没有空间

Linux在使用中,突然出现空间不足情况,解决步骤大致为先清除进程,再删除文件一、进程状况1、查看磁盘空间和使用情况(​“df -h”显示目前磁盘空间和使用情况。 “df -i” 以inode模式来显示磁盘使用情况。)# df -h2、查看清理进程/# lsof | g…

机器学习java_Java机器学习,第1部分

机器学习java您搜索了某种导出机器学习模型的方法,以便可以将它们用于评估数据,并且可以将它们导出为PMML格式。 您实际上是在Java生态系统中工作的,但没有动机为它编写PMML库或rest api。 然后,我将向您推荐LightningScorer &…

MySQL 如何实现 Oracle 的 row_number() over() 分组排序功能

文章目录Oracle 的分组排序MySQL 的分组排序分析需求创建模拟数据SQL 实现结果演示Oracle 的分组排序 Oracle 的分组排序函数的语法格式如下: ROW_NUMBER() OVER([PARTITION BY column_1, column_2,…][ORDER BY column_3,column_4,…] )说明:表示根据…

linux mac地址文件夹,android4.4.2系统的mac地址文件在哪个文件里面

android 是Linux内核,linux中mac地址是保存在/etc/init.d/networ 文件中的但是在android中mac地址是直接写在硬件中的,需要通过API 才能获取1、Android 获取本机Mac 地址方法:需要在AndroidManifest.xml文件中添加权限:public String getLocalMacAddress…

Windows 如何用命令终端(CMD)启动和停止 MySQL 数据库服务

当安装完 MySql 后,默认每次 Windows 启动的时候都会将 MySql 服务启动起来。那么如何通过命令方式来启动和停止 MySQL 服务呢? Windows XP 如果是 Windows XP 则不需要使用管理员权限既可以很简单的启动和停止 MySQL 数据库服务,具体在命令…

java与java ee_Java EE MVC:处理表单验证

java与java ee在本文中,我们将介绍Java EE MVC中的表单验证。 Java EE MVC与Java Bean验证API( JSR 303 )集成在一起,这使得添加验证约束变得非常容易。 使用JAX-RS方式进行验证 假设我们有一个小的html表单,可用于发…

linux-macbook内核,技术|用 Linux 让旧 MacBook 重获新生

花上一小时,用 Fedora 让一台过时的 Mac 重新有用。最近,我偶然找到了一台 2011 年底的老款 13 英寸 MacBook Pro,有 125GB SSD 和 8GB 内存。我曾带着这台机器去世界各地旅行,当年,我开了很多场会议、研讨会或演示&am…

Windows 如何在命令终端(CMD)使用命令来访问本地/远程的 Oracle 数据库呢?

打开命令窗口后直接输入 sqlplus sys/123orcl as sysdba其中 sys 是用户名,123 是密码,orcl 是数据库实例名,as sysdba 表示用户 sys 是数据库管理员。 没有指定数据库实例名,那么访问默认的数据库实例,如果用户 sys…

linux消耗ram内存吗,linux - 释放Ubuntu 8.04服务器上的内存(RAM) - Ubuntu问答

问题描述我在带有某些轻量级服务器应用程序的Slicehost虚拟服务器上运行了Ubuntu 8.04-apache22,svnserve,mysql和proftpd。唯一严重的服务限制是RAM-我要支付256MB。我注意到,如果让系统运行几天/几周,则可用RAM的数量会缓慢下降…

java 读取集合到流中_Java 10:将流收集到不可修改的集合中

java 读取集合到流中Java 10引入了几种新方法来促进不可修改集合的创建。 List.copyOf &#xff0c; Set.copyOf和Map.copyOf方法从现有实例创建新的集合实例。 例如&#xff1a; List<String> modifiable Arrays.asList("foo", "bar"); List<…

Servlet 组件相关的接口、抽象类关系图

注&#xff1a; ServletConfig 依赖于 Servlet HttpServletResponse 继承自 ServletResponse HttpServlet 实现自 HttpServletResponse 和 HttpServletRequest

java6 已安装更高版本_Java 10及更高版本的思考

java6 已安装更高版本大家好 Java 10于2018年3月20日发布。我认为许多软件团队将阻止升级。 从Java 8到Java 9的专业人员人数可能还更少。为什么会这样&#xff0c;原因是传统的障碍以及对应用程序服务器&#xff0c;框架甚至是云原生容器的依赖。 例如&#xff0c;如果您在等待…

linux 命令api,linux命令行下字典,使用有道API

Linux命令行下的字典&#xff0c;使用“exit”退出。大家简单申请一个key就可以用了。这里申请#!/usr/bin/python3.2import urllib.requestimport jsondef wordMeaning(word):"""Use YouDao API key and the url below, get the JSON formatted information,the…

Java对象转换成JSON对象/JSON对象转换成JSON字符串/JSON字符串转换成JS对象

文章目录后端部分前端部分后端部分 Option op new Option("海淀","hd");//java对象转换json对象 JSONObject obj JSONObject.fromObject(op); //json对象转换成json字符串 String str obj.toString();List<Option> ops new ArrayList<Option…

kafka 消费端 api_在消费者的眼中:您真的需要为您的API提供客户端库吗?

kafka 消费端 apiRESTful Web服务和API的优点在于&#xff0c;任何使用HTTP协议的使用者都可以理解和使用它。 但是&#xff0c;同样的难题一遍又一遍地弹出&#xff1a;您是否应该将Web APis与客户端库一起使用&#xff1f; 如果是&#xff0c;您应该支持哪些语言或/和框架&am…

linux 进程的vss rss uss,内核/内存管理中的VSS/RSS/PSS/USS

转自&#xff1a;http://www.douban.com/note/161471809/RSS is the total memory actually held in RAM for a process.RSS can be misleading, because it reports the total all of the shared libraries that the process uses, eventhough a shared library is only loade…