如果你的數(shù)據(jù)處理或服務器應用程序已經(jīng)超出了單臺計算機的處理能力,那么這本書就是為你準備的。你將探索分布式處理(純Python的無服務器實現(xiàn)),并學習如何:使用Ray Actor實現(xiàn)有狀態(tài)應用程序。在Ray中構建工作流管理。將Ray用作批處理和流處理的統(tǒng)一系統(tǒng)。使用Ray進行高級數(shù)據(jù)處理。使用Ray構建微服務。實現(xiàn)可靠的Ray應用程序。
編輯推薦
無服務器計算使開發(fā)人員可以專注于他們的應用程序,而不必擔心它們部署在哪里。使用Python中的Ray通用無服務器實現(xiàn),程序員和數(shù)據(jù)科學家可以隱藏服務器,實現(xiàn)有狀態(tài)應用程序,支持任務之間的直接通信,并訪問硬件加速器。
在這本書中,經(jīng)驗豐富的軟件架構實踐者Holden Karau和Boris Lublinsky展示了如何擴展現(xiàn)有的Python應用程序和管道,讓你能夠留在Python生態(tài)系統(tǒng)中,同時減少單點故障和手動調(diào)度的情況。對于那些渴望探索成功案例并了解決策和測量效果的軟件架構師和開發(fā)人員來說,使用Ray擴展Python是理想的選擇。
專家推薦
本書是一份簡明實用的指南,幫助你采用并有效使用Ray。憑借多年在數(shù)據(jù)系統(tǒng)和分布式計算領域的行業(yè)經(jīng)驗,Holden和Boris提供了Ray用戶所需的必b備指南。
Dean Wampler, PhD,
工程總監(jiān),加速研究平臺,IBM研究院
前言我們撰寫本書的初衷是為開發(fā)人員和數(shù)據(jù)科學家提供幫助,讓他們無需成為系統(tǒng)管理員即可使用Python 構建和擴展應用程序。對于那些需要處理日益復雜和龐大問題的個人和團隊來說,本書將是很有益的,這些問題從單線程解決方案發(fā)展到多線程,一直到分布式計算。盡管你可以在Java 中使用Ray,但本書使用Python,我們假設讀者對Python生態(tài)系統(tǒng)有一定了解。如果你不熟悉Python,推薦你閱讀OReilly 出版的優(yōu)秀書籍,例如Mark Lutz 的《Learning Python》和Wes McKinney 的《Python for Data Analysis》。無服務器是一個流行詞,盡管其名稱如此,但無服務器模型實際上仍然需要大量的服務器,只不過你不必顯式地管理它們。對于許多開發(fā)人員和數(shù)據(jù)科學家來說,無需擔心服務器細節(jié)即可神奇地擴展應用程序的前景非常誘人。另外,如果你喜歡深入研究服務器的細節(jié)、部署機制和負載均衡器,那么本書可能不太適合你,但我們希望你能將本書推薦給你的同事們。你將學到什么通過閱讀本書,你將學習如何利用現(xiàn)有的Python 技能使程序能夠擴展到單個機器之外。你將學習分布式計算的技術,從遠程過程調(diào)用到actor,一直到分布式數(shù)據(jù)集和機器學習。我們將在附錄A 中用一個接近真實的例子結束本書,該例子使用許多這些技術來構建可擴展的后端,同時與基于Python 的Web 應用程序集成并部署在Kubernetes 上。關于責任俗話說,能力越大,責任越大。Ray 等工具使你能夠構建處理更多數(shù)據(jù)和用戶的更復雜系統(tǒng)。重要的是不要因為解決問題有趣而過于興奮和沖動,要停下來思考你決策的影響。你無需花費很多功夫就可以找到一些關于善意工程師和數(shù)據(jù)科學家意外構建模型或工具的故事,這些模型或工具造成了毀滅性的影響,例如破壞了某國退伍軍人事務部的新支付系統(tǒng),或者使用了基于性別的歧視性招聘算法。我們要求你在使用新獲得的能力時牢記這一點,因為沒有人愿意因為錯誤的原因而出現(xiàn)在教科書上。排版約定本書采用以下排版約定。斜體(Italic)表示新術語、URL、電子郵件地址、文件名和文件擴展名。等寬字體(Constant Width)表示程序清單,在段落內(nèi)表示程序元素,例如變量、函數(shù)名稱、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關鍵字。斜體等寬字體(Constant width italic)表示應該替換成用戶提供值的文本,或者由上下文決定的值。許可一旦以印刷品的形式出版,并且不包括OReilly 的獨特設計元素(即封面藝術、設計格式、外觀和感覺)或OReilly 的商標、服務標志和商業(yè)名稱,本書則適用知識共享署名 非商業(yè)性 禁止演繹作品4.0 國際公共許可證(https://oreil.ly/z976G)。我們感謝OReilly 允許我們根據(jù)知識共享許可證提供本書。我們希望你選擇通過使用你的公司費用賬戶多本幾本書來支持本書(和作者)(這將是即將到來的下一個假日季節(jié)的絕佳禮物)。使用代碼示例Scaling Python Machine LearningGitHub 代碼庫(https://oreil.ly/scalingpython-with-ray-code)包含了本書的大部分示例。本書中的大多數(shù)示例都位于ray_examples 目錄中。有關Dask on Ray 的示例位于dask 目錄中,有關Spark on Ray 的示例位于spark 目錄中。如果你對使用代碼示例有任何技術問題,請發(fā)送電子郵件至bookquestions@oreilly.com。本書是要幫你完成工作的。一般來說,如果本書提供了示例代碼,你可以把它用在你的程序或文檔中。除非你使用了很大一部分代碼,否則無需聯(lián)系我們獲得許可。比如,用本書的幾個代碼片段寫一個程序就無需獲得許可,銷售或分發(fā)OReilly 圖書的示例集則需要獲得許可;引用本書中的示例代碼回答問題無需獲得許可,將書中大量的代碼放到你的產(chǎn)品文檔中則需要獲得許可。我們很希望但并不強制要求你在引用本書內(nèi)容時加上引用說明。引用說明一般包括書名、作者、出版社和ISBN,例如:Scaling Python with Ray by Holden Karau and Boris Lublinsky (OReilly). Copyright 2023 Holden Karau and Boris Lublinsky, 978-1-098-11880-8。如果你覺得自己對示例代碼的使用超出了上述許可范圍,請通過permissions@oreilly.com 與我們聯(lián)系。OReilly 在線學習平臺(OReilly Online Learning)近40 年來,OReilly Media 致力于提供技術和商業(yè)培訓、知識和卓越見解,來幫助眾多公司取得成功。公司獨有的專家和改革創(chuàng)新者網(wǎng)絡通過OReilly 書籍、文章以及在線學習平臺,分享他們的專業(yè)知識和實踐經(jīng)驗。OReilly 在線學習平臺按照您的需要提供實時培訓課程、深入學習渠道、交互式編程環(huán)境以及來自OReilly 和其他200 多家出版商的大量書籍與視頻資料。更多信息,請訪問網(wǎng)站:https://www.oreilly.com。聯(lián)系我們?nèi)魏斡嘘P本書的意見或疑問,請按照以下地址聯(lián)系出版社。美國:OReilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中國:北京市西城區(qū)西直門南大街2 號成銘大廈C 座807 室(100035)奧萊利技術咨詢(北京)有限公司勘誤、示例和其他信息可訪問https://oreil.ly/scaling-python-ray 獲取。對本書的評論或技術疑問,可以發(fā)電子郵件到errata@oreilly.com.cn。欲了解本社圖書和課程的新聞和信息,請訪問我們的網(wǎng)站http://oreilly.com。我們的LinkedIn:https://linkedin.com/company/oreilly-media。我們的Twitter:https://twitter.com/oreillymedia。我們的YouTube:https://youtube.com/oreillymedia。致謝我們要感謝Carlos Andrade Costa,他與我們共同編寫了第8 章。如果沒有本書所依托的社區(qū),這本書將無法完成。感謝Ray/Berkeley 社區(qū)和PyData 社區(qū)。感謝所有早期讀者和審稿人的貢獻和指導。這些審稿人包括Dean Wampler、Jonathan Dinu、Adam Breindel、Bill Chambers、Trevor Grant、Ruben Berenguel、Michael Behrendt 等。特別感謝Ann Spencer 審閱了最終成書前的早期提案,這些提案最終形成了這本書和Holden 與Mika Kimmin 合著的《Scaling Python with Dask》(OReilly)。衷心感謝OReilly 的編輯和制作團隊,特別是Virginia Wilson 和Gregory Hyman,幫助我們整理寫作并不懈努力地減少錯誤、錯別字等。任何剩余的錯誤都是作者的責任,有時是違背審稿人和編輯的建議。來自Holden我還要感謝我的妻子和伴侶們,他們?nèi)萑涛议L時間泡在浴缸里的寫作時光。特別感謝Timbit 守護房子,并給了我起床的理由(盡管往往比我喜歡的時間早了一點)。來自Boris我還要感謝我的妻子Marina,她容忍了我長時間的寫作,并且有時因為寫作而忽略了她好幾個小時。感謝我在IBM 的同事們,進行了許多有成效的討論,幫助我更好地理解Ray 的強大功能。
Holden Karau是Apache Spark的貢獻者,Apache軟件基金會成員,同時也是一位活躍的開源貢獻者。Boris Lublinsky是IBM Discovery Accelerator平臺的首席架構師,專注于Kubernetes、無服務器計算、工作流和復雜系統(tǒng)設計。
序 1
前言 3
第1 章 什么是Ray,它適合什么場景 .9
1.1 你為什么需要Ray 10
1.2 你可以在哪里運行Ray 11
1.3 用Ray 運行你的代碼 .13
1.4 Ray 在生態(tài)系統(tǒng)中的位置 .14
1.4.1 大數(shù)據(jù)/ 可擴展數(shù)據(jù)幀 .16
1.4.2 機器學習 .17
1.4.3 工作流調(diào)度 18
1.4.4 流處理 18
1.4.5 交互式 19
1.5 Ray 不適用于什么 19
1.6 總結 .19
第2 章 開始使用Ray(本地) 21
2.1 安裝 .21
2.1.1 為x86 和M1 ARM 安裝 .22
2.1.2 為ARM 安裝(源碼安裝) 22
2.2 Hello World .24
2.2.1 Ray 遠程函數(shù)(任務/Futures 對象)Hello World .24
2.2.2 Data Hello World .27
2.2.3 actor Hello World 28
2.3 總結 .30
第3 章 遠程函數(shù) 31
3.1 Ray 遠程函數(shù)的基本原理 .32
3.2 遠程Ray 函數(shù)的組合 .38
3.3 Ray 遠程函數(shù)的最佳實踐 .41
3.4 綜合示例42
3.5 總結 .44
第4 章 遠程actor .45
4.1 理解Actor 模型 .46
4.2 創(chuàng)建一個基礎的Ray 遠程actor 47
4.3 實現(xiàn)actor 的持久化.52
4.4 擴展Ray 遠程actor .57
4.5 Ray 遠程actor 的最佳實踐 62
4.6 總結 .63
第5 章 Ray 設計細節(jié) 65
5.1 容錯性 65
5.2 Ray 對象 69
5.3 序列化/pickling .72
5.3.1 cloudpickle .73
5.3.2 Apache Arrow 75
5.4 資源/ 垂直擴展 .75
5.5 自動縮放器 78
5.6 放置組:組織任務和actor 79
5.7 命名空間84
5.8 運行時環(huán)境中的依賴關系管理 85
5.9 使用Ray Job API 部署Ray 應用程序 86
5.10 總結 89
第6 章 實現(xiàn)流式應用 91
6.1 Apache Kafka 93
6.1.1 Kafka 基本概念 93
6.1.2 Kafka API 96
6.2 將Kafka 與Ray 集成 .98
6.3 擴展我們的實現(xiàn) .105
6.4 使用Ray 構建流處理應用程序 106
6.4.1 基于鍵的實現(xiàn) .108
6.4.2 鍵獨立方法 . 114
6.5 超越Kafka . 114
6.6 總結 115
第7 章 實現(xiàn)微服務 117
7.1 理解Ray 中的微服務架構 . 117
7.1.1 部署 . 118
7.1.2 部署的附加功能 121
7.1.3 部署組合 125
7.2 使用Ray Serve 進行模型服務 .127
7.2.1 簡單模型服務示例 127
7.2.2 模型服務實現(xiàn)的注意事項 129
7.2.3 基于Ray 微服務框架的推測模型服務 131
7.3 總結 133
第8 章 Ray 工作流 135
8.1 什么是Ray 工作流? 135
8.2 它與其他解決方案有何不同? 136
8.3 Ray 工作流功能 136
8.3.1 有哪些主要功能 136
8.3.2 工作流原語 .137
8.4 基本工作流概念實戰(zhàn) 138
8.4.1 工作流、步驟和對象138
8.4.2 動態(tài)工作流 .139
8.4.3 虛擬actor .140
8.5 工作流在現(xiàn)實生活中的應用 .141
8.5.1 構建工作流 .141
8.5.2 管理工作流 .142
8.5.3 構建動態(tài)工作流 144
8.5.4 構建具有條件步驟的工作流 145
8.5.5 處理異常 145
8.5.6 處理持久性保證 147
8.5.7 用虛擬actor 來擴展動態(tài)工作流148
8.5.8 與其他Ray 原語集成工作流 154
8.5.9 觸發(fā)工作流(連接到事件) 155
8.5.10 工作流元數(shù)據(jù) 157
8.6 總結 158
第9 章 Ray 的高級數(shù)據(jù)處理 161
9.1 創(chuàng)建和保存Ray 數(shù)據(jù)集 162
9.2 使用Ray 數(shù)據(jù)集與不同工具協(xié)同工作 164
9.3 在Ray 數(shù)據(jù)集上使用工具 .166
9.3.1 類pandas 的DataFrames 與Dask 167
9.3.2 索引 .168
9.3.3 洗牌 .169
9.3.4 易并行計算操作 176
9.3.5 處理多個DataFrame 177
9.3.6 無法正常工作的功能180
9.3.7 速度較慢的情況 180
9.3.8 處理遞歸算法 .181
9.3.9 其他功能的不同之處181
9.3.10 類似pandas 的Modin DataFrames 182
9.3.11 使用Spark 處理大數(shù)據(jù) 182
9.3.12 使用本地工具進行處理 183
9.4 使用Ray 數(shù)據(jù)集內(nèi)置操作 .183
9.5 使用Ray 實現(xiàn)數(shù)據(jù)集 187
9.6 總結 188
第10 章 Ray 如何助力機器學習 189
10.1 scikit-learn 與Ray 結合使用 189
10.2 Boosting 算法與Ray 結合使用 .194
10.2.1 使用XGBoost .194
10.2.2 使用LightGBM 196
10.3 PyTorch 與Ray 結合使用 198
10.4 強化學習與Ray 結合 204
10.5 超參數(shù)調(diào)優(yōu)與Ray 結合 211
10.6 總結 218
第11 章 在Ray 中使用GPU 和加速器 219
11.1 GPU 的優(yōu)勢 219
11.2 構建模塊 220
11.3 高級庫 221
11.4 獲取和釋放GPU 及加速器資源 222
11.5 Ray 的機器學習庫 222
11.6 使用GPU 和加速器的自動縮放器 223
11.7 CPU 回退設計模式 .224
11.8 其他(非GPU)加速器 225
11.9 總結 225
第12 章 Ray 在企業(yè)中的部署 227
12.1 Ray 依賴項安全問題 .227
12.2 與現(xiàn)有工具的交互 228
12.3 將Ray 與CI/CD 工具結合使用 228
12.4 Ray 的身份驗證 228
12.5 Ray 的多租戶 .230
12.6 數(shù)據(jù)源的憑證 231
12.7 永久集群與臨時集群 .231
12.7.1 臨時集群 231
12.7.2 永久集群 232
12.8 監(jiān)控 233
12.9 用Ray 指標檢測你的代碼 236
12.10 用Ray 包裝自定義程序 .238
12.11 總結 .240
附錄A 太空海貍案例研究:actor、Kubernetes 等 241
附錄B 安裝和部署Ray 259
附錄C 使用Ray 進行調(diào)試 . 273