當前位置:
首頁 > 知識 > 想讓pandas運行更快嗎?那就用Modin吧

想讓pandas運行更快嗎?那就用Modin吧

選自towardsdatascience

者: Parul Pandey

機器之心編譯

參與:Geek AI、Chita

Pandas 是數據科學領域流行的程序庫,能夠提供高性能、易於使用的數據結構和數據分析工具。但是處理規模大小不同的數據使,用戶還得求助於不同的工具,實在有點麻煩。而 Modin 能夠將 pandas 的運行速度提高好幾倍,而無需切換 API 來適應不同的數據規模。

「通過更改一行代碼擴展你的 pandas 工作流。」

Pandas是數據科學領域的工作者都熟知的程序庫。它提供高性能、易於使用的數據結構和數據分析工具。但是,當處理過於龐大的數據時,單個內核上運行的 Pandas 就會變得力不從心,人們不得不求助於不同的分散式系統來提高性能。然而,為了提高性能而做的這種權衡會帶來陡峭的學習曲線。

本質上,用戶只是想讓 Pandas 運行得更快,而不是為了特定的硬體設置而優化其工作流。這意味著人們希望在處理 10KB 的數據集時,可以使用與處理 10TB 數據集時相同的 Pandas 腳本。Modin 提供了一個優化 Pandas 的解決方案,這樣數據科學家就可以把時間花在從數據中提取價值上,而不是花在提取數據的工具上。

Modin

Modin 是加州大學伯克利分校 RISELab 的一個早期項目,旨在促進分散式計算在數據科學領域的應用。它是一個多進程的數據幀(Dataframe)庫,具有與 Pandas 相同的應用程序介面(API),使用戶可以加速他們的 Pandas 工作流。

在一台 8 核的機器上,用戶只需要修改一行代碼,Modin 就能將 Pandas 查詢任務加速 4 倍。

該系統是為希望程序運行得更快、伸縮性更好,而無需進行重大代碼更改的 Pandas 用戶設計的。這項工作的最終目標是能夠在雲環境中使用 Pandas。

安裝

Modin 是完全開源的,可以通過下面的 GitHub 鏈接獲得:

https://github.com/modin-project/modin

我們可以使用如下所示的 PyPi 指令來安裝 Modin:

在 Windows 環境下,Ray 是安裝 Modin 所需的依賴之一。Windows 本身並不支持 Ray,所以為了安裝它,用戶需要使用 WSL(適用 Linux 的 Windows 子系統)。

Modin 如何加速數據處理過程

在筆記本上

在具有 4 個 CPU 內核的現代筆記本上處理適用於該機器的數據幀時,Pandas 僅僅使用了 1 個 CPU 內核,而 Modin 則能夠使用全部 4 個內核。

Pandas 和 Modin 對 CPU 內核的使用情況

從本質上講,Modin 所做的只是增加了 CPU 所有內核的利用率,從而提供了更好的性能。

在大型機器上

在大型機器上,Modin 的作用就變得更加明顯了。假設我們有一台伺服器或一台非常強大的機器,Pandas 仍然只會利用一個內核,而 Modin 會使用所有的內核。下圖顯示了在一台擁有 144 內核的計算機上通過 Pandas 和 Modin 使用「read_csv」函數的性能對比情況:

Pandas 的運行時間會隨著數據量的變化而線性增長,因為它僅僅使用 1 個內核。而從上圖中可能很難看到綠色條形圖的增長,因為 Modin 的運行時間實在太短了。

通常,Modin 使用「read_csv」函數讀取 2G 數據需要 2 秒,而 讀取 18G 數據大約需要不到 18 秒。

架構

接下來,本文將解析 Modin 的架構。

數據幀分區

Modin 對數據幀的分區模式是沿著列和行同時進行劃分的,因為這樣為 Modins 在支持的列數和行數上都提供了靈活性和可伸縮性。

系統架構

Modin 被分為不同的層:

Pandas API 在最頂層暴露給用戶。

