如何在Python中編寫簡單代碼,並且速度超越Spark?

2021-01-12 讀芯術

全文共3482字,預計學習時長7分鐘

如今,大家都在Python工具(pandas和Scikit-learn)的簡潔性、Spark和Hadoop的可擴展性以及Kubernetes的操作就緒之間做選擇。結果是,選擇應用了以上所有工具。主攻Python的數據科學家、精通Java和Scala Spark的大師和一批開發者,他們三批人馬保持獨立,分別管理解決辦法。

數據科學家們用pandas進行探索。然後,其他的數據工程師團隊重新編寫相同的邏輯代碼並使其大規模工作,或者使用Spark令其與實時流一同工作。當數據科學家需要更改邏輯或將一個不同的數據集用於他/她的模型時,則會進行一次次地迭代。

除了注意業務邏輯之外,還要分別或同時在Hadoop和Kubernetes構建集群,並應用整個CI / CD過程手動進行管理。最重要的是,大家都在努力工作,沒有足夠的業務影響來展示它......

如果你想在Python中編寫簡單代碼,並且用比Spark更快的速度運行,同時無需重新編碼、無需開發者解決部署、擴展和監控問題,可能嗎?

你可能會「說我是一個夢想家」。我是一個夢想家,但不是唯一的一個!本篇文章將證明如今可以使用Nuclio和RAPIDSlimg令以上設想成為現實,它們是由NVIDIA孵化的免費開源數據科學加速平臺。

過去幾個月,有人將RAPIDS與Nuclio開源無伺服器項目和Iguazio的PaaS集成在一起。現在,使用相同的Python代碼會擁有更快的數據處理速度和可擴展性,並且由於採用無伺服器方法,其操作開銷可達到最低水平。

本文將對同樣廣受歡迎的實時數據的用例進行演示,它們由基於Json的日誌組成。本文將根據以上數據完成分析任務,並將聚合結果轉儲為壓縮的Parquet格式,便於進一步的查詢或機器學習訓練。本文將研究批和實時流(是的,使用簡單Python代碼的實時流)。但開始之前,先進行總體概述。

是什麼導致Python既慢又無法擴展?

在小型數據集上使用pandas時,其性能表現不錯,但這隻發生在整個數據集適合內存且在pandas和NumPy層下使用已優化的C代碼進行處理的情況下。處理大量數據包含集中的的IO操作、數據轉換、數據拷貝等,拖慢了處理的速度。從本質上講,臭名昭著的GIL 給Python帶來了線程同步的困難,在處理複雜任務時非常低效,異步Python相對更好,但其開發複雜且無法解決固有的鎖定問題。

像Spark這樣的框架具有異步引擎(Akka) 和內存優化數據布局的優勢,它們可以將工作分配給不同機器中的多個工作人員,從而提高性能和可擴展性,並使其成為實際標準。

RAPIDS幫助Python開掛

英偉達想出了絕佳的點子:保留面向Python的API(接口)中受歡迎框架,如pandas、Scikit-learn和,而在GPU的高性能C代碼中處理數據。他們採用內存友好型的ApacheArrow 數據格式,以加速數據傳輸和操作。

RAPIDS支持數據IO (cuIO), 數據分析(cuDF)和機器學習(cuML).這些不同組成部分共享相同的內存結構,因此基本上可以在不將數據來回複製到CPU中的情況下完成數據攝取、分析和機器學習的過程。

