如何解決數據科學家、數據工程師和生產工程師的阻抗失配問題

構建一個可擴展、可靠和高性能的機器學習(ML)基礎架構並不容易。這比用Python構建一個分析模型要花費更多的精力。

Uber已經爲許多生產中的用例運行了其可擴展和不依賴框架的機器學習平臺Michelangelo,並寫了一個很好的總結:

Michelangelo建立初始,最緊急和影響最高的用例是一些非常高規模的問題,這導致我們圍繞Apache Spark(用於大規模數據處理和模型訓練)和Java(低延遲、高吞吐量的在線服務)構建。這種結構在生產培訓和模型部署方面都表現地很好,但是在開銷、靈活性和易用性方面,特別是在早期的原型設計和實驗中,仍有很多需要改進的地方(這就是Notebook和Python的閃光點)。

Uber將Michelangelo擴展爲“對來自任何來源爲任何類型的Python模型提供服務,以支持其他機器學習和深度學習框架,如PyTorch 和 TensorFlow (而不是隻使用spark進行所有操作)”。

那麼,爲什麼Uber(以及許多其他技術公司)構建了自己的平臺和不依賴框架的機器學習基礎設施呢?

這篇文章關注的是 Kafka生態系統如何幫助解決數據科學家、數據工程師和生產工程師之間的阻抗失配問題。通過利用它構建自己的可擴展機器學習基礎設施並讓數據科學家滿意,你可以解決類似Uber構建自己的ML平臺Michelangelo時所面臨的相同問題。

對大數據以及人工智能概念都是模糊不清的,該按照什麼線路去學習,學完往哪方面發展,想深入瞭解,想學習的同學歡迎加入大數據學習qq羣:458345782,有大量乾貨(零基礎以及進階的經典實戰)分享給大家,並且有清華大學畢業的資深大數據講師給大家免費授課,給大家分享目前國內最完整的大數據高端實戰實用學習流程體系 。從java和linux入手,其後逐步的深入到HADOOP-hive-oozie-web-flume-python-hbase-kafka-scala-SPARK等相關知識一一分享!

數據科學家、數據工程師和

生產工程師之間的阻抗失配

數據科學家、數據工程師和生產工程師之間的阻抗失配是造成公司難以將分析模型投入生產以增加商業價值的主要原因。

下圖說明了作爲機器學習生命週期中阻抗失配的一部分所需的不同步驟和相應角色:

模型開發和模型部署之間的阻抗失配

數據科學家喜歡Python,僅此而已。因此,大多數機器學習/深度學習框架都集中於Python API。最穩定和最前沿的API以及大多數示例和教程都使用Python API。除了支持Python之外,通常也支持其他編程語言,包括用於Web集成的JavaScript和用於平臺集成的Java,儘管這些語言通常具有更少的特性、更不成熟。無論支持其他什麼平臺,數據科學家都很有可能使用Python構建和訓練他們的分析模型。

使用python的模型開發及其工具棧和一個可擴展的、可靠的數據平臺之間存在阻抗失配問題,這種平臺具有低延遲、高吞吐量、零數據丟失和24/7的可用性要求,這些要求是數據接收、預處理、模型部署和大規模監控所必需的。實際上,對於這些需求,Python並不是最著名的技術。然而,對於像Apache Kafka這樣的數據平臺來說,它是一個很好的技術。

問題是,編寫機器學習源代碼以使用Python訓練分析模型,你選擇的機器學習框架只是現實機器學習基礎架構的一小部分。你需要考慮整個模型生命週期。下圖顯示了機器學習系統中隱藏的技術要務(顯示“ML代碼”部分有多小):

因此,你需要對構建到可擴展生產環境中的模型進行訓練和部署,以便可靠地利用它。這可以是圍繞 Kafka生態系統本地構建的,也可以使用 Kafka只是爲了攝取到另一個存儲和處理集羣中,如HDF或帶Spark的AWS S3。Kafka、Spark和其他幾個可擴展的基礎設施之間存在許多權衡,但這一討論超出了本文的範圍。現在,我們將關注 Kafka。