下一層為查詢編譯器,它接收來自 Pandas API 層的查詢並執行某些優化。

最後一層為分區管理器(Partition Manager),負責數據布局並對發送到每個分區的任務進行重組、分區和序列化。

modin 的一般架構

在 Modin 中實現 Pandas API

pandas 有大量的 API,這可能也是它應用如此廣泛的原因之一。

pandas API

由於 Pandas 具有這麼多種操作,Modin 採用了一種數據驅動的方法。也就是說 Modin 的創造者找出了人們最常用的 Pandas 操作。他們研究了 Kaggle 平台上的 Pandas 使用數據,對上面所有的 notebook 和腳本進行了分析,最終總結出最受歡迎的 Pandas 方法如下:

「pd.read_CSV」是目前最常用的 Pandas 方法,其次是「pd.Dataframe」方法。因此,在 Modin 中,設計者們開始實現一些 Pandas 操作,並按照它們受歡迎程度從高到低的順序進行優化:

目前,Modin 支持大約 71% 的 Pandas API。

根據研究,這代表了 93% 的使用場景。

Ray

Modin 利用 Ray 以毫不費力的方式加速 Pandas 的 notebook、腳本和程序庫。Ray 是一個針對大規模機器學習和強化學習應用的高性能分散式執行框架。同樣的代碼可以在單台機器上運行以實現高效的多進程,也可以在集群上用於大型計算。你可以通過下面的 GitHub 鏈接獲取 Ray:http://github.com/ray-project/ray。

使用方法

導入

Modin 封裝了 Pandas,並透明地分發數據和計算任務,它通過修改一行代碼就加速了 Pandas 的工作流。用戶可以繼續使用以前的 Pandas notebook,同時體驗 Modin 帶來的大幅加速,甚至在一台機器上。用戶需要做的只是修改導入程序包的聲明,引入「modin.pandas」而不是「pandas」。

我們將使用 Numpy 構建一個由隨機整數組成的簡單數據集。請注意,我們並不需要在這裡指定分區。

當我們將數據的類型列印在屏幕上時,會顯示出「Modin 數據幀」。

如果我們使用「head」命令列印出前五行數據,它會像 Pandas 一樣顯示出 HTML 表單。

對比實驗

Modin 會管理數據分區和重組,從而使用戶能夠將注意力集中於從數據中提取出價值。下面的代碼是在一台 2013 年的擁有 4 個 CPU 內核和 32 GB RAM 內存的 iMac 機器上運行的。

pd.read_csv

「read_csv」是目前為止最常用的 Pandas 操作。接下來,本文將對分別在 Pandas 和 Modin 環境下使用「read_csv」函數的性能進行一個簡單的對比。

pandas

Modin

通過使用 Modin,只需要修改導入聲明就可以在一台 4 核機器上以普通 Pandas 4 倍的速度執行「read_csv」操作。

df.groupby

Pandas 的「groupby」聚合函數底層編寫得非常好,運行速度非常快。但是即使如此,Modin 的性能也比 Pandas 要好。

Pandas

modin

Pandas 實現的默認設置

如果想要使用尚未實現或優化的 Pandas API,實際上可以使用默認的 Pandas API。這使得該系統可以用於使用 Modin 中尚未實現操作的 notebook 中(儘管由於即將使用 Pandas API,性能會有所下降)。當使用默認的 Pandas API 時,你將看到一個警告:

當計算完成後,該操作會返回一個分散式的 Modin 數據幀。

結語

Modin 項目仍處於早期階段,但對 Pandas 來說是一個非常有發展前景的補充。Modin 為用戶處理所有的數據分區和重組任務,這樣我們就可以集中精力處理工作流。Modin 的基本目標是讓用戶能夠在小數據和大數據上使用相同的工具,而不用考慮改變 API 來適應不同的數據規模。

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

------------------------------------------------

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

我是怎麼走上推薦系統這條路的……
SysML 2019論文解讀:推理優化

TAG:機器之心 |