自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

用Rust讓numpy、scikit和pandas加速100倍!開源Weld技術(shù)揭秘

新聞 前端
在利用 Python 與 R 的數(shù)據(jù)科學(xué)堆棧工作了幾個禮拜之后,我開始問自己:有沒有可能存在一種通用的中間表示形式(類似于 CUDA),能夠在多種語言之間同時起效?

在利用 Python 與 R 的數(shù)據(jù)科學(xué)堆棧工作了幾個禮拜之后,我開始問自己:有沒有可能存在一種通用的中間表示形式(類似于 CUDA),能夠在多種語言之間同時起效?現(xiàn)在我必須得在不同語言中重新實現(xiàn)并優(yōu)化已經(jīng)存在的方法,難道就不能更高效一點(diǎn)?除此之外,我希望通過通用的運(yùn)行對程序進(jìn)行整體優(yōu)化,而不是像現(xiàn)在這樣只能針對函數(shù)進(jìn)行優(yōu)化。經(jīng)過幾天的研究和測試,我發(fā)現(xiàn)了 Weld。令我意外的是,Weld 的締造者之一正是 Matei Zaharia,也就是 Spark 的發(fā)明者。

正因為如此,我聯(lián)系并采訪了 Weld 項目的主要貢獻(xiàn)者 Shoumik Palkar。Shoumik 目前是斯坦福大學(xué)計算機(jī)科學(xué)系的博士生,在 Matei Zaharia 的推薦下加入了 Weld 項目。

Weld 還遠(yuǎn)沒有達(dá)到生產(chǎn)就緒級別,但其發(fā)展愿景卻是一片光明。如果大家對數(shù)據(jù)科學(xué)的未來以及 Rust 抱有興趣,相信這次訪談會給你帶來不少啟示。 

開發(fā) Weld 項目的動機(jī)是什么,它又能夠解決哪些問題?

項目的開發(fā)動機(jī),在于為依賴現(xiàn)有高級 API(例如 NumPy 與 Pandas)的應(yīng)用程序提供裸機(jī)級別的性能表現(xiàn)。其解決的主要問題,是實現(xiàn)跨函數(shù)與跨庫層面的優(yōu)化,而這正是目前其他庫所無法實現(xiàn)的。具體來講,當(dāng)下有不少常用庫以各個函數(shù)為基礎(chǔ)提供算法的最新實現(xiàn)(例如以 C 語言在 Pandas 中實現(xiàn)的快速連接算法,或者以 NumPy 語言實現(xiàn)的快速矩陣乘法),但市面上卻還不存在能夠跨越這些函數(shù)實現(xiàn)優(yōu)化的可用工具(例如在執(zhí)行矩陣乘法后進(jìn)行聚合時,防止不必要的內(nèi)存掃描)。Weld 希望提供一個可通用的運(yùn)行時,使各個庫能夠在通用 IR 當(dāng)中進(jìn)行計算表達(dá);接下來,開發(fā)人員還可以利用編譯器優(yōu)化程序?qū)?IR 進(jìn)行優(yōu)化,而后通過循環(huán)融合、矢量化等優(yōu)化手段將 JIT 與并行本機(jī)代碼加以對接。Weld 的 IR 具備本機(jī)并行特性,因此開發(fā)人員可以隨時對其中表示的程序進(jìn)行常規(guī)并行化處理。

我們還建立了一個名為拆分注釋(split annotations)的新項目,該項目將與 Weld 相集成,旨在降低對現(xiàn)有庫進(jìn)行優(yōu)化的實施門檻。

對 Numpy、Pandas 以及 Scikit 進(jìn)行優(yōu)化困難嗎?速度方面能有多大提升?

Weld 跨越各個函數(shù)對這些庫進(jìn)行優(yōu)化,而對庫的整體優(yōu)化也能讓單一函數(shù)的調(diào)用速度更快。實際上,不少此類數(shù)據(jù)庫都已經(jīng)立足函數(shù)層面進(jìn)行了高度優(yōu)化,只是由于其沒有充分利用并行性或者內(nèi)存結(jié)構(gòu),所以性能表現(xiàn)仍然低于現(xiàn)代硬件的極限水平。舉例來說,目前已經(jīng)有不少 Numpy ndarray 函數(shù)可以在 C 語言中實現(xiàn),但調(diào)用每一項函數(shù)都需要對每一條輸入進(jìn)行完整掃描。如果這些數(shù)組不適用于 CPU 緩存,那么大多數(shù)執(zhí)行時間就都被耗費(fèi)在了從主內(nèi)存中加載數(shù)據(jù)上,計算的執(zhí)行反而成了次要耗時因素。Weld 能夠查看各個函數(shù)調(diào)用并執(zhí)行優(yōu)化,例如循環(huán)融合,從而將數(shù)據(jù)保留在 CPU 緩存或者寄存器當(dāng)中。憑借著更好的擴(kuò)展能力,這些類型的優(yōu)化能夠在多核心系統(tǒng)上將性能提升一個數(shù)量級甚至更高。

用Rust让numpy、scikit和pandas加速100倍!开源Weld技术揭秘

與 Weld 原型方案進(jìn)行集成之后,Spark(左上)、NumPy(右上)以及 TensorFlow(左下)的性能相較于原始框架提高了 30 倍,且無需對用戶的應(yīng)用程序代碼做出任何調(diào)整。此外,Pandas 與 NumPy 之間的跨庫優(yōu)化(右下)則可將性能提升達(dá)兩個數(shù)量級。

Baloo 是什么?

Baloo 是一個庫,負(fù)責(zé)利用 Weld 實現(xiàn) Pandas API 中的一個子集。Baloo 由阿姆斯特丹 CWI 研究所碩士生 Radu Jica 開發(fā)完成,其目標(biāo)是在 Pandas 當(dāng)中完成之前提到的各項優(yōu)化,從而提高其單線程性能、減少內(nèi)存占用量并引入并行性。

Weld/Baloo 是否支持利用核外計算(例如 Dask)處理不適合駐留在內(nèi)存中的數(shù)據(jù)?

Weld 與 Baloo 目前都還不支持核外計算,但我們歡迎更多開源貢獻(xiàn)者能夠?qū)崿F(xiàn)這一功能!

你們?yōu)槭裁催x擇利用 Rust 與 LLVM 來實現(xiàn) Weld?Rust 一直是你們的第一選擇嗎?

我們之所以選擇 Rust,是因為:

  • Rust 的運(yùn)行時很?。ɑ旧现回?fù)責(zé)對數(shù)組進(jìn)行邊界檢查),而且易于嵌入到其他語言(例如 Java 與 Python)當(dāng)中。
  • Rust 包含函數(shù)式編程范式,例如模式匹配,能夠使代碼編寫(例如模式匹配編譯器優(yōu)化)更輕松。
  • Rust 擁有強(qiáng)大的技術(shù)社區(qū)與高質(zhì)量的工具包(在 Rust 中被稱為“crates”),這使我們能夠更容易地進(jìn)行系統(tǒng)開發(fā)。

在另一方面,之所以選擇 LLVM,是因為它擁有一套用途廣泛且廣受支持的開源編譯器框架。我們能夠直接生成 LLVM 以替代 C/C++,因此不必依賴于 C 編譯器,從而縮短編譯時間(過程中不需要解析 C/C++ 代碼)。

Rust 并不是 Weld 采用的第一款實現(xiàn)語言;最初,我們選擇的是 Scala,當(dāng)時主要考慮到它擁有代數(shù)數(shù)據(jù)類型以及強(qiáng)大的模式匹配機(jī)制。這能夠極大簡化編譯器核心部分優(yōu)化器的編寫過程。我們最初的優(yōu)化器基于 Catalyst 設(shè)計,該設(shè)計器屬于 Spark SQL 的可擴(kuò)展優(yōu)化器。但最終之所以放棄了 Scala,是因為我們發(fā)現(xiàn)很難將基于 JVM 的語言嵌入至其他運(yùn)行時與語言當(dāng)中。

如果 Weld 主要針對 CPU 與 GPU,那么它與 RAPIDS 這類專門面向 GPU 的 Python 數(shù)據(jù)科學(xué)實現(xiàn)庫有什么不同?

Weld 項目與 RAPIDS 等其它系統(tǒng)的最大區(qū)別,在于它專注于跨越多種由 JIT 編譯代碼編寫的內(nèi)核實現(xiàn)應(yīng)用程序優(yōu)化,而非針對每一項獨(dú)立函數(shù)提供優(yōu)化效果。舉例來說,Weld 的 GPU 后端能夠為端到端應(yīng)用程序 JIT 編譯出經(jīng)過優(yōu)化的單一 CUDA 內(nèi)核,而不像其它系統(tǒng)那樣直接調(diào)用現(xiàn)有獨(dú)立內(nèi)核。此外,Weld 的 IR 意欲設(shè)計為硬件無關(guān)的,使其既能夠面向 GPU,也可以面向 CPU 或者矢量加速器等其它定制化硬件。當(dāng)然,Weld 也與其它系統(tǒng)有著不少交集,同時也受到了 RAPIDS 等其他同類項目的影響與啟發(fā)。Bohrium(一種懶惰評估式的 NumPy)以及 Numba(一套可實現(xiàn)數(shù)字代碼 JIT 編譯的 Python 庫)就與 Weld 有著相同的高級目標(biāo),而 Spark SQL 等優(yōu)化器系統(tǒng)則直接影響著 Weld 的優(yōu)化器設(shè)計思路。

