模型服务:流处理与使用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 ”。

要做的事

  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

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

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

相关文章

electronjs MySQL,javascript – 在Electron应用程序中使用sql.js.

我是Electron的新手.它非常棒,而且入门非常有趣而且非常简单.一段时间以来,我一直试图找到一个在我的应用程序中使用的“数据库”解决方案.当然有Web SQL /本地存储选项,但我试图使用SQLite.我找到了sql.js,它很棒且易于使用.我可以让一切正常运行放我无法保存/更新数据库文件&…

php ajax mysql 出错,MySql + PHP + Ajax的乱码问题的解决方案

现如今,基本的web2.0应用都会涉及到表现层、业务层、数据层等多个层次。在数据的来回传递中,新手一不注意就会产生汉字的乱码问题。汉字乱码主要是由于各层使用的编码、或在层间进行数据传输时使用的编码不一致造成的,釜底抽薪的解决办法就是…

读取csv文件 java_Java:逐步读取/流式传输CSV文件

读取csv文件 java我一直在做一些涉及读取CSV文件的工作,而我一直在使用OpenCSV ,而我的最初方法是逐行读取文件,解析内容并将其保存到地图列表中。 当文件的内容适合内存时,此方法有效,但对于较大的文件来说是个问题&…

php+数组转换函数是,php数组与字符串的转换函数大全

4.在字符串种中查找另外一个字符使用strpos()或strstr()函数strpos() 函数返回字符串在另一个字符串中第一次出现的位置。如果没有找到该字符串,则返回 false。语法://string为必须,表示被搜索的字符串//find为必须,表示被查找的字…

拥抱模块化Java平台:Java 10上的Apache CXF

Java 9版本终于将Project Jigsaw交付给大众已经过去了一年多的时间。 这是一段漫长的旅程,但是在那里,所以发生了什么变化? 这是一个很好的问题,答案并不明显和直接。 总的来说, 拼图项目是一种颠覆性的变化&#xff…

matlab sym转str,sym struct 转换

描述:用 sym() 生成了 矩阵; 再用 solve() 结果返回 结构体,还带sym 型。。。尝试:用 struct 转换 ; eval() 什么的 都无解,, (结构体还带sym。。。。昏了)求:怎…

php $r,PHP

本文实例为大家分享了php微信跳一跳的具体代码,供大家参考,具体内容如下 ?php require config.php; function similar($rgb1, $rgb2) { $r1 ($rgb1 16) $g1 ($rgb1 8) $b1 $rgb1 $r2 ($rgb2 16) $g2 ($rgb2 8) $b2 $rgb2 return abs($r1 - $r2) 1…

java 字符串对齐_最佳字符串对齐的Java实现

java 字符串对齐有一阵子,我使用了Levenshtein distance的Apache Commons lang StringUtils实现。 它实现了一些众所周知的技巧,通过仅挂接到两个数组而不是为备忘录表分配巨大的nxm表来使用较少的内存。 它还仅检查宽度为2 * k 1的“条带”,…

zabbix可以监控什么php,zabbix监控php

通过启用php-fpm的status页面,使用zabbix来获取各数据参数以达到监控php-fpm性能状态php-fpm配置配置文件php-fpm.confpm.status_path /fpmstatusping.path /fpmpingping.response pongnginx配置在配置的server内添加locationlocation ~ ^/(fpmstatus|fpmping) {…

建立无服务器的“ Hello World”功能

无服务器 ,功能即服务(FaaS)或仅具有云功能,就可以编写将在云中运行的代码。 您可以使用多种不同的语言(例如JavaScript(Node.js),Swift,Python,Java&#xf…

oracle 10g 分区管理,Oracle 10g分区表的自动维护

Oracle 10g分区表不支持自动化管理,一般都要手动创建分区,手动删除。今天给大家带来了一个自动化管理表空间的脚本。本脚本主要由3个部分组成:sys_ConfigTable.sql、sys_pro_AddAndDropPartition.sql、sys_pro_MergeTable.sql1、sys_ConfigTa…

Oracle12如何重装,Oracle怎么重新安装?

实现方法:1、 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务。2、 开始->程序->Oracle - OraHome81&#xff…

java实现metro风格_Metro风格的Java组合框(JMetro)–重新介绍

java实现metro风格我上一篇关于JMetro的文章–我的都市风格的Java皮肤(或外观)是关于日历选择器控件的 。 我本打算使用Tom Eugelink不错的日历选择器,但当时我了解到它是由Oracle创建并随Java 8一起提供的,因此出于时间的考虑&am…

Istio的网络API解释了

Istio 1.0版附带一个网络API,该API包含许多功能并涵盖了各种情况。 联网API在最近几个月中得到了发展,并且可能无法立即说明。 该API的概念和构建块是什么,以及如何使用各个Istio资源类型来通过我们的服务网格路由流量? 尽管文档…

toad查看oracle的plsql包,Oracle logminer 分析redo log(TOAD与PLSQL)

Oracle logminer 分析redo logOracle 11g r2 RAC centos 6.5设置时间格式select to_char(sysdate,yyyy-mm-dd hh24:mi:ss) date_format from dual ;查看数据库是否开启补全日志功能selectSUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI,SUPPLEM…

php里面的mark,PHP CommonMarkCQL 用法 手册 | 示例代码

简介CommonMark Query Language is a DSL for describing how to travel through a CommonMark Node tree implemented as a parser and compiler for a small set of instructions, and a virtual machine for executing those instructions.Paths:In its most simplistic for…

spring 面向接口编程_Spring面向方面的编程

spring 面向接口编程介绍 在理想的面向对象系统中,我们希望将每个对象设计为执行一项特定任务。 但是,除了执行其主要任务之外,对象还执行被动任务,例如日志记录,事务,安全性,缓存等。这些被动活…

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

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

概率

概率 概率质量函数(probability mass function, PMF)针对的是离散变量 常见的离散随机变量分布的PMF函数:伯努利分布,二项分布,泊松分布。 概率密度函数(probability density function, PDF)针…

oracle impdp导入时卡住,Oracle:impdp导入等待statement suspended, wait error to be cleared

用数据泵impdp往开发数据库导数据,但导入到INDEX时感觉卡住不动了Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX----查看状态,Completed Objects: 33一直没有变化。Import> statusJob: SYS_IMPORT_FULL_01Operation: IMPORTMode: FULLStat…