以下示例演示了讀取大型Json文件(1.2GB)的實例,其使用pandas API聚合數據。可以看到,使用RAPIDS運行相同的代碼,速度如何增快30倍(完整Notebook:https://github.com/nuclio/rapids/blob/master/demo/benchmark_cudf_vs_pd.ipynb),與沒有IO的計算相比,它快了100倍,這意味著還有對數據進行更為複雜計算的餘地。

本文使用單GPU (NVIDIA T4) 它可以使伺服器價格增加約30%,性能提升30多倍。只使用幾行Python代碼,每秒就可處理1千兆字節的複雜數據。哇!!

如果將此代碼打包在無伺服器函數中,它可以在每次用戶請求時或定期運行,並讀取或寫入動態附加的數據卷。

Python中可實現實時流嗎?

你是否嘗試使用Python執行實時流式傳輸?好吧,我們做到了。以下代碼選取自Kafka最佳實踐指南,此代碼從流中讀取,同時並未額外處理。

問題在於Python本質上是同步的,而其在實時或複雜的數據操作方面效率相當低。該程序每秒只生成幾千條消息,而且還沒做任何有意思的工作。當我們添加前文示例中使用的json和pandas處理(Notebook:https://github.com/nuclio/rapids/blob/master/demo/python-agg.ipynb)時,性能會進一步降低,處理速度僅為18MB / s。那麼,是否需要回到Spark進行流處理呢?

不,等等。

最快的無伺服器框架是Nuclio,現在它也是Kubeflow(Kubernetes機器學習框架)的一部分。Nuclio運行由實時和高度並發的執行引擎包裝的各種代碼語言。Nuclio無需額外編碼,可並行運行多個代碼實例(使用高效的微線程)。Nuclio處理流程內和多個流程/容器中的自動擴展(請參閱此技術報導博客:https://theburningmonk.com/2019/04/comparing-nuclio-and-aws-lambda/)。

Nuclio以高度優化的二進位代碼處理流處理和數據訪問,並通過簡單的函數處理程序調用函數。它支持14種不同的觸發或流協議(包括HTTP、Kafka, Kinesis、Cron和批),這些協議通過配置指定(不更改代碼),並支持快速訪問外部數據卷。單個Nuclio函數每秒可處理數十萬條消息,吞吐量超過千兆字節/秒。

最重要的是,Nuclio是目前唯一一款具有優化NVIDIA GPU支持的無伺服器框架。它知道如何確保GPU利用率最大化,並在需要時擴展到更多流程和GPU。

筆者對Nuclio持保留意見,但它的功能的確很先進。

無需Devops的30倍速度流處理

結合使用Nuclio與RAPIDS,基於Python流處理獲得GPU加速,最終實現完美蛻變。以下代碼與批處理案例別無二異,本文只是將其置於一個函數處理程序中,並將傳入的消息收集到更大的批中以減少GPU調用。(請參閱完整筆記本:https://github.com/nuclio/rapids/blob/master/demo/nuclio-cudf-agg.ipynb)

可以使用HTTP或Kafka觸發器測試同一個函數:在兩種情況下,Nuclio都將處理並行性,並將流分區劃分給多個工作人員,無需任何額外開發工作。本文測試的設置是使用3節點Kafka集群和單個Nuclio函數進程(在具有一個NVIDIA T4的雙插槽Intel伺服器上)。本文設法處理638 MB / s,比編寫自己的Python Kafka客戶端快30倍,並且它可以自動擴展以處理任何數量的流量。值得一提的是,所使用Python代碼短小而簡單!

在測試中,筆者注意到GPU未充分利用,這意味著可以對數據進行更複雜的計算(連接、機器學習預測、轉換等),同時保持相同的性能水平。

那麼,也就是以更少的開發獲得更快的性能,但無伺服器解決方案的真正好處在於「無伺服器」。使用相同的代碼,在Notebook中進行開發 (請參閱此筆記本示例:https://github.com/nuclio/rapids/blob/master/demo/nuclio-cudf-agg.ipynb) 或選用你喜歡的IDE,並在一個命令中對其進行構建、貨櫃化並運送到有完整檢測功能、已安全加固的的Kubernetes集群(日誌、監控、自動縮放......)。

Nuclio與Kubeflow管道集成。構建多階段數據或機器學習管道,你可以輕鬆地實現數據科學工作流自動化,並收集執行和工件元數據,從而輕鬆地重現實驗結果。

下載Nuclio(https://nuclio.io/)並將其部署在你的Kubernetes上(請參閱RAPIDS示例:https://github.com/nuclio/rapids)。

留言 點讚 關注

我們一起分享AI學習與發展的乾貨

如需轉載,請後臺留言,遵守轉載規範

相關焦點

  • 停止使用Pandas並開始使用Spark+Scala
    ,並且最終可能會編寫出更好的代碼。  · Spark是用Scala編寫的,因此在Python之前的Scala中可以使用新功能  · 對於數據科學家和數據工程師一起工作,由於Scala代碼的類型安全性和不變性,使用Scala可以幫助進行協作。
  • 代碼跑得慢甩鍋Python?手把手教你如何給代碼提速30%
    其實某個特定程序(無論使用何種程式語言)的運行速度是快還是慢,在很大程度上取決於編寫該程序的開發人員自身素質,以及他們編寫優化而高效代碼的能力。Medium上一位小哥就詳細講了講如何讓python提速30%,以此證明代碼跑得慢不是python的問題,而是代碼本身的問題。
  • 懶人秘籍:教你如何避免編寫pandas代碼
    而大家都在儘可能地避免這種懸崖峭壁,結果可想而知,都轉向了如何避免編寫pandas代碼。在過去4年裡,筆者一直使用pandas作為數據分析的主要工具。必須承認,「如何避免編寫pandas代碼」的大部分內容來自於使用pandas編程的起步階段。在進行代碼審閱時,筆者仍然看到許多經驗豐富的程式設計師在看一些熱門「如何避免使用」的帖子。
  • 如何自學成 Python 大神?這裡有些建議
    在本篇文章中,我們將分享 6 位技術專家學習 Python 的最佳方法,也許當你學習舉步維艱之時,他們的經驗將會幫你躲避很多不必要的坑,以及可以讓你學會如何通過 Python 教程編寫出色的 Python 程序。
  • python基礎知識科普:python的起源和發展史以及應用場景
    前面已經提到了,Python有極其簡單的語法。免費、開源————Python是FLOSS(自由/開放源碼軟體)之一。簡單地說,你可以自由地發布這個軟體的拷貝、閱讀它的原始碼、對它做改動、把它的一部分用於新的自由軟體中。FLOSS是基於一個團體分享知識的概念。
  • 手把手教你在本機安裝spark
    言歸正傳,spark鼎鼎大名,凡是搞分布式或者是大數據的應該都聽說過它的大名。它是apache公司開發的一個開源集群計算框架,也就是分布式計算框架。相比於Hadoop的MapReduce,它支持更多的功能,並且運算速度也更快,如今已經成了非常主流的大數據計算框架。幾乎各大公司當中都有它的身影。
  • Python代碼性能調試和優化
    如果是的話,可能是由於編寫的程序有問題,需要優化。本文蟲蟲就給大家介紹一下如何調試Python應用的性能,以及怎麼對其進行優化。Python性能調試要進行Python性能,前提條件是要找出程序中的性能瓶頸。找出程序中影響程序性能的代碼。
  • PySpark源碼解析,用Python調用高效Scala接口,搞定大規模數據分析
    總體的架構圖如下所示:2、Python Driver 如何調用 Java 的接口上面提到,通過 spark-submit 提交 PySpark 作業後,Driver 端首先是運行用戶提交的 Python 腳本,然而 Spark 提供的大多數 API 都是 Scala 或者 Java 的,那麼就需要能夠在 Python 中去調用
  • python基礎教程之python是什麼?
    這是最近10年最常用的10種程式語言的變化圖:python是什麼--python的功能總的來說,這幾種程式語言各有千秋。C語言是可以用來編寫作業系統的貼近硬體的語言,所以,C語言適合開發那些追求運行速度、充分發揮硬體性能的程序。而Python是用來編寫應用程式的高級程式語言。當你用一種語言開始作真正的軟體開發時,你除了編寫代碼外,還需要很多基本的已經寫好的現成的東西,來幫助你加快開發進度。
  • 初識pycharm編寫方法
    使用pycharm編輯器 雙擊我們安裝好的pycharm編輯器(安裝過程在前幾節)選擇第一個新建項目第一個pure python是純python,下面的那些是一些擴展,暫時不用,我們就選第一個Location是選擇編寫代碼保存的路徑,根據自己的情況點右側小文件夾按鈕,自行選擇一個路徑保存即可保存後點擊右下角的
  • 《小灰教你零基礎學python》-Python入門語言
    二、什麼是程式語言程序(軟體)是使用程式語言編寫的,比如咱們日常使用的微信、qq、瀏覽器、播放器都是使用程式語言編寫的,程式語言有哪些:javapython程式語言有很多,咱們就學簡單強大的python即可。
  • python是什麼:Python相關內容了解
    今天來聊聊一篇關於python是什麼:Python相關內容了解的文章,現在就為大家來簡單介紹下python是什麼:Python相關內容了解,希望對各位小夥伴們有所幫助。C語言是可以用來編寫作業系統的貼近硬體的語言,所以,C語言適合開發那些追求運行速度、充分發揮硬體性能的程序。而Python是用來編寫應用程式的高級程式語言。當你用一種語言開始作真正的軟體開發時,你除了編寫代碼外,還需要很多基本的已經寫好的現成的東西,來幫助你加快開發進度。比如說,要編寫一個電子郵件客戶端,如果先從最底層開始編寫網絡協議相關的代碼,那估計一年半載也開發不出來。
  • 學習筆記,從NumPy到Scrapy,學習Python不能錯過這些庫
    NumPy構建在Numeric代碼庫上,並添加了numarray引入的特性、擴展的C-API以及創建任意類型數組的能力,這也使得NumPy適合與通用資料庫應用程式進行接口。numpy庫可以用來存儲和處理大型矩陣,並且在一定程度上彌補了python在運算效率上的不足,正是因為numpy的存在使得python成為數值計算領域的一大利器;2.
  • 如何快速簡單的安裝opencv-python
    python3.6.8下載將pip源更換到國內鏡像用pip管理工具安裝庫文件時,默認使用國外的源文件,因此在國內的下載速度會比較慢,可能只有50KB/s。幸好,國內的一些頂級科研機構已經給我們準備好了各種鏡像,下載速度可達2MB/s。
  • Python教程|用代碼打開聖誕節的奇妙姿勢!
    這次,我們來看一看有什麼「獨特」的技巧在編程的世界中歡度一個不一樣的聖誕節?首先來點兒簡單的!ASCII Art - Christmas Tree!ASCII ART?這是啥?小樂老師先來科普一波。早年的電腦發展遠不如現在發達,隨意播放高清視頻,發送動態表情包在當時來說是非常困難的。
  • 詳解Python在資料庫測試中的應用
    對於我們的測試工作而言,Python最吸引我們的特性有如下幾個方面:  1 具備語言粘合劑的能力  2 解釋執行的機制  3 語法簡單易學  4 相對較高的性能  語言粘合劑是比較形象的說法,具體的說,Python支持通過引入自帶的cytpes庫,達到在python腳本中執行已有的動態庫中的代碼的目標。
  • 自己動手「焊」鍵盤,使用Python編寫,一鍵放連招不在話下
    這一 Python 鍵盤可以讓用戶輕鬆地使用 Python 編寫控制板。項目地址:https://github.com/makerdiary/python-keyboard下面我們就來看下這個 Python 鍵盤的具體操作和實現細節。
  • 給訓練踩踩油門:編寫高效的PyTorch代碼技巧
    正因為它是一個非常常用的運算操作,如果過度使用可以導致代碼變得低效。這裡給出一個例子來展示它是如何導致代碼變得低效的。構建高效的自定義數據加載類上一節介紹了如何寫出更加高效的 PyTorch 的代碼,但為了讓你的代碼運行更快,將數據更加高效加載到內存中也是非常重要的。幸運的是 PyTorch 提供了一個很容易加載數據的工具,即 DataLoader 。
  • 一個Python GUI神器,雙手徹底解放!
    與直接使用基礎框架編寫代碼相比,PySimpleGUI代碼更簡單、更短,因為PySimpleGUI實現了許多「樣板代碼」,並且接口已被極大的簡化,用最少的代碼即可實現所需功能。PySimpleGUI含有成百上千的書面文檔頁面和示例程序,這將幫助我們快速有效地工作。
  • 代碼詳解:Python虛擬環境的原理及使用
    · 使用虛擬環境· 管理環境· 虛擬環境如何運行?1. 為什麼使用虛擬環境?虛擬環境為一系列潛在問題提供簡單的解決方案,尤其是在以下幾個方面:· 允許不同的項目使用不同版本的程序包,從而解決依賴性問題。