模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST
機(jī)器學(xué)習(xí)/深度學(xué)習(xí)模型可以通過(guò)不同的方式進(jìn)行預(yù)測(cè)。 我的首選方法是將分析模型直接部署到流處理應(yīng)用程序(如Kafka Streams或KSQL )中。 您可以例如使用TensorFlow for Java API 。 這樣可以實(shí)現(xiàn)最佳延遲和外部服務(wù)的獨(dú)立性。 在我的Github項(xiàng)目中可以找到幾個(gè)示例: 使用TensorFlow,H2O.ai,Deeplearning4j(DL4J)在Kafka Streams微服務(wù)中進(jìn)行模型推斷 。
但是, 直接部署模型并不總是可行的方法 。 有時(shí)有意義或需要在另一個(gè)服務(wù)基礎(chǔ)架構(gòu)中部署模型,例如TensorFlow Serving for TensorFlow模型。 然后通過(guò)RPC /請(qǐng)求響應(yīng)通信完成模型推斷。 組織或技術(shù)原因可能會(huì)迫使這種方法。 或者,您可能希望利用內(nèi)置功能來(lái)管理模型服務(wù)器中的不同模型并對(duì)其進(jìn)行版本控制。
因此,您將流處理與RPC /請(qǐng)求-響應(yīng)范例結(jié)合在一起。 該體系結(jié)構(gòu)如下所示:
諸如TensorFlow Serving之類(lèi)的外部模型服務(wù)基礎(chǔ)架構(gòu)的優(yōu)點(diǎn):
- 與現(xiàn)有技術(shù)和組織流程的簡(jiǎn)單集成
- 如果您來(lái)自非流媒體世界,則更容易理解
- 以后也可以遷移到真實(shí)流
- 內(nèi)置用于不同模型和版本控制的模型管理
缺點(diǎn):
- 作為遠(yuǎn)程呼叫而不是本地推斷的更糟糕的延遲
- 沒(méi)有離線推斷(設(shè)備,邊緣處理等)
- 將Kafka Streams應(yīng)用程序的可用性,可伸縮性以及延遲/吞吐量與RPC接口的SLA耦合在一起
- Kafka處理未涵蓋的副作用(例如,發(fā)生故障時(shí))(例如,恰好一次)
使用Apache Kafka,Kafka Streams和TensorFlow服務(wù)將流處理和模型服務(wù)器結(jié)合在一起
我創(chuàng)建了Github Java項(xiàng)目“ TensorFlow Serving + gRPC + Java + Kafka Streams ”,以演示如何使用Apache Kafka,Kafka Streams和使用TensorFlow Serving部署的TensorFlow模型進(jìn)行模型推斷 。 這些概念與其他ML框架和Cloud Providers非常相似,例如,您還可以將Google Cloud ML Engine用于TensorFlow(在后臺(tái)使用TensorFlow Serving)或Apache MXNet和AWS模型服務(wù)器 。
大多數(shù)用于模型服務(wù)的ML服務(wù)器也可擴(kuò)展為服務(wù)其他類(lèi)型的模型和數(shù)據(jù),例如,您也可以將非TensorFlow模型部署到TensorFlow服務(wù)。 許多ML服務(wù)器可用作云服務(wù)并用于本地部署。
TensorFlow服務(wù)
讓我們快速討論TensorFlow服務(wù) 。 它可以用來(lái)托管您訓(xùn)練有素的分析模型。 與大多數(shù)模型服務(wù)器一樣,您可以通過(guò)請(qǐng)求-響應(yīng)范例進(jìn)行推理。 gRPC和REST / HTTP是使用的兩種常見(jiàn)技術(shù)和概念。
博客文章“ 如何使用TF Serving將TensorFlow模型部署到生產(chǎn)中 ”很好地解釋了如何將經(jīng)過(guò)訓(xùn)練的TensorFlow模型導(dǎo)出和部署到TensorFlow Serving基礎(chǔ)架構(gòu)。 您可以在任何地方部署自己的基礎(chǔ)架構(gòu),也可以利用Google Cloud ML Engine等云服務(wù)。 TensorFlow推薦使用SavedModel的格式來(lái)保存模型,這是使用TensorFlow Serving或在Goodle Cloud ML Engine上部署經(jīng)過(guò)訓(xùn)練的TensorFlow模型所需的格式。
TensorFlow Serving的架構(gòu)概述中詳細(xì)描述了核心架構(gòu):
這種體系結(jié)構(gòu)允許部署和管理不同模型以及這些模型的版本,包括A / B測(cè)試之類(lèi)的附加功能。 在下面的演示中,我們僅部署一個(gè)單一的TensorFlow模型進(jìn)行圖像識(shí)別(基于著名的Inception神經(jīng)網(wǎng)絡(luò))。
演示:使用RPC混合流處理:TensorFlow服務(wù)+ Kafka流
免責(zé)聲明:以下是該步驟的簡(jiǎn)化版本。 有關(guān)包括源代碼和腳本的完整示例,請(qǐng)轉(zhuǎn)到我的Github項(xiàng)目“ TensorFlow Serving + gRPC + Java + Kafka Streams ”。
要做的事
步驟1:創(chuàng)建一個(gè)TensorFlow模型并將其導(dǎo)出為'SavedModel'格式
我只是簡(jiǎn)單地添加了一個(gè)使用TensorFlow構(gòu)建的現(xiàn)有預(yù)訓(xùn)練圖像識(shí)別模型。 您只需要使用TensorFlow的API導(dǎo)出模型,然后使用導(dǎo)出的文件夾。 TensorFlow使用Protobuf來(lái)存儲(chǔ)模型圖并添加神經(jīng)網(wǎng)絡(luò)權(quán)重的變量。
Google ML Engine展示了如何使用“ ML Engine入門(mén)指南 ”創(chuàng)建簡(jiǎn)單的TensorFlow模型以進(jìn)行普查。 在第二步中,您可以按照指南“ 使用Flowers數(shù)據(jù)集進(jìn)行圖像分類(lèi)”,使用 “轉(zhuǎn)移學(xué)習(xí)”構(gòu)建更高級(jí)的圖像識(shí)別示例。
您還可以將云服務(wù)和本地服務(wù)相結(jié)合,例如,使用Google ML Engine構(gòu)建分析模型,然后像我們一樣使用TensorFlow Serving在本地部署它。
步驟2:安裝并啟動(dòng)TensorFlow Serving Server +部署模型
提供不同的選項(xiàng)。 在Mac上安裝TensforFlow在2018年年中仍然很痛苦。apt-get在Linux操作系統(tǒng)上更容易工作。 不幸的是,您無(wú)法在Mac上使用“ brew”命令或簡(jiǎn)單的zip文件。 備擇方案:
- 您可以使用Bazel構(gòu)建系統(tǒng)來(lái)構(gòu)建項(xiàng)目并編譯所有內(nèi)容 –從字面上看,這將永遠(yuǎn)(在我的筆記本電腦上)花費(fèi)很多時(shí)間。
- 通過(guò)Docker容器安裝和運(yùn)行TensorFlow Serving 。 這也需要構(gòu)建項(xiàng)目。 此外,文檔不是很好并且過(guò)時(shí)。
- 初學(xué)者的首選選項(xiàng)=>使用帶有TensorFlow Serving的預(yù)構(gòu)建Docker容器 。 我使用了Thamme Gowda的示例 。 構(gòu)建項(xiàng)目不僅包含TensorFlow Serving Docker映像,而且還展示了如何在Java應(yīng)用程序和TensorFlow Serving之間進(jìn)行g(shù)RPC通信的示例,他對(duì)此表示贊揚(yáng)。
如果您要使用自己的模型,請(qǐng)閱讀指南“將TensorFlow模型部署到TensorFlow服務(wù) ”。 或者使用云服務(wù),例如查看“ Google ML Engine入門(mén) ”。
步驟3:建立Kafka叢集和Kafka主題
創(chuàng)建一個(gè)本地Kafka環(huán)境(Apache Kafka代理+ Zookeeper)。 最簡(jiǎn)單的方法是開(kāi)源Confluent CLI ,它也是Confluent開(kāi)源和Confluent Enteprise平臺(tái)的一部分。 只需輸入“ confluent start kafka ”即可。
您也可以使用Kafka即服務(wù)創(chuàng)建集群。 最好的選擇是Confluent Cloud – Apache Kafka即服務(wù) 。 您可以在Confluent Cloud Professional上進(jìn)行“游玩”,也可以在AWS,GCP或Azure上進(jìn)行Confluent Cloud Enterprise進(jìn)行任務(wù)關(guān)鍵型部署,包括99.95%SLA和高達(dá)2 GB /秒的超大吞吐量。 第三種選擇是在內(nèi)部或在云中連接到現(xiàn)有的Kafka集群(請(qǐng)注意,在構(gòu)建項(xiàng)目之前,您需要在Kafka Streams Java代碼中更改代理URL和端口)。
接下來(lái),為該示例創(chuàng)建兩個(gè)Kafka主題(“ ImageInputTopic”用于圖像的URL,而“ ImageOutputTopic”用于預(yù)測(cè)結(jié)果):
步驟4構(gòu)建和部署Kafka Streams應(yīng)用+發(fā)送測(cè)試消息
Kafka Streams微服務(wù)(即Java類(lèi)) “ Kafka Streams TensorFlow服務(wù)gRPC示例”是Kafka Streams Java客戶(hù)端。 微服務(wù)使用gRPC和Protobuf與TensorFlow Serving服務(wù)器進(jìn)行請(qǐng)求-響應(yīng)通信,以進(jìn)行模型推斷以預(yù)測(cè)圖像的內(nèi)容。 請(qǐng)注意,Java客戶(hù)端不需要任何TensorFlow API,而只需gRPC接口。
本示例執(zhí)行Java main方法,即,它啟動(dòng)運(yùn)行Kafka Streams微服務(wù)的本地Java進(jìn)程。 它持續(xù)等待新事件到達(dá)“ ImageInputTopic”以進(jìn)行模型推斷(通過(guò)對(duì)TensorFlow Serving的gRCP調(diào)用),然后將預(yù)測(cè)結(jié)果實(shí)時(shí)發(fā)送至“ ImageOutputTopic”(以毫秒為單位)。
同樣,您可以在任何地方(包括Kubernetes(例如,內(nèi)部OpenShift集群或Google Kubernetes Engine),Mesosphere,Amazon ECS或什至在Java EE應(yīng)用程序中)部署此Kafka Streams微服務(wù),并動(dòng)態(tài)地進(jìn)行放大和縮小。
現(xiàn)在發(fā)送消息,例如使用kafkacat ,并使用kafka-console-consumer消耗預(yù)測(cè)。
再一次,如果您想查看源代碼和腳本,請(qǐng)轉(zhuǎn)到我的Github項(xiàng)目“ TensorFlow Serving + gRPC + Java + Kafka Streams ”。
翻譯自: https://www.javacodegeeks.com/2018/07/model-serving-stream-processing.html
總結(jié)
以上是生活随笔為你收集整理的模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 波兰一公司聘请人工智能机器人当 CEO:
- 下一篇: 读取csv文件 java_Java:逐步