Apache Kafka應用程序中的機器學習和實時分析(第一部分)

在優銳課的java學習分享中,這篇文章探討了構建ML基礎結構的特定部分:在Kafka應用程序中部署分析模型以進行實時預測。

Apache Kafka與機器學習(ML)之間的關係是一個有趣的話題,我在如何使用Apache Kafka在生產中構建和部署可伸縮機器學習以及使用Apache Kafka推動尖端機器學習方面寫了很多。

這篇文章介紹了構建機器學習基礎架構的特定部分:在Kafka應用程序中部署分析模型以進行實時預測。

模型訓練和模型部署可以是兩個單獨的過程。但是,你還可以使用許多相同的步驟進行集成和數據預處理,因爲你經常需要對模型訓練和模型推理執行相同的數據集成,過濾,擴充和聚合。

我們將討論和比較兩種不同的模型部署選項:具有遠程過程調用(RPC)的模型服務器以及將模型本地嵌入到Kafka客戶端應用程序中。我們的示例專門使用TensorFlow,但基本原理也適用於其他機器學習/深度學習框架或產品,例如H2O.ai,Deeplearning4j,Google的雲機器學習引擎和SAS。

TensorFlow —一個用於機器學習/深度學習的開源庫
TensorFlow是一個用於高性能數值計算的開源軟件庫。 其靈活的體系結構允許在從臺式機到服務器集羣到移動和邊緣設備的各種平臺(CPU,GPU,TPU等)上輕鬆部署計算。 它最初由Google的AI組織中的Google Brain團隊的研究人員和工程師開發,爲機器學習和深度學習提供了強大的支持,並在許多領域中得到使用。 TensorFlow是一個完整的生態系統,而不僅僅是一個組件。

鑑於此博文專注於模型服務,我們主要對SavedModel對象感興趣,該對象存儲了經過訓練的模型,並且TensorFlow Serving作爲模型服務器:

SavedModel本質上是一個二進制文件,已使用協議緩衝區(Protobuf)進行了序列化。 用C,Python,Java等生成的類可以加載,保存和訪問數據。 文件格式是人類可讀的TextFormat(.pbtxt)或壓縮的二進制協議緩衝區(.pb)。 圖對象是TensorFlow中計算的基礎。 權重保存在單獨的檢查點文件中。

由於我們專注於TensorFlow模型的部署,因此預先訓練模型的方式並不重要。 你可以利用Cloud ML Engine及其Google Cloud Platform(GCP)生態系統等雲服務和集成管道,也可以構建自己的管道進行模型訓練。 Kafka不僅可以在模型部署中發揮重要作用,而且在數據集成,預處理和監視中也可以發揮關鍵作用。

使用模型服務器和RPC進行流處理

模型服務器可以自我管理,也可以由分析供應商或雲提供商託管。 模型服務器不僅爲模型推理部署和緩存模型,而且還提供附加功能,例如版本控制或A / B測試。 從應用程序到模型服務器的通信通常是通過RPC通過HTTP或gRPC完成的。 對於每一個事件,Kafka應用程序與模型服務器之間都會進行這種請求-響應通信。

有許多型號服務器可用。 你可以從Seldon Server,PredictionIO和Hydrosphere.io等開源模型服務器中進行選擇,也可以利用H2O.ai,DataRobot,IBM或SAS等分析供應商的模型服務器。

本文使用TensorFlow Serving,即TensorFlow的模型服務器。 它可以是自託管的,也可以使用Cloud ML Engine服務。 TensorFlow Serving具有以下特徵:

包含gRPC和HTTP端點
執行模型版本控制而無需更改任何客戶端代碼
計劃將單個推理請求分組爲批,以便聯合執行
優化推理時間以最小化延遲
支持許多可服務項(可服務項是模型或用於提供與模型一起提供的數據的任務):
TensorFlow模型
嵌入
詞彙查詢表
功能轉換
非基於TensorFlow的模型
能夠canarying和A / B測試的

以下是Kafka應用程序與模型服務器之間的通信方式:

The process for implementing a Kafka application is straightforward. 實施Kafka應用程序的過程非常簡單。 以下是Kafka Streams應用程序和RPC到TensorFlow服務的代碼段:

1.導入Kafka和TensorFlow服務API:
Java

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 Streams應用程序:
Java

// Configure Kafka Streams Application
final String bootstrapServers = args.length > 0 ? args[0] : "localhost:9092";
final Properties streamsConfiguration = new Properties();
// Give the Streams application a unique name. The name must be unique
// in the Kafka cluster against which the application is run.
streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "kafka-streams-tensorflow-serving-gRPC-example");
// Where to find Kafka broker(s).
streamsConfiguration.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);

3.執行RPC進行TensorFlow服務(如果RPC失敗,則捕獲異常)
Java

KStream<String, Object> transformedMessage = imageInputLines.mapValues(value -> {

            System.out.println("Image path: " + value);


            imagePath = value;


            TensorflowObjectRecogniser recogniser = new TensorflowObjectRecogniser(server, port);


            System.out.println("Image = " + imagePath);

            InputStream jpegStream;

            try {

                jpegStream = new FileInputStream(imagePath);

                

                // Prediction of the TensorFlow Image Recognition model:

                List<Map.Entry<String, Double>> list = recogniser.recognise(jpegStream);

                String prediction = list.toString();

                System.out.println("Prediction: " + prediction);

                recogniser.close();

                jpegStream.close();

   

                                 return prediction;

            } catch (Exception e) {

                e.printStackTrace();

      

                                 return Collections.emptyList().toString();

            }


        });

4.啓動Kafka應用程序:
Java

// Start Kafka Streams Application to process new incoming images from the Input Topic
final KafkaStreams streams = new KafkaStreams(builder.build(), streamsConfiguration);
streams.start();

文章寫到這裏,下次再更新第二章節。

喜歡這篇文章的可以點個贊,歡迎大家留言評論,記得關注我,每天持續更新技術乾貨、職場趣事、海量面試資料等等
如果你對java技術很感興趣也可以加入我的java學習羣 V–(ddmsiqi)來交流學習,裏面都是同行,驗證【CSDN2】有資源共享。
不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章