行業中的不同解決方案可以解決數據科學家、數據工程師和生產工程師之間的某些阻抗失配問題。讓我們來看看其中一些選項:

· 官方標準,如開放式神經網絡交換(ONNX)、便攜式分析格式(PFA)或預測模型標記語言(PMML):數據科學家用python構建模型。Java開發人員將其導入Java進行生產部署。這種方法支持不同的框架、產品和雲服務。你不必依賴相同的框架或產品來進行訓練和模型部署。考慮一下ONNX,一個相對較新的深度學習標準——它已經支持TensorFlow、PyTorch和MXNet。這些標準有利弊。有些人喜歡並使用它們;許多人不喜歡。

· 開發人員關注的框架如Deeplearning4j:這些框架是爲軟件工程師構建的,以便在Java平臺上構建整個機器學習生命週期,而不僅僅是模型部署和監控,而且也包括預處理和訓練。如果需要,你仍然可以導入其他模型(例如,Deeplarning4J允許你導入Keras模型)。這個選項很好,如果你有可以掌握Java或b的數據科學家或者有足夠了解機器學習概念並能構建分析模型的軟件工程師。

· 用於構建具有有限機器學習經驗的分析模型的AutoML:這樣,領域專家可以通過點擊按鈕來構建和部署分析模型。AutoML引擎爲其他人提供了一個界面來使用模型進行預測。

· 將模型二進制文件嵌入到應用程序中:模型訓練的輸出是一個分析模型。例如,可以編寫python代碼來訓練和生成TensorFlow模型。根據框架,輸出可以是文本文件、Java源代碼或二進制文件。例如,TensorFlow以Protobuf, JSON和其他文件的形式生成一個模型工件。無論你的機器學習框架的輸出是什麼格式,它都可以嵌入到應用程序中,以便通過框架的API進行預測(例如,你可以通過TensorFlow的Java API從Java應用程序加載TensorFlow模型)。

· 公共雲中的託管模型服務器,如谷歌雲機器學習引擎:雲提供商承擔可用性和可靠性的責任。數據科學家“只是”部署其經過訓練的模型,生產工程師可以訪問它。關鍵的權衡是這需要RPC通信來執行模型推斷。

儘管所有這些解決方案都有助於數據科學家、數據工程師和生產工程師更好地合作,但隱藏的要務中存在着潛在的挑戰:

· 數據收集(即集成)和預處理需要按規模運行

· 對於持續的構建和集成測試,需要共享和自動化配置

· 服務和監控基礎架構需要適合你的整體企業架構和工具棧

那麼 Kafka生態系統在這裏有什麼幫助呢?

Apache Kafka

作爲解決阻抗失配的關鍵成分

在許多情況下,最好向專家提供他們喜歡和熟悉的工具。挑戰是將不同的工具集結合起來,仍然構建一個集成的系統,以及一個連續的、可擴展的機器學習工作流程。因此,在解決數據科學家和開發人員之間的阻抗失配問題時,Kafka並不是具有競爭力的,而是對所討論的替代方案的補充。

數據工程師使用kafka作爲基礎設施,使用python進行集成和預處理語句,構建一個可擴展的集成管道。數據科學家可以使用Python或任何其他首選工具構建他們的模型。生產工程師從數據科學家那裏獲取分析模型(手動或通過任何自動的、連續的集成設置),並將它們嵌入到他們的Kafka應用程序中,以在生產中部署它。或者,團隊一起工作,用Java和一個框架,比如Deeplearning4j構建所有的東西。

任何選項都可以與Apache Kafka很好地匹配。選擇你需要的部分,無論是用於數據傳輸的Kafka核心、用於數據集成的Kafka Connect,還是用於數據預處理的Kafka Streams/KSQL。許多組件可用於模型訓練和模型推理。如下圖所示,編寫一次並在兩種情況下都使用:

利用Apache Kafka生態系統搭建機器學習基礎設施

