斯坦福開源Weld:高效實現數據分析的端到端優化

2020-12-25 CIO時代網

  導讀:Weld 是史丹福大學 DAWN 實驗室的一個開源項目,在 CIDR 2017 論文中描述了它的初始原型。Weld 用於對結合了數據科學庫和函數的現有工作負載進行優化,而無需用戶修改代碼。我們在 VLDB 2018 論文中提出了 Weld 的自適應優化器,並得出了一些可喜的結果:通過在 Weld IR 上自動應用轉換可以實現工作負載數量級的加速。消融研究表明,循環融合等優化具有非常大的影響。本文主要介紹如何使用 Weld 的自適應優化器進行數據分析的端到端優化。

  分析應用程式通常會使用多種軟體庫和函數,比如使用 Pandas 操作表,使用 NumPy 處理數字,使用 TensorFlow 進行機器學習。開發人員通過使用這些庫將來自各個領域的先進算法組合成強大的處理管道。

  然而,即使每個庫中的函數都經過精心優化,我們仍然發現它們缺少端到端的優化,在組合使用這些庫時會嚴重影響整體性能。例如,多次調用經過優化的 BLAS 函數(使用了 NumPy)要比使用 C 語言實現單次跨函數優化(如管道化)慢 23 倍。

  鑑於這種性能差距,我們最近提出了 Weld,一種用於分析工作負載的通用並行運行時。Weld 旨在實現跨多個庫和函數的端到端優化,而無需改變庫的 API。對於庫開發人員來說,Weld 既可以實現庫函數的自動並行化,也可以實現強大的跨函數優化,例如循環融合(loop fusion)。對於用戶而言,Weld 可以在不修改現有管道代碼的情況下帶來數量級的速度提升,也就是說數據分析師可以繼續使用 Pandas 和 NumPy 等流行庫的 API。

  Weld 為開發人員提供了三個主要組件,用於與其他庫集成:

  庫開發人員使用 Weld 的函數中間表示(Intermediate Representation,IR)來表達他們函數(例如映射操作或聚合)中的計算數據並行結構。

  然後,使用 Weld 的庫使用延遲評估運行時 API 將 Weld IR 片段提交給系統。Weld 將使用 IR 片段來自動跟蹤和調度對其他函數的調用。

  當用戶想要計算結果(例如將它寫入磁碟或顯示它)時,Weld 將使用優化編譯器對組合程序的 IR 進行優化和 JIT 編譯,這樣可以生成更快的並行機器代碼,然後基於應用程式內存中的數據執行這些代碼。

  在大多數情況下,用戶可以通過 import 語句切換到啟用了 Weld 的庫。

  我們在 CIDR 2017 論文中描述了最初的 Weld 原型。通過在 IR 上應用手動優化,Weld 在合成工作負載上表現出了數量級的速度提升,這些工作負載包含了來自單個庫和多個庫的函數。 

 VLDB 2018:Weld 的自動優化

  這個原型有一個很顯著的限制,IR 的優化是手動進行的,需要預先知道數據的相關屬性,例如聚合基數。簡單地說就是系統缺少自動優化器。為此,我們在 VLDB 2018 上發表的最新論文介紹了優化器的設計和實現,這個優化器可自動優化 Weld 程序。

  因為 Weld 試圖優化來自不同獨立庫的函數,所以我們發現,與實現傳統的資料庫優化器相比,在設計新的優化器時存在一些獨特的挑戰:

  計算高度冗餘。與人工編寫的 SQL 查詢或程序不同,Weld 程序通常由不同的庫和函數生成。因此,消除由庫組合產生的冗餘是至關重要的。例如,可以對中間結果進行管道化或緩存昂貴的公共子表達計算結果,避免多次計算。

  Weld 在進行數據依賴決策時不能依賴預先計算的統計數據。因此,Weld 需要在不依賴目錄或其他輔助信息的情況下優化 ad-hoc 分析。此外,我們發現,在沒有任何統計數據的情況下進行的優化可能會導致速度減慢 3 倍,這說明做出自適應的決策是多麼重要。

  為了應對這些挑戰,我們的優化器採用了雙管齊下的設計,結合了靜態的基於規則的優化(旨在消除冗餘,以生成高效的 Weld IR)和自適應優化(在運行時確定是啟用還是禁用某些優化)。

  使用新優化器的評估結果是很喜人的:在 10 個真實的工作負載上使用常用庫(如 NumPy 和 Pandas),Weld 可在單個線程上實現高達 20 倍的加速,並通過自動並行化實現進一步的加速。在評估 Weld 時,我們還分析了哪些優化對工作負載樣本產生的影響最大,我們希望這對該領域的進一步研究有所幫助。

  基於規則的優化:從循環融合到向量化

  Weld 的自動優化器首先會應用一組靜態的基於規則的優化。基於規則的優化從 Weld IR 輸入中查找特定模式,並用更有效的模式替換這些模式。Weld 基於規則的優化器在其閉合的 IR 上運行,這意味著每個優化的輸入和輸出都是相同的 IR。這種設計可以允許組合不同的規則並以不同的方式重新運行。

  優化器包含了很多用於生成高效代碼的規則,從摺疊常量到合併並行循環。其他一些最具影響力的基於規則的優化:

  循環融合,通過合併兩個循環來實現值的管道化,其中第二個循環直接消費第一個循環的輸入。管道化改進了 CPU 緩存中的數據位置,因為合併循環每次只從輸入中加載一個元素。

  向量化,它通過修改 IR 來生成顯式的 SIMD 向量化代碼。CPU 中的 SIMD 指令允許 CPU 在單個周期內完成更多工作,從而提高吞吐量。

  尺寸推斷,它通過分析 IR 來預先分配內存而不是動態增長緩衝區。這個優化避免了昂貴的庫調用,如 malloc。

  Weld 應用了其他額外的優化,在這篇論文中有描述 http://www.vldb.org/pvldb/vol11/p1002-palkar.pdf。

  自適應優化:從預測到自適應哈希表

  在使用基於規則的優化器轉換 IR 之後,Weld 進行了一系列自適應優化。自適應優化器不是直接替換 IR 中的模式,而是將 Weld 程序變成在運行時動態選擇是否應該應用優化。

  其中的一個示例是決定是否要預測一個分支。預測會將分支表達式(即 if 語句)轉換為無條件計算 true 和 false 表達式的代碼,然後根據條件選擇正確的選項。儘管預測代碼會做更多的工作(因為同時計算了兩個表達式),但它也可以使用 SIMD 運算符進行向量化,這與分支代碼不同。請看下面的示例:

  使用預測優化是否值得取決於兩個因素:運行 foo 的性能成本(例如 CPU 周期)和條件 x 的選擇性。如果 foo 計算很昂貴並且 x 很少是 true,那麼無條件地計算 foo(即使使用了向量指令)可能導致比使用默認分支代碼更差的性能。在其他情況下,使用 SIMD 並行化可以大幅提升速度。這裡的數據相關因子就是 x 的選擇性:這個參數在編譯時是未知的。

  Weld 的自適應優化器為預測生成代碼,用於對 x 進行採樣,以便在運行時獲得選擇性的近似。然後,根據獲得的測量值,將在運行時使用設置了閾值的成本模型來選擇是否進行預測。下面的代碼展示了自適應預測轉換:

  Weld 的自適應優化器還提供了一些其他的轉換:例如,在構建哈希表時,它可以選擇是否使用線程本地或原子全局數據結構,具體取決於鍵的分布和預期的內存佔用。在我們的論文中有更多相關內容。

  Weld 在數據科學工作負載方面的表現

  我們基於 10 個真實的數據科學工作負載對優化器進行評估,包括使用 NumPy 計算用於股票定價的 Black Scholes 方程、使用 Pandas 分析嬰兒名稱、使用 NumPy 和 TensorFlow 來增白圖像並基於它們訓練模型、使用 Pandas 和 NumPy 根據犯罪情況對城市進行評分,等等。結果如下:Weld 可以穩定地提升單個線程的性能,並自動並行化本機單線程庫。從下圖可以看出,Weld 的自動優化器可以有效地最小化因組合單個函數調用帶來的效率損失和生成快速的機器代碼。


  每種優化究竟有多重要?

  為了研究每個優化對工作負載有多大的影響,我們還進行了一項消融研究,我們逐個關閉每種優化,並測量對性能的影響。下面的圖表總結了我們分別在一個和八個線程上測試得到的結果。每個框中的數字表示禁用優化後的減速,因此數字越大意味著優化會產生更大的影響。實線下方的數字顯示了帶有合成參數(例如高選擇性與低選擇性)的工作負載,用以說明自適應優化的影響。最後,「CLO」列顯示了跨庫優化或跨庫函數優化的影響。

  總的來說,我們發現許多優化至少對一個工作負載具有中等以上的影響。此外,跨庫優化具有相當大的影響,即使在 Weld 對庫應用了優化之後,仍然可以將性能提高 3 倍之多。我們的研究還表明,一些優化非常重要:比如,循環融合和向量化對很多工作負載具有很大的影響。

  總結Weld 是一種新的方法,用於對結合了數據科學庫和函數的現有工作負載進行優化,而無需用戶修改代碼。我們的自動優化器得出了一些可喜的結果:我們可以通過在 Weld IR 上自動應用轉換來實現工作負載數量級的加速。我們的消融研究表明,循環融合等優化具有非常大的影響。

  Weld 是開源的,由 Stanford DAWN 負責開發,我們在評估中使用的代碼(weld-numpy 和 Grizzly,是 Pandas-on-Weld 的一部分)也是開源的,可在 PyPi 上獲得。這些包可以使用 pip 安裝:

  重要連結:

  Weld 官網:https://www.weld.rs/

  評估代碼 weld-numpy:https://www.weld.rs/weldnumpy

  評估代碼 Grizzly:https://www.weld.rs/grizzly

  CIDR 2017 論文:https://cs.stanford.edu/~matei/papers/2017/cidr_weld.pdf

  VLDB 2018 論文:http://www.vldb.org/pvldb/vol11/p1002-palkar.pdf

