如果你的数据处理或服务器应用程序已经超出了单台计算机的处理能力,那么这本书就是为你准备的。你将探索分布式处理(纯Python的无服务器实现),并学习如何:使用Ray Actor实现有状态应用程序。在Ray中构建工作流管理。将Ray用作批处理和流处理的统一系统。使用Ray进行高级数据处理。使用Ray构建微服务。实现可靠的Ray应用程序。
编辑推荐
无服务器计算使开发人员可以专注于他们的应用程序,而不必担心它们部署在哪里。使用Python中的Ray通用无服务器实现,程序员和数据科学家可以隐藏服务器,实现有状态应用程序,支持任务之间的直接通信,并访问硬件加速器。
在这本书中,经验丰富的软件架构实践者Holden Karau和Boris Lublinsky展示了如何扩展现有的Python应用程序和管道,让你能够留在Python生态系统中,同时减少单点故障和手动调度的情况。对于那些渴望探索成功案例并了解决策和测量效果的软件架构师和开发人员来说,使用Ray扩展Python是理想的选择。
专家推荐
本书是一份简明实用的指南,帮助你采用并有效使用Ray。凭借多年在数据系统和分布式计算领域的行业经验,Holden和Boris提供了Ray用户所需的必b备指南。
Dean Wampler, PhD,
工程总监,加速研究平台,IBM研究院
前言我们撰写本书的初衷是为开发人员和数据科学家提供帮助,让他们无需成为系统管理员即可使用Python 构建和扩展应用程序。对于那些需要处理日益复杂和庞大问题的个人和团队来说,本书将是很有益的,这些问题从单线程解决方案发展到多线程,一直到分布式计算。尽管你可以在Java 中使用Ray,但本书使用Python,我们假设读者对Python生态系统有一定了解。如果你不熟悉Python,推荐你阅读OReilly 出版的优秀书籍,例如Mark Lutz 的《Learning Python》和Wes McKinney 的《Python for Data Analysis》。无服务器是一个流行词,尽管其名称如此,但无服务器模型实际上仍然需要大量的服务器,只不过你不必显式地管理它们。对于许多开发人员和数据科学家来说,无需担心服务器细节即可神奇地扩展应用程序的前景非常诱人。另外,如果你喜欢深入研究服务器的细节、部署机制和负载均衡器,那么本书可能不太适合你,但我们希望你能将本书推荐给你的同事们。你将学到什么通过阅读本书,你将学习如何利用现有的Python 技能使程序能够扩展到单个机器之外。你将学习分布式计算的技术,从远程过程调用到actor,一直到分布式数据集和机器学习。我们将在附录A 中用一个接近真实的例子结束本书,该例子使用许多这些技术来构建可扩展的后端,同时与基于Python 的Web 应用程序集成并部署在Kubernetes 上。关于责任俗话说,能力越大,责任越大。Ray 等工具使你能够构建处理更多数据和用户的更复杂系统。重要的是不要因为解决问题有趣而过于兴奋和冲动,要停下来思考你决策的影响。你无需花费很多功夫就可以找到一些关于善意工程师和数据科学家意外构建模型或工具的故事,这些模型或工具造成了毁灭性的影响,例如破坏了某国退伍军人事务部的新支付系统,或者使用了基于性别的歧视性招聘算法。我们要求你在使用新获得的能力时牢记这一点,因为没有人愿意因为错误的原因而出现在教科书上。排版约定本书采用以下排版约定。斜体(Italic)表示新术语、URL、电子邮件地址、文件名和文件扩展名。等宽字体(Constant Width)表示程序清单,在段落内表示程序元素,例如变量、函数名称、数据库、数据类型、环境变量、语句和关键字。斜体等宽字体(Constant width italic)表示应该替换成用户提供值的文本,或者由上下文决定的值。许可一旦以印刷品的形式出版,并且不包括OReilly 的独特设计元素(即封面艺术、设计格式、外观和感觉)或OReilly 的商标、服务标志和商业名称,本书则适用知识共享署名 非商业性 禁止演绎作品4.0 国际公共许可证(https://oreil.ly/z976G)。我们感谢OReilly 允许我们根据知识共享许可证提供本书。我们希望你选择通过使用你的公司费用账户多本几本书来支持本书(和作者)(这将是即将到来的下一个假日季节的绝佳礼物)。使用代码示例Scaling Python Machine LearningGitHub 代码库(https://oreil.ly/scalingpython-with-ray-code)包含了本书的大部分示例。本书中的大多数示例都位于ray_examples 目录中。有关Dask on Ray 的示例位于dask 目录中,有关Spark on Ray 的示例位于spark 目录中。如果你对使用代码示例有任何技术问题,请发送电子邮件至bookquestions@oreilly.com。本书是要帮你完成工作的。一般来说,如果本书提供了示例代码,你可以把它用在你的程序或文档中。除非你使用了很大一部分代码,否则无需联系我们获得许可。比如,用本书的几个代码片段写一个程序就无需获得许可,销售或分发OReilly 图书的示例集则需要获得许可;引用本书中的示例代码回答问题无需获得许可,将书中大量的代码放到你的产品文档中则需要获得许可。我们很希望但并不强制要求你在引用本书内容时加上引用说明。引用说明一般包括书名、作者、出版社和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 与我们联系。OReilly 在线学习平台(OReilly Online Learning)近40 年来,OReilly Media 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。公司独有的专家和改革创新者网络通过OReilly 书籍、文章以及在线学习平台,分享他们的专业知识和实践经验。OReilly 在线学习平台按照您的需要提供实时培训课程、深入学习渠道、交互式编程环境以及来自OReilly 和其他200 多家出版商的大量书籍与视频资料。更多信息,请访问网站:https://www.oreilly.com。联系我们任何有关本书的意见或疑问,请按照以下地址联系出版社。美国:OReilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中国:北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)奥莱利技术咨询(北京)有限公司勘误、示例和其他信息可访问https://oreil.ly/scaling-python-ray 获取。对本书的评论或技术疑问,可以发电子邮件到errata@oreilly.com.cn。欲了解本社图书和课程的新闻和信息,请访问我们的网站http://oreilly.com。我们的LinkedIn:https://linkedin.com/company/oreilly-media。我们的Twitter:https://twitter.com/oreillymedia。我们的YouTube:https://youtube.com/oreillymedia。致谢我们要感谢Carlos Andrade Costa,他与我们共同编写了第8 章。如果没有本书所依托的社区,这本书将无法完成。感谢Ray/Berkeley 社区和PyData 社区。感谢所有早期读者和审稿人的贡献和指导。这些审稿人包括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我还要感谢我的妻子和伴侣们,他们容忍我长时间泡在浴缸里的写作时光。特别感谢Timbit 守护房子,并给了我起床的理由(尽管往往比我喜欢的时间早了一点)。来自Boris我还要感谢我的妻子Marina,她容忍了我长时间的写作,并且有时因为写作而忽略了她好几个小时。感谢我在IBM 的同事们,进行了许多有成效的讨论,帮助我更好地理解Ray 的强大功能。
Holden Karau是Apache Spark的贡献者,Apache软件基金会成员,同时也是一位活跃的开源贡献者。Boris Lublinsky是IBM Discovery Accelerator平台的首席架构师,专注于Kubernetes、无服务器计算、工作流和复杂系统设计。
序 1
前言 3
第1 章 什么是Ray,它适合什么场景 .9
1.1 你为什么需要Ray 10
1.2 你可以在哪里运行Ray 11
1.3 用Ray 运行你的代码 .13
1.4 Ray 在生态系统中的位置 .14
1.4.1 大数据/ 可扩展数据帧 .16
1.4.2 机器学习 .17
1.4.3 工作流调度 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 远程函数(任务/Futures 对象)Hello World .24
2.2.2 Data Hello World .27
2.2.3 actor Hello World 28
2.3 总结 .30
第3 章 远程函数 31
3.1 Ray 远程函数的基本原理 .32
3.2 远程Ray 函数的组合 .38
3.3 Ray 远程函数的最佳实践 .41
3.4 综合示例42
3.5 总结 .44
第4 章 远程actor .45
4.1 理解Actor 模型 .46
4.2 创建一个基础的Ray 远程actor 47
4.3 实现actor 的持久化.52
4.4 扩展Ray 远程actor .57
4.5 Ray 远程actor 的最佳实践 62
4.6 总结 .63
第5 章 Ray 设计细节 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 运行时环境中的依赖关系管理 85
5.9 使用Ray Job API 部署Ray 应用程序 86
5.10 总结 89
第6 章 实现流式应用 91
6.1 Apache Kafka 93
6.1.1 Kafka 基本概念 93
6.1.2 Kafka API 96
6.2 将Kafka 与Ray 集成 .98
6.3 扩展我们的实现 .105
6.4 使用Ray 构建流处理应用程序 106
6.4.1 基于键的实现 .108
6.4.2 键独立方法 . 114
6.5 超越Kafka . 114
6.6 总结 115
第7 章 实现微服务 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 模型服务实现的注意事项 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 基本工作流概念实战 138
8.4.1 工作流、步骤和对象138
8.4.2 动态工作流 .139
8.4.3 虚拟actor .140
8.5 工作流在现实生活中的应用 .141
8.5.1 构建工作流 .141
8.5.2 管理工作流 .142
8.5.3 构建动态工作流 144
8.5.4 构建具有条件步骤的工作流 145
8.5.5 处理异常 145
8.5.6 处理持久性保证 147
8.5.7 用虚拟actor 来扩展动态工作流148
8.5.8 与其他Ray 原语集成工作流 154
8.5.9 触发工作流(连接到事件) 155
8.5.10 工作流元数据 157
8.6 总结 158
第9 章 Ray 的高级数据处理 161
9.1 创建和保存Ray 数据集 162
9.2 使用Ray 数据集与不同工具协同工作 164
9.3 在Ray 数据集上使用工具 .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 处理大数据 182
9.3.12 使用本地工具进行处理 183
9.4 使用Ray 数据集内置操作 .183
9.5 使用Ray 实现数据集 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 超参数调优与Ray 结合 211
10.6 总结 218
第11 章 在Ray 中使用GPU 和加速器 219
11.1 GPU 的优势 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 在企业中的部署 227
12.1 Ray 依赖项安全问题 .227
12.2 与现有工具的交互 228
12.3 将Ray 与CI/CD 工具结合使用 228
12.4 Ray 的身份验证 228
12.5 Ray 的多租户 .230
12.6 数据源的凭证 231
12.7 永久集群与临时集群 .231
12.7.1 临时集群 231
12.7.2 永久集群 232
12.8 监控 233
12.9 用Ray 指标检测你的代码 236
12.10 用Ray 包装自定义程序 .238
12.11 总结 .240
附录A 太空海狸案例研究:actor、Kubernetes 等 241
附录B 安装和部署Ray 259
附录C 使用Ray 进行调试 . 273