使用Dask進行平行計算
Dask是一個靈活的開源Python庫,用於平行計算。在本文中,我們將學習平行計算以及為什麼我們應該選擇Dask來實現此目的。
我們將將其與Spark、Ray和Modin等其他庫進行比較。我們還討論了Dask的用例。
平行計算
平行計算是一種計算型別,它同時執行多個計算或程序。大型問題通常被分解成更小的、可以獨立解決的部分。
平行計算的四大類是:
位級
指令級
資料級
作業並行。
雖然並行性長期以來一直被用於高效能計算,但由於頻率擴充套件的物理限制,它最近才變得越來越流行。
Dask的需求
一個問題是,我們為什麼需要Dask?
藉助NumPy、Sklearn、Seaborn等Python庫,資料操作和機器學習任務變得簡單。對於大多數資料分析任務來說,Python的[pandas]模組已經足夠了。可以使用多種方法操作資料,並使用這些資料建立機器學習模型。
但是,如果您的資料超過可用RAM的大小,pandas將變得不夠用。這是一個非常普遍的問題。您可以使用Spark或Hadoop來解決這個問題。但是,這些都不是Python環境。因此,您無法使用NumPy、pandas、sklearn、TensorFlow和其他知名的Python機器學習工具。有沒有辦法解決這個問題?是的!這時Dask就派上用場了。
Dask簡介
Dask是一個用於平行計算的框架,可以與Jupyter Notebook無縫整合。最初,它是為了擴充套件NumPy、Pandas和Scikit-learn的計算能力而建立的,以克服單機儲存的限制。可以使用DASK類似物進行學習,但很快它就被用作通用的分散式系統。
Dask有兩個主要優勢:
可擴充套件性
Dask與Pandas、NumPy和Scikit-Learn的Python版本原生相容,並且可以在具有多個核心的叢集上可靠地執行。它也可以縮小規模以在單個系統上執行。
規劃
類似於Airflow、Luigi,Dask任務排程器針對計算進行了最佳化。它提供快速反饋,使用任務圖管理任務,並支援本地和分散式診斷,使其動態且響應迅速。
此外,Dask提供了一個即時動態儀表板,每100毫秒更新一次,顯示進度、記憶體使用情況等各種資訊。
根據您的喜好,您可以克隆git倉庫或使用Conda/pip安裝Dask。
conda install dask
僅安裝核心:
conda install dask-core
Dask-core是Dask的精簡版本,只安裝核心元件。pip也一樣。如果您只關心使用dask資料框和dask陣列來擴充套件pandas、numpy或兩者,您也可以只安裝dask資料框或dask陣列。
python -m pip install dask
安裝資料框所需元件
python -m pip install "dask[dataframe]" #
安裝陣列所需元件
python -m pip install "dask[list]"
讓我們看看這個庫用於平行計算的幾個例子。我們的程式碼使用dask.delayed來實現並行性。
注意:下面的兩個程式碼片段應該在Jupyter Notebook的兩個不同的單元格中執行
import time import random def calcprofit(a, b): time.sleep(random.random()) return a + b def calcloss(a, b): time.sleep(random.random()) return a - b def calctotal(a, b): time.sleep(random.random()) return a + b
現在執行下面的程式碼片段:
%%time profit = calcprofit(10, 22) loss = calcloss(18, 3) total = calctotal(profit, loss) print(total)
輸出
47 CPU times: user 4.13 ms, sys: 1.23 ms, total: 5.36 ms Wall time: 1.35 s
儘管它們相互獨立,但這些函式將按順序一個接一個地執行。因此,我們可以同時執行它們以節省時間。
import dask calcprofit = dask.delayed(calcprofit) calcloss = dask.delayed(calcloss) calctotal = dask.delayed(calctotal)
現在執行下面的程式碼片段:
%%time profit = calcprofit(10, 22) loss = calcloss(18, 3) total = calctotal(profit, loss) print(total)
輸出
Delayed('calctotal-9e3e896e-b4de-400c-aeb8-9e4c0961fe11')
CPU times: user 3.3 ms, sys: 0 ns, total: 3.3 ms
Wall time: 10.2 ms
即使在這個簡單的例子中,執行時間也得到了改善。我們可以按照如下方式檢視任務圖:
total.visualize(rankdir='LR')
Spark vs. Dask
Spark是一個強大的叢集計算框架工具,它將資料和處理分成可管理的部分,將它們分佈在任何大小的叢集上,並同時執行它們。
儘管Spark是大資料分析的事實上的標準技術,但Dask看起來非常有前景。Dask是輕量級的,並作為Python元件開發,而Spark具有額外的功能,主要用Scala開發,也支援Python/R。如果您想要一個切實可行的解決方案,或者甚至擁有JVM基礎設施,Spark可以是您的首選。但是,如果您想要快速、輕量級的並行處理,Dask是一個可行的選擇。快速pip install後即可使用。
Dask、Ray和Modin
Ray和Dask具有不同的排程策略。Dask使用中央排程器管理叢集的所有作業。由於Ray是去中心化的,每臺計算機都有自己的排程器,允許在特定機器級別而不是整個叢集級別解決計劃任務的問題。Ray缺乏Dask提供的豐富的上層集合API(例如資料框、分散式陣列等)。
另一方面,Modin執行在Dask或Ray之上。只需新增一行程式碼`import modin.pandas as pd`,我們就可以快速地使用Modin擴充套件我們的Pandas程序。雖然Modin努力盡可能地並行化Pandas API的大部分,但Dask DataFrame有時不會擴充套件完整的Pandas API。
Dask用例示例
Dask的應用案例分為兩類:
我們可以使用動態任務排程來最佳化計算。
可以使用“大資料”集合(例如並行陣列和資料框)來處理大型資料集。
使用Dask集合建立任務圖,這是資料處理作業組織的視覺化表示。
使用Dask排程器執行任務圖。
Dask使用並行程式設計來執行作業。
術語“並行程式設計”是指同時執行多個任務。
透過這樣做,我們可以有效地利用我們的資源,並同時完成多個任務。
讓我們看看Dask提供的一些資料集。
Dask.array - 使用NumPy介面,dask.array將大型陣列分成較小的陣列,使我們能夠對大於系統記憶體的陣列進行計算。
Dask.bag - 它對標準Python物件的集合執行操作,例如filter、map、group by和fold。
Dask.dataframe - 分散式資料框,類似於Pandas。它是由多個較小的資料框構成的大型並行資料框。
結論
在本文中,我們學習了Dask和平行計算。希望它能幫助您提高對Dask的瞭解,包括它的需求以及與其他庫的比較。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP