有望取代Spark的實時機器學習框架Ray
一個新的項目旨在為實時處理開發一種速度更快的框架,可用來支持用Python編寫的機器學習應用。
加州大學伯克利分校實時智能安全執行實驗室(RISELab)的研究人員已開發出了一種新的分布式框架,該框架旨在讓基于Python的機器學習和深度學習工作負載能夠實時執行,并具有類似消息傳遞接口(MPI)的性能和細粒度。這種框架名為Ray,看起來有望取代Spark,業界認為Spark對于一些現實的人工智能應用而言速度太慢了;過不了一年,Ray應該會準備好用于生產環境。
Ray是率先從RISELab誕生的技術之一,加州大學伯克利分校的這個研究組織取代了曾大獲成功的AMPLab,后者開發出了一大批引人入勝的分布式技術,這些技術影響了高性能和企業計算,包括Spark、Mesos、Tachyon及其他技術。
計算機科學教授邁克爾·喬丹(Michael Jordan)是昔日AMPLab、今日RISAab的顧問之一,最近他在加州圣何塞舉行的Strata + Hadoop World大會上討論了Ray的核心原則和驅動因素。
喬丹在3月16日的主題演講中說:“之所以開發Spark,是由于我的學生抱怨Hadoop差強人意。他們抱怨,每當在邏輯回歸之類的操作中進行迭代,總是要面臨很長的延遲。”
喬丹繼續說:“馬泰·扎哈里亞(Matei Zaharia)是實驗室的學生之一,他聽到他們抱怨后說‘我會幫助你們解決這個問題。我會構建某種緩存系統,那意味著你不必一直去使用磁盤。這就是Spark的起源。”
他的學生們注意到扎哈里亞開發Spark后突然變得“多重要、多有名”;扎哈里亞后來順理成章地與他人創辦了Databricks,并成為了加州大學伯克利分校的對手:斯坦福大學的助理教授。
喬丹說:“所以現在是著眼于下一代技術的時候。他們說‘我們絕不會將一個項目交給搞系統的人。我們準備自己來搞。“所以這下一個項目由機器學習學生來搞,開發之初就抱著要取代Spark的目的。”
Ray由RISELab的兩名博士:菲利浦·莫里茲(Philipp Moritz)和羅伯特·西原(Robert Nishihara)開發而成。研究人員竭力構建一種框架,可以結合在實際環境下運行機器學習或基于深入學習的應用所需要的許多不同元素。據喬丹聲稱,研究人員將應用程序分解成了各組成部分,了解如何實際構建一個允許實時決策機制的端到端系統。
喬丹說:“你需要靈活性。你需要的不光光是組建神經網絡之類的東西,還需要規劃、搜索和模擬。這帶來了種種復雜的任務依賴關系。單單編寫MapReduce類型的范例(paradigm,又可譯成模式)就不是很容易。這種范例能編寫得出來,但是如果你有大不一樣的異構工作負載和任務,它執行起來不會非常高效。它需要適應算法的性能,因為系統在不斷學習。”
很顯然,喬丹指派Spark來完成MapReduce風格的編程。雖然Spark的速度比MapReduce快得多,但它仍然是MapReduce面向批處理的工作流程范例的一些核心元素。他表示,Ray避免了Spark使用的“塊同步”(block synchronous)范例,改用了速度更快的范例。
據喬丹聲稱,Ray的速度很快,處理單個任務時延遲只有微秒。它還可以處理異構硬件,一些應用工作負載在CPU上執行,另一些工作負載在在GPU上運行。Ray有許多調度程序可以統籌安排這一切。
它還會借鑒MPI的任務依賴屬性,MPI是低級分布式編程環境,高性能計算(HPC)領域的人士使用MPI來構建模型,模擬工作負載運行起來非常快。喬丹說:“我們其實也想達到那樣級別的性能。我們不是要取代MPI。但是我們希望能夠獲得與MPI一樣好的性能,但是要簡單得多,強大得大,而且不太依賴分布式平臺。”
喬丹在Strata大會上演示期間展示了Ray如何幫助數字機器人學會跑步。
喬丹將讓集群中的各個節點保持計算狀態,但是狀態會盡可能少,這將***限度地提高穩定性。他補充道:“不過需要注意可以在諸任務之間共享的狀態計算(stateful computation)。然后,我們顯然想要容錯機制,我們也會實現序列化運行,那樣我們就能輕松共享數據了。”
Ray框架目前正在開發中,不過還不是已完成的項目。有興趣的朋友可以看一看該項目放在Github上的初期測試版代碼(https://github.com/ray-project/ray)。
Ray對于開發一系列需要利用實際數據進行快速決策的應用將大有用處,比如自主駕駛或某些新興形式的人工智能輔助醫療所需要的那種應用。由于對這個領域做出的巨大貢獻,喬丹已被戲稱為“機器學習界的邁克爾·喬丹”,他認為Ray***的影響力將體現在強化學習(reinforcement learning)領域,而不是監督式學習系統。由于用來解決計算機視覺和分類問題的深度學習和神經網絡大行其道,監督式學習系統隨之流行起來。
他說:“當你開始更接近實際的決策時,不是僅僅想要模仿人類,而是想要找出***的決策。那就是強化學習范例。強化學習其實缺乏一種很好的系統級支持。”
Ray是用C ++編寫的,基本上旨在加快用Python開發的機器學習算法的執行速度。
Python腳本提交并執行作業(job),Ray使用Python的語法特性來表示對象和作業是如何運行的。如果你為某個函數添加了@ray.remote,這表明該函數可以跨集群異步執行。函數運行時,它會立即返回一個對象ID,之后可以查詢該ID,獲得該函數生成的任何最終結果。Ray的說明文檔表明了可以如何結合Python的列表推導(list comprehension),運行一系列函數,并自動返回結果。
雖然Ray處于初期測試版狀態,但它顯然是為了支持機器學習這個主要任務而開發的。說明文檔中給出的主要例子包括:超參數優化(這是機器學習框架的一種常見工作負載)和訓練人工智能網絡打乒乓球。還詳細介紹了如何將Ray與TensorFlow結合使用,包括如何借助深度學習系統,充分利用Ray的遠程對象模型方面的若干技巧。
喬丹表示,雖然Ray仍處于早期階段,還沒有準備好用于生產環境,但應該在一年內作好準備。他說:“我們其實會讓這種框架盡可能強大、穩定,但又盡量遵循學術界在激動人心的機器學習方面所要實現的目標。”