第三十屆CIO班招生 法國布雷斯特商學院碩士班招生 北達軟EXIN網絡空間與IT安全基礎認證培訓 北達軟EXIN DevOps Professional認證培訓

責編:zhangxuefeng

相關焦點

  • 阿里正式開源輕量級深度學習端側推理引擎「MNN」
    AI科學家賈揚清如此評價道: 「與 Tensorflow、Caffe2 等同時覆蓋訓練和推理的通用框架相比,MNN 更注重在推理時的加速和優化,解決在模型部署的階段的效率問題,從而在移動端更高效地實現模型背後的業務。這和伺服器端 TensorRT 等推理引擎的想法不謀而合。
  • 伯克利開源端到端深度強化學習方案,無需獎勵工程即可高效學習
    為此,我們開發出一種端到端新方法,允許機器人從描述任務成功完成的適度數量圖像中學習,從而擺脫對手動獎勵工程的依賴性。機器人能夠直接以這部分信息為起點開始學習(初始圖像約為 80 個),且偶爾向用戶查詢其它標籤。在這些查詢當中,機器人會向用戶展示圖像並要求用戶提供標籤以確定該圖像是否代表著任務已成功完成。
  • 騰訊優圖開源神經網絡框架 ncnn ,主打移動端
    ncnn 是騰訊優圖實驗室首個開源項目,是一個為手機端極致優化的高性能神經網絡前向計算框架,於今日正式開源。ncnn 從設計之初深刻考慮手機端的部署和使用。
  • 紐約大學提出端到端優化圖像壓縮方法,全面超越JPEG 2000 | ICLR...
    在ICLR 2017會議上,來自紐約大學的Johannes Balle 等研究者提出了一種端到端優化的圖像壓縮方法,並發表了論文:《End-to-End Optimized Image Compression》。這種方法包含了三個過程,分別是:非線性分析變換,均勻量化器,以及非線性合成變換。這些變換是在卷積線性濾波器和非線性激活函數的三個連續階段中構建的。
  • CVPR 2018 | 騰訊AI Lab、MIT等提出可端到端學習視頻的運動表徵
    儘管端到端的特徵學習已經取得了重要的進展,但是人工設計的光流特徵仍然被廣泛用於各類視頻分析任務中。為了彌補這個不足,由來自騰訊 AI Lab、MIT、清華、史丹福大學的研究者完成併入選 CVPR 2018 Spotlight 論文的一項研究提出了一種能從數據中學習出類光流特徵並且能進行端到端訓練的神經網絡:TVNet。機器之心對本論文進行了摘要介紹,詳情請參閱原論文。
  • 紐約大學提出端到端優化圖像壓縮方法,全面超越JPEG2000|ICLR2017
    雷鋒網按:數據壓縮是一種基礎工程問題,在數據存儲和有限容量信道傳輸中有重要的應用。圖像作為一種信息載體,數據量巨大,因此研究者們對圖像壓縮的研究從未停止過。在ICLR 2017會議上,來自紐約大學的Johannes Balle 等研究者提出了一種端到端優化的圖像壓縮方法,並發表了論文:《End-to-End Optimized Image Compression》。
  • CVPR 2018 | 騰訊AI Lab、MIT等機構提出TVNet:可端到端學習視頻的運動表徵
    為了彌補這個不足,由來自騰訊 AI Lab、MIT、清華、史丹福大學的研究者完成併入選 CVPR 2018 Spotlight 論文的一項研究提出了一種能從數據中學習出類光流特徵並且能進行端到端訓練的神經網絡:TVNet。機器之心對本論文進行了摘要介紹,詳情請參閱原論文。另外,該研究成果的 TensorFlow 實現已經發布在 GitHub 上。
  • 乾貨 | 支付寶如何優化移動端深度學習引擎?(含代碼)
    考慮到移動端資源的限制,深度學習引擎的落地面臨著性能、機型覆蓋、SDK尺寸、內存使用、模型尺寸等多個方面的嚴峻挑戰。本文介紹如何從模型壓縮和引擎實現兩個方面的聯合優化,應對上述挑戰,最終實現技術落地,希望對大家有所啟發。
  • 百度開源移動端深度學習框架mobile-deep-learning(MDL)
    為了讓更多移動端工程師能夠快速用輪子、專注業務,百度開源了全部相關代碼,社區也歡迎任何人加入到造輪子的開發過程中來。MDL 框架設計設計思路作為一款移動端深度學習框架,我們充分考慮到移動應用自身及運行環境的特點,在速度、體積、資源佔用率等方面提出了嚴格的要求,因為其中任何一項指標對用戶體驗都有重大影響。
  • Bengio等人提出 Char2Wav:實現端到端的語音合成
    目前,該研究團隊已經將相關的研究代碼開源並且公布了合成的樣本示例。讀者可點擊閱讀原文下載此論文。GitHub 開源地址:http://github.com/sotelo/parrot合成語音樣本地址:http://josesotelo.com/speechsynthesis摘要我們提出一種端到端的用於語音合成的模型 Char2Wav,其有兩個組成部分:一個讀取器(reader)和一個神經聲碼器(nerual vocoder)。
  • ARM Cortex-A55: 從端到雲實現高效能
    ARM Cortex-A55: 從端到雲實現高效能 廠商供稿 發表於 2017-06-26 17:53:32 你是否已經聽說了最近市場上發布了幾款新的 CPU?
  • 華為雲開源Volcano,夯實「雲邊端芯」能力
    華為雲PaaS產品部總經理廖振欽端邊雲全面協同,構建從雲到端「最後一公裡」計算能力如今,雲計算、大數據、人工智慧的相互融合,激發了企業數位化轉型和智能化變革的潛能,毋庸置疑,雲原生已經成為數位化轉型取代傳統應用的重要技術驅動力。
  • 用Bi-GRU+Attention和字向量做端到端的中文關係抽取
    一個小問題是,相同的關係label在復旦知識工廠中可能對應著不同的標註,比如「夫妻」,抓取到的數據裡有的是「丈夫」,有的是「妻子」,有的是「伉儷」等等,需要手動對齊。回顧整個過程,對於中文關係提取這個比較複雜的任務,我們的方法完全沒有構造n-gram、詞性、依存句法等複雜特徵,使用深度學習模型,甚至不需要中文分詞,只依靠字向量和大量訓練語料就得到了一個效果不錯的端到端模型。
  • 詳解Kafka端到端的延遲
    之前,我們有寫過白皮書《Optimizing Your Apache Kafka Deployment》,其中列出了配置Kafka部署以優化各種目標的指導原則。這篇文章將幫助你進一步獲得更好的直覺和對端到端延遲的理解,並配置和擴展您的應用程式的吞吐量,同時保持延遲的界限。
  • 深入了解那些知名的端到端機器學習平臺
    將一組機器學習解決方案轉變為端到端的機器學習平臺的,是一種運用了加速建模、自動化部署和確保生產中的可伸縮性和可靠性的技術的架構。筆者此前講過lean D/MLOps,數據和機器學習操作,因為沒有數據的機器學習操作是沒有意義的,所以端到端機器學習平臺需要進行整體構建。CI/CD基金會啟動了一個MLOps特別興趣小組(SIG)。
  • 智學網全新學生端APP上線,幫助孩子實現個性化精準學
    此次更新智學網專為學生量身定製了智學網學生端APP,為倡導健康、有益的學習內容,APP內不含任何不適用未成年人的、誘導收費的遊戲,內容上不含任何暴力、色情、低俗等信息,同時,所有功能堅決不向學生收費或由學生支付相關費用,為學生創設綠色學習環境,有效幫助教育教學實現減負增效,幫助學生實現個性化學習。
  • 智學網學生端APP專為學生打造,助力孩子高效學習
    此次更新智學網專為學生量身定製了智學網學生端APP,為倡導健康、有益的學習內容,APP內不含任何不適用未成年人的、誘導收費的遊戲,內容上不含任何暴力、色情、低俗等信息,同時,所有功能堅決不向學生收費或由學生支付相關費用,為學生創設綠色學習環境,有效幫助教育教學實現減負增效,幫助學生實現個性化學習。
  • DeepMind端到端對抗語音合成
    研究者表示,未來計劃將 COSPAR 用於優化規模更大的步態參數,但可能需要集成該算法與更多可用於高維特徵空間學習的技術。這一方法還可以擴展到預計算步態庫以外的數據,進而生成全新的步態或者控制器設計。本研究致力於優化下肢外骨骼 Atalante 的步態,以最大程度地提升用戶舒適度。COSPAR 算法詳解。
  • 阿里數據iOS端啟動速度優化的一些經驗
    7月26號我們阿里數據iOS端發布了4.4.0版本,這次版本主要是優化了性能,其中main()階段的啟動耗時優化成果比較明顯,從之前的0.5-0.7秒,降低為目前的0.1-0.2秒(main()第一行代碼到didFinishLaunchingWithOptions最後一行代碼的耗時),用戶體驗提升明顯。在這裡梳理一下優化的一些經驗,歡迎大家一起交流。
  • 端到端問答新突破:百度提出RocketQA,登頂MSMARCO榜首
    百度從面向端到端問答的檢索模型出發,提出了RocketQA訓練方法,大幅提升了對偶式檢索模型的效果,為實現端到端問答邁出了重要的一步。RocketQA已逐步應用在百度搜索、廣告等核心業務中,並將在更多場景中發揮作用。