1.2 分布式计算框架
Ray的核心是分布式计算框架。本节只讲解基本的术语,第2章会深入讨论Ray的架构。简而言之,Ray设置并管理计算机集群环境,以便用户可以在集群环境中运行分布式任务。Ray集群由通过网络连接的节点组成。用户在位于主节点(head node)的驱动程序(driver,即程序根节点)上编写程序。驱动程序可以运行作业(job),即在集群节点上运行一系列任务。具体而言,作业的各个任务在工作节点(worker node)上的工作进程(worker process)中运行。图1.1展示了Ray集群的基本结构。注意,我们目前不关注节点之间的通信,图1.1仅展示了Ray集群的结构。
有趣的是,Ray集群也可以是本地集群,即仅由自己的计算机组成的集群。在这种情况下,只有一个节点,即主节点,包含驱动程序进程和一些工作进程。默认的工作进程数量是计算机上可用的CPU数量。
图1.1:Ray集群的基本结构
有了这些知识,就可以动手实现第一个本地Ray集群了。在各种主流系统中,都可以使用pip轻松安装Ray,命令如下:
通过pip install ray命令,只能安装Ray的基础部分。由于后文还想探索一些高级功能,因此需要安装其他库,即rllib、serve和tune,稍后我们将对其进行讨论[8]。根据系统的具体配置,安装命令可能无须使用引号。
接下来,启动Python会话。例如,可以使用ipython解释器,它非常适合简单的示例。在Python会话中,导入并初始化Ray:
如果你不想亲自输入命令,可以打开本章的Jupyter notebook(https://oreil.ly/j9ccz),并在代码notebook中运行代码。读者可以选择任意方式,但是一定要使用Python 3.7或更高版本[9]。
通过这两行代码,就可以在本地计算机启动Ray集群了。该集群可以利用计算机上所有可用的CPU内核作为工作节点。目前,Ray集群没有做太多工作,但很快就要处理任务。
用于启动集群的init函数是第2章深入探讨的6个基本API方法之一。总体而言,Ray Core API非常易于访问和使用。但由于它是相对底层的接口,因此使用它构建示例需要一定时间。第2章通过一个通用示例帮助读者熟悉Ray Core API,第3章将创建更复杂的强化学习示例。
在上述代码中,我们没有向ray.init(...)函数提供任何参数。如果你想在实际集群上运行Ray,则需要向init传递更多的参数。init调用方法通常被称为Ray客户端,用于与现有的Ray集群进行交互[10]。关于使用Ray客户端连接生产集群的更多内容,可参考Ray文档(https://oreil.ly/nNhMt)。
当然,如果你使用过计算集群,就会知道使用集群涉及许多陷阱和难点。例如,你可以在由云服务提供商[如Amazon Web Services(AWS)、Google Cloud Platform(GCP)或Microsoft Azure]托管的集群上部署Ray应用程序,每个云计算平台都需要好用的部署和运维工具。你也可以在自己的硬件设备上启动集群,或者使用诸如Kubernetes的工具部署Ray集群。在介绍了具体的Ray应用之后,第9章将再次介绍使用Ray Cluster扩展计算任务。
在介绍Ray的高级库之前,我们简要总结一下Ray作为分布式计算框架的两个基础组件:
Ray Cluster
该组件负责分配资源、创建节点,并确保节点正常运行。快速入门Ray Cluster的好方法是参考为其精心准备的入门指南(https://oreil.ly/rBUil)。
Ray Core
一旦集群运行起来,你就可以使用Ray Core API进行编程。可以遵循Ray Core的官方教程(https://oreil.ly/7r0Lv)学习该组件。