前言
分布式计算是当下非常热门的技术。回顾计算的发展历程,不禁让人感叹越来越多的公司将工作负载[1]分布在计算机集群上。人们开发出了高效的计算方法来做到这一点,与此同时,扩展计算也变得越来越必要。这是因为虽然单台计算机的速度不断提高,但人们对大规模计算的需求仍然超出了单台机器的算力。
扩展计算不仅是必要的,而且极具挑战性,而Ray的出现大大简化了开发工作量。Ray使普通开发者也能轻松进行分布式计算,并且可以毫不费力地将Python脚本扩展到多个节点。Ray擅长处理数据密集型和计算密集型的计算任务(如数据预处理和模型训练),非常适合需要扩展的机器学习(Machine Learning,ML)计算任务。虽然在当前的技术环境下不借助Ray也可以扩展这两种类型的任务,但开发者可能需要为每种类型的任务使用不同的API和分布式系统。而且,管理多个分布式系统可能会导致混乱和低效。1
Ray 2.0于2022年8月发布,新增了Ray AI Runtime(AIR)功能,进一步提升了Ray在复杂机器学习计算任务上的能力。AIR是由库和工具组成的集合,可在单个分布式系统中轻松构建和部署端到端的机器学习应用程序。借助AIR,即使处理最复杂的工作流,也可以将其表示为单个Python脚本。这意味着用户可以预先在本地运行程序,从而大大提升调试和开发的效率。
因为可以使用持续增强的Ray机器学习库和第三方集成,所以数据科学家从Ray受益良多。Ray AIR能帮助用户快速实现想法原型,并更从容地从开发过渡到生产环境。与许多其他分布式系统不同,Ray原生支持GPU,这对于机器学习工程师尤为重要。为了支持数据工程师,Ray还与Kubernetes等工具紧密集成,并可以在多云环境中部署。
此外,用户还可以将Ray作为统一的计算层,以提供计算任务的扩展性、容错性、调度和编排。换言之,学习Ray对于各个岗位都具有非常大的价值。
目标读者
很可能你选择阅读本书的原因是你对Ray的某些功能感兴趣。也许你是一名分布式系统工程师,想了解Ray的引擎是如何工作的;也许你是软件开发者,对新技术感兴趣;或者,你是一名数据工程师,想评估Ray并与类似工具进行比较;又或者,你是机器学习工程师或数据科学家,需要找到扩展实验的途径。
无论你身处什么岗位,充分利用本书的关键都是熟练掌握Python编程。本书示例是用Python编写的,因此读者需要具备一定的Python知识。正如Python爱好者的口头禅——“明确胜于含蓄”,我们也在这里明确指出,读者需要熟练使用系统命令行,遇到问题时知道如何获取帮助,还要掌握设置编程环境的方法。
如果你以前没有接触过分布式系统,不用担心,因为本书涵盖零基础入门分布式系统所需的全部知识。除此之外,你可以在笔记本计算机上运行书中展示的大部分示例代码。不过,涵盖基础知识意味着无法对分布式系统的细节进行深入讲解。本书的重点是帮助开发者顺利掌握Ray,特别是如何在数据科学和机器学习实战中应用它。
本书后面章节的内容需要读者对机器学习有一定了解,但并不强求具备机器学习领域的经验。具体而言,读者应该对机器学习范式以及它与传统编程的区别有基本了解。读者还应掌握NumPy和Pandas的基础知识。此外,读者需要能流畅阅读TensorFlow和PyTorch示例。在API层面上,了解代码的执行流程就足够了,读者不需要知道如何编写模型。本书使用两个主流深度学习库(TensorFlow和PyTorch)的示例进行讲解,无论读者偏好哪个框架,都可以使用Ray来开发机器学习项目。
本书涵盖很多高级机器学习主题,但主要关注Ray以及如何使用它。书中讨论的机器学习示例对你来说可能是新的,可能需要多读几遍,但你仍然可以专注于Ray的API以及如何在实践中使用API。了解了阅读本书的要求,如下是你能从本书获得的知识:
● 如果你是数据科学家,Ray可为你提供创建分布式机器学习应用程序的新途径。你将学会如何在大规模集群中选择超参数,掌握大规模模型训练的实用知识,并学习先进的强化学习库。
● 如果你是数据工程师,你将学会使用Ray Dataset进行大规模数据导入,利用Dask on Ray等工具改进管道,并学会如何高效部署模型并进行扩展。
● 如果你是工程师,你将了解Ray的底层工作原理,如何在云端运行和扩展Ray集群,以及如何使用Ray与其他项目进行集成。
无论身处什么岗位,读者都可以学习以上所有主题。希望通过阅读本书,你能够掌握Ray的所有功能。
本书目标
本书的目标是帮助刚接触Ray的读者快速掌握并使用Ray。为了让读者理解Ray的底层核心思想,并掌握Ray的主要模块,我们精心选择了内容。阅读完本书后,你将能够自如地探索比书中内容更复杂的主题。
另外,读者应该知道,本书不是为了提供尽可能多的信息,比如API参考或权威指南。本书也不是使用手册或案例宝典,不能帮助你解决具体任务。本书的重点是帮助读者学习和理解Ray,通过有趣的示例入门Ray。
软件的发展和淘汰速度很快,但软件背后的基本概念通常变化不大,甚至可以跨越多个版本。本书试图在讲解知识和提供具体代码示例之间取得平衡。即使示例代码发生了更新,你在本书中的所学所得也并不是徒劳无功的。
虽然Ray的官方文档越来越完善,但我们相信专业的技术图书拥有项目文档难以企及的优势。优秀的技术书籍能激发读者对项目本身的兴趣,让原本没有兴趣的读者翻阅项目的API文档。希望本书也能成为广受欢迎的技术书籍。
本书内容
本书内容经过精心安排,引导读者从Ray的核心概念逐渐深入复杂主题。本书涉及的概念大多附有示例代码,你可以访问GitHub仓库(https://oreil.ly/learning_ray_repo)获取。
本书前3章通过实际示例介绍Ray作为分布式Python框架的基础知识。第4~10章介绍Ray高级库,并展示如何使用高级库创建应用程序。第11章对Ray的生态进行总结,并指导读者继续学习。
第1章系统介绍Ray的三层架构,即内核、库和生态。在本章中,读者将使用Ray的库运行首个示例,以初步了解Ray的功能。
第2章详细介绍Ray的基础知识,包括Ray的核心API。该章还会介绍Ray的任务和执行器是如何流畅地扩展Python函数和类的。读者还将了解Ray的系统组件以及它们如何协同工作。
第3章使用Ray Core实现一个分布式强化学习应用程序。读者将从头开始实现这个应用程序,并观察Ray在分发Python代码方面的灵活性。
第4章简要介绍强化学习,并展示Ray如何用RLlib实现重要概念。除了展示若干示例,我们还将深入探讨课程学习(Curriculum Learning,CL)和使用离线数据等高级主题。
第5章介绍高效调优超参数难在何处、Ray Tune的工作原理,以及如何在实践中将其应用于机器学习项目。
第6章介绍Ray Dataset,以及如何将其应用于其他数据处理系统。你还将学习如何与第三方工具(例如Dask on Ray)进行集成。
第7章介绍分布式模型训练的基础知识,并展示如何使用Ray Train与PyTorch等ML框架。该章还展示如何向模型添加自定义预处理器,如何使用回调函数监控训练过程,以及如何使用Tune调优模型的超参数。
第8章介绍如何部署训练好的ML模型,并使用API端点进行查询。该章还介绍Ray Serve如何处理在线推理及其架构,并展示如何在实践中使用Ray Serve。
第9章讨论如何配置、启动和扩展Ray集群以用于具体应用程序。你将学习Ray的集群启动器命令和自动扩展器,以及如何在云端设置集群。该章还将展示如何在Kubernetes上部署Ray以及使用其他集群管理器。
第10章介绍ML计算任务的统一工具集Ray AIR,它为训练模型或访问自定义数据源提供了许多第三方集成。
第11章介绍Ray生态中有趣的插件和扩展。
如何使用代码示例
读者可在本书的GitHub仓库(https://oreil.ly/learning_ray_repo)下载所有代码。GitHub仓库包含每章代码笔记的notebook文件夹。通过代码笔记,读者可以边阅读边运行,也可以根据指导在其他时间运行代码。
对于书中的示例,读者需要安装Python 3.7或更高版本。在创作本书时,Ray对Python 3.10的支持只是试验性的,因此建议不要使用高于3.9的Python版本[2]。所有代码示例都假定读者安装了Ray,并且每章都包含特定要求。所有示例都在Ray 2.2.0上进行了测试,建议读者在整本书中使用该版本。1
排版约定
本书中使用以下排版约定:
斜体(Italic)
表示新的术语、URL、电子邮件地址、文件名和文件扩展名。
等宽字体(Constant width)
用于程序清单,以及段落中的程序元素,例如变量名、函数名、数据库、数据类型、环境变量、语句以及关键字。
等宽粗体(Constant width bold)
表示应由用户直接输入的命令或其他文本。
尖括号内的文本(<Text in angle brackets>)
表示应由用户提供的值或由上下文确定的值替换的文本。
该图示表示一般性说明。
该图示表示警告或注意。
示例代码
可以从https://oreil.ly/learning_ray_repo下载补充材料(示例代码、练习、勘误等)。
这里的代码是为了帮助你更好地理解本书的内容。通常,可以在程序或文档中使用本书中的代码,而不需要联系O'Reilly获得许可,除非需要大段地复制代码。例如,使用本书中所提供的几个代码片段来编写一个程序不需要得到我们的许可,但销售或发布O'Reilly的示例代码则需要获得许可。引用本书的示例代码来回答问题也不需要许可,将本书中的很大一部分示例代码放到自己的产品文档中则需要获得许可。
非常欢迎读者使用本书中的代码,希望(但不强制)注明出处。注明出处时包含书名、作者、出版社和ISBN,例如:
Learning Ray,作者Max Pumperla、Edward Oakes和Richard Liaw,由O'Reilly出版,书号978-1-098-11722-1。
如果读者觉得对示例代码的使用超出了上面所给出的许可范围,欢迎通过permissions@oreilly.com联系我们。
O'Reilly在线学习平台(O'Reilly Online Learning)
40多年来,O'Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O'Reilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O'Reilly和200多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问http://oreilly.com。
如何联系我们
对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。
美国:
O'Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
要询问技术问题或对本书提出建议,请发送电子邮件至errata@oreilly.com.cn。
本书配套网站https://oreil.ly/learning-ray上列出了勘误表、示例以及其他信息。
关于书籍和课程的新闻和信息,请访问我们的网站https://oreilly.com。
我们在LinkedIn上的地址:https://linkedin.com/company/oreilly-media。
我们在Twitter上的地址:https://twitter.com/oreillymedia。
我们在YouTube上的地址:https://youtube.com/oreillymedia。
致谢
我们要感谢O'Reilly团队成员,在他们的帮助下,这本书得以顺利出版。特别感谢勤劳的编辑Jeff Bleiel,他给予了宝贵的意见和反馈。非常感谢Jess Haberman,他在写作的早期阶段和我们进行了许多富有成果的讨论,并保持开放的态度。我们还要感谢O'Reilly的许多人,包括Katherine Tozer、Chelsea Foster和Cassandra Furtado。
非常感谢所有审稿人的宝贵意见和建议,他们是Mark Saroufim、Kevin Ferguson、Adam Breindel和Jorge Davila-Chacon。我们还要感谢以各种方式协助我们完成本书的Anyscale同事,包括Sven Mika、Stephanie Wang、Antoni Baum、Christy Bergman、Dmitri Gekhtman、Zhe Zhang等人。
除此之外,我们还要衷心感谢Ray的贡献者团队和社区给予我们的支持与反馈,以及Anyscale的投资人对Ray项目的支持。
我(Max)还要感谢Pathmind团队在项目早期的支持,特别是Chris Nicholson,对于他多年以来的帮助,我的感激之情无以言表。特别感谢在写作过程中Winterhude的Espresso Society提供了上好的咖啡。越来越多基于GPT-3的工具也提供了很大的帮助。我还要对家人表示感谢,感谢他们的鼓励和耐心。一如往常,如果没有Anne,这一切都不可能实现,她总是在最关键的时刻给予我支持,即使工作占用了我的大部分精力。
[1] workload(工作负载)在本书中多译作计算任务(或简称为任务)。
[2] 翻译本书时,Ray的最新版本是2.6.1,已正式支持Python 3.10。