官术网_书友最值得收藏!

1.1 Ray是什么

Ray是為Python數(shù)據(jù)科學社區(qū)構建的靈活的分布式計算框架,它滿足所有分布式計算需求,廣受歡迎。

Ray易于入門,并且符合Python編程簡單便捷的特點。Ray的核心API非常精簡,有助于用戶高效創(chuàng)建分布式應用程序。用戶可以在筆記本計算機上高效地并行化Python程序,幾乎不需要任何修改即可將本地測試過的代碼擴展到集群上。Ray的高級庫易于配置,并且?guī)炫c庫之間支持無縫連接。其中一些庫,比如Ray的強化學習庫,無論是否以分布式的方式使用,都有希望成為獨立項目。雖然Ray的核心是用C++構建的,但它從一開始就是以Python為主[1]的框架,支持集成許多重要的數(shù)據(jù)科學工具,并且持續(xù)增長的Python生態(tài)也為Ray提供助力。

分布式Python并不是新出現(xiàn)的,Ray也不是該領域的首個框架(也不會是最后一個),但Ray提供了優(yōu)于其他框架的功能。組合使用Ray的模塊并進行自定義,就能輕松完成復雜的機器學習任務,不使用Ray則很難實現(xiàn)。Ray大大簡化了分布式計算,你可以利用熟悉并想要使用的Python工具靈活執(zhí)行復雜的計算任務。換句話說,通過學習Ray,你將掌握靈活的分布式Python機器學習。本書目標就是展示Ray的分布式計算功能。

在本章中,你將初步了解Ray的功能。我們將討論構成Ray的三層架構,即內(nèi)核、庫和生態(tài)。本章首先通過代碼示例展示Ray的特點,讀者可以將本章作為全書的導覽,后面的章節(jié)將詳細介紹Ray的API和組件。

1.1.1 Ray的淵源

編寫分布式系統(tǒng)極具挑戰(zhàn)性,需要專業(yè)的知識和豐富的經(jīng)驗,這是大多數(shù)人不具備的。理想情況下,分布式系統(tǒng)不會妨礙用戶,而是提供抽象化的方法讓用戶專注于本職工作。但實際上,正如Joel Spolsky指出的(https://oreil.ly/mpzSe),“某種程度上,所有復雜的抽象都是存在漏洞的”,因此讓計算機集群按照用戶意愿執(zhí)行任務無疑是困難的。許多軟件系統(tǒng)需要遠遠超出單臺服務器的資源。即使單臺服務器是足夠的,現(xiàn)代系統(tǒng)也需要具備容錯性和高可用性。這意味著需要在多臺服務器甚至多個數(shù)據(jù)中心上執(zhí)行計算任務,才能確保系統(tǒng)可靠運行。

即使你對機器學習(Machine Learning,ML)或人工智能(Artificial Intelligence,AI)不是特別熟悉,也一定聽說過該領域取得的新成果。這里只舉兩個示例,DeepMind的AlphaFold(https://oreil.ly/RFaMa)通過人工智能解決了蛋白質(zhì)折疊問題,OpenAI的Codex(https://oreil.ly/vGnyh)可協(xié)助軟件開發(fā)者進行開發(fā)工作。你可能還聽說過,機器學習系統(tǒng)通常需要大量的數(shù)據(jù)進行訓練,并且機器學習模型正變得越來越大。OpenAI在論文“AI and Compute”(https://oreil.ly/7huR_)中指出,訓練AI模型所需的算力呈指數(shù)級增長。OpenAI的AI系統(tǒng)所需的運算量以每秒千萬億次浮點運算(Peta FLoating-point Operations Per Second,PetaFLOPS)為單位,并且自2012年以來,每3.4個月就翻一番。

將算力需求與摩爾定律[2]相比,后者指出計算機中的晶體管數(shù)量每兩年翻一番。即使你對摩爾定律持樂觀態(tài)度,也可以看到ML中存在明顯的分布式計算需求。你還應該了解到,ML中的許多任務支持并行運行。所以,應盡量通過并行計算提高模型訓練的速度[3]

人們通常認為實現(xiàn)分布式計算很困難。正確的方法應該是不考慮單臺機器及其互操作,而是在集群上運行代碼的抽象方法。這樣用戶才能專注于AI計算任務。實現(xiàn)這樣的需求很難嗎?

加州大學伯克利分校的RISELab(https://oreil.ly/1zsMj)的研究人員創(chuàng)建了Ray來解決以上問題。通過分布式方式,RISELab正在研究加速計算的高效方法。不過,研究中涉及的計算任務非常靈活,現(xiàn)有框架無法支持。RISELab還希望創(chuàng)建支持分發(fā)任務的系統(tǒng)。通過合理的默認設置,使開發(fā)者專注于本職工作,不必考慮計算集群的具體細節(jié)。而且,最好讓開發(fā)者仍能繼續(xù)使用他們喜歡的Python工具。因此,Ray在設計上注重高性能和異構計算任務[4]。為了更好地理解這些要點,我們接下來仔細研究Ray的設計原則。

1.1.2 Ray的設計原則

Ray構建于若干設計原則之上。Ray的API簡單且通用、計算模型能提供充分的靈活性、系統(tǒng)架構兼具高性能和可擴展性。下面進行詳細介紹。

簡潔性和抽象性

Ray的API不僅高度簡潔,而且易于上手(詳見第2章)。無論是利用筆記本計算機上的所有CPU內(nèi)核,還是充分利用集群中的所有機器,都能輕松實現(xiàn)。開發(fā)者只需修改一兩行代碼,Ray代碼基本保持不變。與任何優(yōu)秀的分布式系統(tǒng)一樣,Ray在后臺管理任務分發(fā)和協(xié)調(diào)。這樣用戶就不必考慮分布式計算的機制。Ray提供了良好的抽象層,能讓用戶專注于自身工作。

由于Ray的API具有廣泛的適用性并符合Python編碼風格,因此很容易將Ray與其他工具集成。例如,Ray的執(zhí)行器(actor)可以調(diào)用現(xiàn)有的分布式Python計算任務,計算任務也可以調(diào)用執(zhí)行器。在這個意義上,因為Ray兼具高性能和強大的靈活性,支持在不同的系統(tǒng)和框架之間進行通信,所以非常適合作為分布式計算任務中的“膠水代碼”。

靈活性和異構性

對于AI計算任務,特別是在處理強化學習等任務時,用戶需要靈活的編程模型。Ray的API支持編寫靈活和可組合的代碼。簡單來說,如果你能用Python表明計算任務,就可以通過Ray進行分布式處理。當然,用戶需要確保有足夠的資源,并且要謹慎考慮分發(fā)的任務。但是,Ray不會限制開發(fā)者的操作。

Ray在計算的異構性方面也非常靈活。例如,假設你正在進行復雜的模擬。模擬通常可以分解為多個任務或步驟。其中一些步驟可能需要運行幾小時,而其他步驟只需要運行幾毫秒,但它們都需要快速調(diào)度和執(zhí)行。有時,模擬中的單個任務可能需要很長時間,但其他較小的任務支持并行運行,以免發(fā)生阻塞。此外,后續(xù)任務可能依賴上游任務的結(jié)果,因此你需要支持動態(tài)執(zhí)行并能很好地處理任務依賴項的框架。Ray在運行此類異構任務流時提供了充分的靈活性。

開發(fā)者還需要確保在資源使用上具有靈活性,而Ray支持異構硬件。例如,某些任務可能需要在GPU上運行,而其他任務在CPU內(nèi)核上運行效果最佳。Ray也提供了此種靈活性。

高性能和可擴展性

Ray的另一個設計原則是Ray執(zhí)行任務的速度很快。Ray每秒支持處理數(shù)百萬個任務,并且延遲非常低。Ray執(zhí)行任務的延遲達到毫秒級的水平。

為了使分布式系統(tǒng)快速運行,還需要良好的可擴展性。Ray在計算集群中分發(fā)和調(diào)度任務時非常高效,而且具備容錯性。第9章將詳細介紹Ray集群支持自動擴展,以適應高度彈性的計算任務。Ray的自動擴展器嘗試在集群中啟動或停止設備,以滿足當前的需求。這有助于最大限度地降低成本,并確保集群具有足夠的資源來運行計算任務。

在分布式系統(tǒng)中,問題不是會不會出現(xiàn)故障,而是何時出現(xiàn)故障。機器可能會發(fā)生故障、中止任務,甚至燃燒起火[5]。無論如何,經(jīng)過設計,Ray能夠快速從故障中恢復,這有助于提高整體速度。

由于尚未討論Ray的架構(第2章將介紹),暫時不清楚Ray的設計原則是如何實現(xiàn)的。接下來,我們把注意力轉(zhuǎn)向Ray在實踐中的具體功能。

1.1.3 Ray的三層架構:內(nèi)核、庫、生態(tài)

知道了Ray的淵源和設計原則,接下來介紹Ray的三層架構。這不是唯一的分類方式,但對于本書是最合理的:

● 底層的Python分布式計算框架,具有簡潔的核心API和用于集群部署的工具Ray Core[6]

● 由Ray開發(fā)者創(chuàng)建和維護的一組高級庫,其中包括Ray AIR,用于在常見的機器學習任務中使用庫的統(tǒng)一API。

● 持續(xù)蓬勃發(fā)展的項目生態(tài),Ray與許多知名項目建立了集成與合作關系,擴展了前兩層架構。

這里有很多內(nèi)容需要展開,本章其余部分將逐一研究這三層架構。

Ray的核心引擎及其API位于中心位置,其他所有內(nèi)容都是基于該引擎和API構建的。Ray的數(shù)據(jù)科學庫建立在Ray Core之上,并提供了特定領域的抽象層[7]。在實踐中,許多數(shù)據(jù)科學家可以直接使用這些庫,而機器學習或平臺工程師可能大量依賴Ray Core API開發(fā)工具和插件。Ray AIR可以看作連接Ray庫并處理常見任務的一致框架的封裝結(jié)構。Ray的第三方集成不斷增加,也為經(jīng)驗豐富的開發(fā)者提供了很好的入口。接下來,我們逐一探究每個層級。

主站蜘蛛池模板: 莲花县| 巴青县| 万州区| 新乡市| 略阳县| 钦州市| 彰化市| 淮滨县| 海丰县| 丁青县| 镇赉县| 武安市| 广西| 台湾省| 太原市| 寿阳县| 三河市| 天祝| 迭部县| 称多县| 东兴市| 亳州市| 环江| 龙江县| 平乡县| 小金县| 桃江县| 额尔古纳市| 宜城市| 阜宁县| 拉孜县| 衢州市| 嘉峪关市| 佳木斯市| 宁武县| 小金县| 拜城县| 胶南市| 北海市| 威信县| 汉沽区|