除了數(shù)據(jù)科學(xué)庫優(yōu)化之外,Weld 項目是否還有其他應(yīng)用?

Weld 的 IR 最令人興奮的優(yōu)勢之一,在于其自身就支持?jǐn)?shù)據(jù)并行性。這意味著在 Weld IR 當(dāng)中表達(dá)的循環(huán)將始終可以安全實現(xiàn)并行化。這使 Weld 成為一種對新型硬件極具吸引力的 IR 解決方案。舉例來說,NEC 公司的合作者們演示了如何利用 Weld 在自定義高內(nèi)存帶寬矢量加速器上運(yùn)行 Python 工作負(fù)載——過程非常簡單,只需要向現(xiàn)有 Weld IR 添加新的后端即可。此外,IR 還可用于在數(shù)據(jù)庫內(nèi)實現(xiàn)物理執(zhí)行層,我們也在計劃添加一系列新的功能,使開發(fā)人員能夠?qū)?Python 的部分子集編譯為 Weld 代碼。

這些庫是否已經(jīng)準(zhǔn)備好應(yīng)用于實際項目?如果還沒有,你認(rèn)為大概什么時候能夠做好準(zhǔn)備?

我們測試過的大部分庫示例與基準(zhǔn)都提取自真實工作負(fù)載。因此,如果用戶愿意在自己的應(yīng)用程序當(dāng)中試用我們發(fā)布的當(dāng)前版本,提供反饋甚至編寫開源補(bǔ)丁,我們將不勝感激。換句話說,我們并不指望所有功能都能在現(xiàn)實應(yīng)用程序當(dāng)中立即使用。在接下來的幾個月內(nèi),我們將發(fā)布一系列發(fā)行版,專門關(guān)注 Python 庫的可用性與健壯性。我們的目標(biāo)是努力提升這些庫的質(zhì)量,將其逐步引入現(xiàn)實項目當(dāng)中,并在無法支持的情況下允許用戶順利回退至非 Weld 庫版本。

正如我在回答第一個問題時所提到,簡化整個流程的途徑之一,在于拆分注釋這個重要的相關(guān)項目。拆分注釋是一套系統(tǒng),允許用戶對現(xiàn)有代碼進(jìn)行注釋以定義其具體拆分、傳遞與并行化方法。根據(jù)我們的觀察,該系統(tǒng)能夠發(fā)現(xiàn) Weld 有望帶來最佳效果的優(yōu)化方向(例如在函數(shù)調(diào)用之間將大量數(shù)據(jù)保留在 CPU 緩存中,而非掃描完整數(shù)據(jù)集);更重要的是,由于其重用現(xiàn)有庫代碼,而非依賴于編譯器 IR,因此其集成難度要比 Weld 低得多。正因為如此,拆分注釋能夠使作為優(yōu)化目標(biāo)的庫更易于維護(hù)與調(diào)試,從而提高健壯性水平。當(dāng)無法支持 Weld 時,這些庫也可退回至拆分注釋,讓我們根據(jù)用戶提出的反饋以增量方式添加 Weld 支持,同時繼續(xù)采取可行的優(yōu)化操作。

 

責(zé)任編輯:張燕妮 來源: AI前線
相關(guān)推薦

2021-07-27 10:10:21

CuPyNumpyPython

2022-08-09 09:10:31

TaichiPython

2022-09-20 10:50:34

PandasNumPy

2018-11-26 14:56:15

云計算UCloud云主機(jī)

2023-05-04 07:34:37

Rust代碼CPU

2020-04-03 13:50:19

數(shù)據(jù)分析PandasNumPy

2019-08-06 17:19:22

開源技術(shù) 趨勢

2019-12-25 14:08:50

Pandas數(shù)據(jù)計算

2021-09-08 08:00:00

PyPolars數(shù)據(jù)開源

2021-04-21 18:57:16

二進(jìn)制存儲空間

2013-02-28 10:35:59

hadoop大數(shù)據(jù)Hortonworks

2019-06-06 10:19:33

谷歌開源計算庫

2024-07-17 08:25:44

2022-05-26 08:12:39

PandasApply技巧

2023-07-31 11:44:38

Pandas性能數(shù)組

2020-03-10 08:55:50

PandasNumPy函數(shù)

2023-10-15 17:07:35

PandasPython庫

2023-09-22 14:33:24

微軟Rust開發(fā)工具

2022-07-18 17:37:27

字節(jié)跳動人工智能AI模型

2020-05-03 13:52:27

深度學(xué)習(xí)開源人工智能
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號