實時、大規模地監控整個環境也是 Kafka的常見任務。一個巨大的好處是,你只需構建一次高度可靠和可擴展的管道,但將其用於機器學習基礎結構的兩個部分。你可以在任何環境中使用:在雲中,在on-prem數據中心,或者在物聯網設備的邊緣。

假設你想用KSQL構建一條從MQTT到Kafka的集成管道以進行數據預處理,並使用Kafka Connect將數據導入到HDFS, AWS S3或GoogleCloud Storage中,在那裏進行模型訓練。相同的集成管道(或者至少部分集成管道)可以重用來進行模型推理。新的MQTT輸入數據可以直接用於進行實時預測。

我們剛剛解釋了各種解決 Kafka環境中數據科學家和軟件工程師之間阻抗失配的可選擇方法。現在,讓我們在下一節中討論一個特定的選項,這一選項對於數據科學家來說可能是最方便的:利用Jupyter Notebook中的kafka和KSQL語句,並將其與TensorFlow和Keras結合來訓練神經網絡。

數據科學家將Python和Jupyter

與可擴展的流體系結構結合起來

數據科學家使用諸如Jupyter Notebooks之類的工具來分析、轉換、豐富、過濾和處理數據。然後,使用預處理的數據,來訓練基於機器學習/深度學習框架(如Tensorflow)的分析模型。

然而,一些數據科學家甚至不知道軟件工程師的“麪包和黃油”概念,如Github之類的版本控制系統或Jenkins之類的持續集成工具。

這就提出了一個問題,即如何將數據科學家的Python經驗與Apache Kafka作爲一個久經沙場、高度可擴展的數據處理和流媒體平臺的優勢結合起來。

數據科學家和數據工程師

用Apache Kafka和KSQL

Kafka提供了可以與Python一起使用的集成選項,比如Confluent的用於Apache Kafka的Python客戶端或Confluent REST代理用於HTTP集成。但對於習慣於在模型訓練和評估之前快速、對數據進行交互式地分析和預處理的數據科學家來說,這並不是一種真正方便的方法。這裏通常使用快速原型。

通過編寫簡單的類SQL語句進行交互式分析和數據預處理,數據科學家可以查看Kafka事件流,並從其著名且喜愛的python環境(如Jupyter)中實現連續的流處理。

下面的python示例利用開源框架ksql python執行來自Kafka流的交互式查詢,它在KSQL的rest接口上添加了一個python層。下面是從Jupyter筆記本中使用KSQL的幾行Python代碼:

該KSQL的查詢結果是一個Python生成器對象,你可以很容易地用其他Python庫來處理它。這讓人感覺更像是土生土長的Python,類似於Numpy、pandas、scikit-learn和其他廣泛使用的Python庫。

與使用這些庫進行快速原型化類似,你可以使用ksqlpython進行交互式查詢和數據預處理。查看KSQL快速入門和KSQL方法,瞭解如何編寫KSQL查詢,以便輕鬆篩選、轉換、豐富或聚合數據。當KSQL運行連續查詢時,你也可以將其用於交互式分析,如果只想獲得特定數量的行,可以使用ANSI SQL中的“LIMIT”關鍵字。

那有什麼大不了的?你知道通過ksql-python庫KSQL可以感到Python是本機的,但是爲什麼要使用KSQL來代替或添加到你所熟知和喜愛的python庫來分析和處理數據呢?

關鍵的區別在於,這些KSQL查詢也可以在隨後的生產中部署。KSQL爲你提供了Kafka的所有特性,比如高可擴展性、可靠性和故障轉移處理。在Jupyter Notebook中用於交互式分析和預處理的相同KSQL語句可以擴展到每秒數百萬條消息。可允許出錯。數據丟失爲零,語義僅爲一次。這對於將熱愛Python的數據科學家與高度可擴展和可靠的生產基礎設施結合在一起非常重要和有價值。

只是要明確一點:ksql+python並不是所有數據工程任務的全能者,也不會取代現有的Python工具集。但在數據科學家和數據工程師的工具箱中,這是一個很好的選擇,增加了新的可能性,例如隨着源數據的變化實時更新輸入的信息,或者用新的和改進的版本更新部署的模型。

用PythonKSQL和TensorFlow/Keras

進行欺詐檢測的JupyterNotebook

現在讓我們來看一個使用KSQL和Python組合的詳細示例。它包括使用ksql python的高級代碼示例,以及來自python機器學習生態系統的其他廣泛組件,如Numpy、pandas、TensorFlow和Keras。

用例是信用卡支付的欺詐檢測。我們使用來自Kaggle的測試數據集作爲訓練無監督自動編碼器的基礎,以檢測支付中的異常和潛在欺詐。本例的重點不僅僅是模型訓練,而是整個機器學習基礎設施,包括數據接收、數據預處理、模型訓練、模型部署和監控。所有這些都需要具有可擴展性、可靠性和表現力。

讓我們看一下JupyterNotebook的一些片段。

連接到KSQL服務器並使用python創建KSQL流:

from ksql import KSQLAPI

client = KSQLAPI('http://localhost:8088')

client.create_stream(table_name='creditcardfraud_source',

                    columns_type=['Id bigint', 'Timestamp varchar', 'User varchar', 'Time int', 'V1 double', 'V2 double', 'V3 double', 'V4 double', 'V5 double', 'V6 double', 'V7 double', 'V8 double', 'V9 double', 'V10 double', 'V11 double', 'V12 double', 'V13 double', 'V14 double', 'V15 double', 'V16 double', 'V17 double', 'V18 double', 'V19 double', 'V20 double', 'V21 double', 'V22 double', 'V23 double', 'V24 double', 'V25 double', 'V26 double', 'V27 double', 'V28 double', 'Amount double', 'Class string'],

                    topic='creditcardfraud_source',

                    value_format='DELIMITED')

使用python預處理傳入的付款信息:

· 過濾不需要的列

· 過濾列“class”爲空的消息

· 將數據格式更改爲AVRO,以方便進一步處理

client.create_stream_as(table_name='creditcardfraud_preprocessed_avro',

                    select_columns=['Time', 'V1', 'V2', 'V3', 'V4', 'V5', 'V6', 'V7', 'V8', 'V9', 'V10', 'V11', 'V12', 'V13', 'V14', 'V15', 'V16', 'V17', 'V18', 'V19', 'V20', 'V21', 'V22', 'V23', 'V24', 'V25', 'V26', 'V27', 'V28', 'Amount', 'Class'],

                    src_table='creditcardfraud_source',

                    conditions='ClassIS NOT NULL',

                    kafka_topic='creditcardfraud_preprocessed_avro',

                   value_format='AVRO')

使用KSQL進行可能的數據爭用和預處理的更多示例:

· 刪除列,過濾值“class”爲空的消息,並將數據格式更改爲Avro:

CREATE STREAM creditcardfraud_preprocessed_avro WITH (VALUE_FORMAT='AVRO', KAFKA_TOPIC='creditcardfraud_preprocessed_avro') ASSELECTTime,  V1 ,V2 , V3 , V4 , V5 , V6 , V7 , V8 , V9 , V10 , V11 , V12 , V13 , V14 , V15 , V16, V17 , V18 , V19 , V20 , V21 , V22 , V23 , V24 , V25 , V26 , V27 , V28 ,Amount , Class FROM creditcardfraud_source WHERE Class ISNOTNULL;

· 匿名(屏蔽最左邊的兩個字符,例如,“Hans”變爲“**ns”):

SELECT Id, MASK_LEFT(User, 2) FROM creditcardfraud_source;

· 增強(如果“class”爲空,則添加-1):

SELECT Id, IFNULL(Class, -1) FROM creditcardfraud_source;

· 合併/連接數據幀:

CREATE STREAM creditcardfraud_per_user WITH (VALUE_FORMAT='AVRO', KAFKA_TOPIC='creditcardfraud_preprocessed_avro') ASSELECTTime,  V1 ,V2 , V3 , V4 , V5 , V6 , V7 , V8 , V9 , V10 , V11 , V12 , V13 , V14 , V15 , V16, V17 , V18 , V19 , V20 , V21 , V22 , V23 , V24 , V25 , V26 , V27 , V28 ,Amount , Class FROM creditcardfraud_enahnced c INNER JOIN USERS u on c.userid = u.useridWHERE V1 > 5AND V2 ISNOTNULLAND u.CITYLIKE'Premium%';

Jupyter Notebook包含完整的示例。我們使用Python+KSQL進行集成、數據預處理和交互分析,並將它們與通用的Python機器學習工具棧中的各種其他庫結合起來進行原型設計和模型訓練:

· 使用Numpy和pandas處理數組/矩陣

· 使用scikit-learn進行 ML特定處理(拆分訓練/測試等)

· 通過Matplotlib數據可視化進行交互分析

· 使用TensorFlow和Keras進行ML訓練+評估

模型推理和可視化也在Jupyternotebook中完成。在構建了一個準確的模型之後,你可以將其部署到任何地方進行預測,並利用相同的集成管道進行模型訓練。在Kafka環境中部署模型的一些示例包括:

· 嵌入在Kafka Streams微服務中的分析模型(TensorFlow、Keras、H2O和Deeplarning4j)

· 利用嵌入到KSQL UDF中的模型對物聯網傳感器數據進行異常檢測

· Kafka Streams應用程序和模型服務器之間的RPC通信(TensorFlow服務)

用於原型、演示和生產部署的

Python、KSQL和Jupyter

誠如所見,無論在理論上(谷歌的論文-機器學習系統中的隱藏技術要務)還是在實踐中(Uber的機器學習平臺Michelangelo),構建一個可擴展、可靠和性能良好的機器學習基礎設施都不是一個簡單的任務。

必須解決數據科學家、數據工程師和生產工程師之間的阻抗失配問題,才能使機器學習項目實現真正的業務價值。這需要使用該工作所需的工具,並瞭解如何對其進行組合。你可以使用Python和Jupyter進行原型製作和演示(如果你只想在歷史數據集上進行快速、簡單的原型製作,通常Kafka和ksql會在這裏開銷很大,也不需要這樣做),或者將Python和Jupyter與你的整個開發生命週期結合起來,直至大規模的生產部署。

將Kafka事件流和KSQL語句集成到Jupyter Notebook中可以:

· 使用數據科學家(包括Python和Jupyter)首選的現有環境,並將其與Kafka和KSQL結合,通過使用簡單的Python包裝器API執行KSQL查詢,集成並持續處理實時流式數據。

· 輕鬆連接實時流數據,而不僅僅是歷史數據批次(可能是從前一天、一週或一個月開始,例如通過CSV文件進入)

· 將來自Kafka的基於流式事件的傳感器數據等不同概念與諸如生成器或字典對象之類的Python編程概念結合起來,這些概念可用於你的Python數據處理工具或諸如Numpy、pandas或scikit-learn之類的ML框架。

· 重複使用相同的邏輯進行集成、預處理和監控,並將其從Jupyter Notebook和原型製作或演示轉移到大型測試和生產系統中。

用於原型設計的python和用於可擴展流媒體平臺的Apache Kafka不是競爭的技術棧。兩者可以很好地協同工作,特別是如果你使用諸如jupyterNotebook和KSQLl之類的“助手工具”。

對大數據以及人工智能概念都是模糊不清的,該按照什麼線路去學習,學完往哪方面發展,想深入瞭解,想學習的同學歡迎加入大數據學習qq羣:458345782,有大量乾貨(零基礎以及進階的經典實戰)分享給大家,並且有清華大學畢業的資深大數據講師給大家免費授課,給大家分享目前國內最完整的大數據高端實戰實用學習流程體系 。從java和linux入手,其後逐步的深入到HADOOP-hive-oozie-web-flume-python-hbase-kafka-scala-SPARK等相關知識一一分享!

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