使用Ray框架在Python中进行分布式处理

2025年3月4日 | 阅读 9 分钟

分布式处理简介

在当今的计算世界中,数据的生产和处理呈爆炸式增长。这种增长催生了对更强大的计算方法和基础设施的需求。分布式处理是一种旨在应对扩展计算能力以处理海量数据集和复杂算法的挑战的方法。这种方法将任务分布到多台机器上,从而实现并行执行。因此,它缩短了完成计算任务所需的时间。

什么是分布式处理?

分布式处理是一种计算模型,其中大型任务被分解成更小的任务,并在多台计算机或节点上同时运行。这些节点通过网络连接,并作为一个团队协同工作来完成作业。分布式处理的主要目标是提高计算能力,提高系统的可靠性,并达到单台机器无法实现的性能水平。

以下是分布式处理的关键优势:

  1. 可扩展性:通过将更多机器连接到网络,这些系统可以横向扩展,从而处理更大的工作负载。
  2. 容错性:如果一个节点发生故障,系统仍然可以继续工作,因为任务可以分布到剩余的节点上。
  3. 速度:通过在多个节点上并行执行任务,分布式计算可以缩短完成大型计算作业所需的时间。

什么是 Ray?

Ray 是一个开源工具,旨在简化 Python 中的并行和分布式计算。Ray 由加州大学伯克利分校的研究人员创建,非常适合将 Python 程序扩展到许多节点。这些程序可以包括数据处理、机器学习强化学习或实际部署模型。

Ray 的主要特点

Ray 具有一些关键特性,使其成为分布式计算的绝佳工具。

  1. 易用性: Ray 的设计宗旨是用户友好,其 API 类似于标准的 Python 代码。这使得开发人员能够以最小的改动实现代码的并行化。例如,要并行运行一个 Python 函数,只需在函数定义中添加 `@ray.remote` 装饰器。
  2. 可扩展性: Ray 具有高度的可扩展性,可以使应用程序从单台计算机扩展到拥有数千个节点的庞大集群。它负责将任务分发到可用资源上,从而无需管理底层基础设施即可轻松使用分布式计算。
  3. 灵活性: Ray 适应性强,用途广泛。无论您需要并行运行基本的数据处理任务、构建机器学习模型,还是处理有状态服务,Ray 都提供了完成工作所需的工具和构建块。
  4. 容错性: Ray 的设计考虑了故障处理。当节点发生故障时,它可以将任务转移到仍在运行的其他节点上进行恢复。这意味着使用 Ray 构建的分布式应用程序是健壮且可靠的。
  5. 支持分布式机器学习: Ray 与 TensorFlow 和 PyTorch 等流行的机器学习库配合良好。这使得分布式训练和超参数调优成为可能。它还包括专门的库,如 Ray Tune 用于调整超参数,Ray RLlib 用于分布式强化学习。
  6. 分布式对象存储: Ray 拥有分布式对象存储。这使得数据(对象)可以在不同的任务和机器学习执行器(有状态计算)之间移动。因此,它降低了与数据移动和序列化相关的成本。
  7. 高性能: Ray 的目标是实现高性能。它致力于降低延迟并提高吞吐量。它通过轻量级任务、高效调度和共享内存对象存储等特性来实现这一点。

Ray 的架构

Ray 的设计由几个关键部分组成,它们协同工作以实现分布式计算。

Ray 集群

Ray 集群包含一个头节点和一个或多个工作节点。头节点负责管理集群的整体状态,包括调度任务、管理资源和维护全局状态。工作节点执行头节点分配给它们的任务。

任务和 Actor

任务:Ray 将任务视为基本工作单元。这些函数在集群节点上并行运行。要定义任务,请使用 `@ray.remote` 装饰器。您可以使用 `.remote()` 方法运行它们。

Actor:机器学习代理在不同方法调用之间保持状态。它们对于需要持久化的作业很有用,例如在训练期间管理 ML 模型的状态。您也可以使用 `@ray.remote` 装饰器定义 Actor,但它是用于类而不是函数。

分布式对象存储

对象存储在 Ray 的架构中起着关键作用。它允许数据在集群的不同节点之间存储和访问。存储中的对象具有唯一的 ID,并且可以从集群中的任何节点访问这些对象,而无需序列化和反序列化它们。

调度器和执行器

Ray 拥有一个复杂的调度器,它根据资源可用性、任务依赖关系和负载均衡来分配任务到节点。工作节点上的执行器负责运行分配给它们的任务。

Ray 的用例

Ray 旨在成为一个有用的分布式处理系统,人们在许多应用程序中使用它,包括:

  1. 并行数据处理: Ray 有助于加速数据处理任务,这些任务在单台机器上需要很长时间才能完成。例如,您可以使用 Ray 通过将工作分布到多个节点上来更快地处理大型数据集。
  2. 分布式机器学习: Ray 非常适合大规模训练机器学习模型。它可以将训练过程分布到许多 GPU 或 CPU 上,从而缩短训练大型模型所需的时间。Ray 的库,如 Ray Tune 和 RLlib,就是为此目的而设计的。
  3. 超参数调优: 超参数调优用于调整机器学习模型的设置。Ray Tune 是一个基于 Ray 构建的库,它提供灵活的超参数调优。它支持各种优化算法,并与流行的机器学习框架集成。
  4. 强化学习: Ray RLlib 是一个灵活的强化学习库,它构建在 Ray 之上。它提供了高级抽象和算法,用于在分布式环境中训练强化学习代理。
  5. 部署机器学习模型: Ray Serve 是一个可扩展的模型部署库,允许您在生产环境中部署机器学习模型。它支持高吞吐量、低延迟的部署,并与现有的机器学习管道集成。
  6. 实时流处理: Ray 在构建需要处理大量数据流的连续数据处理系统方面发挥着作用。其分布式结构确保这些系统能够根据需求进行扩展。

示例:Ray 的基本用法

这是一个简单的指南,展示了 Ray 如何帮助并行化计算。

启动 Ray

设置一个 Ray 任务

并行运行任务

获取结果

输出

 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]   

此示例将 `compute_square` 函数展示为一个带有 `@ray.remote` 装饰器的 Ray 任务。该函数在不同核心上并行运行,`ray.get()` 用于收集结果。

开始使用 Ray

要开始使用 Ray,您需要设置系统、了解其主要组件,并运行第一个分布式程序。Ray 提供了一个易于使用且灵活的平台,用于在多台机器上运行程序。这可以帮助数据科学家加速他们的数据任务,并帮助 AI 工程师训练更大的模型。

安装 Ray

要开始使用 Ray,您首先需要安装它。您可以使用 Python 包管理器 pip 来安装 Ray。根据您的环境和需求,您有几种安装选项:

基本安装: 这是最简单的安装方式,包含 Ray 的核心功能。

带有额外库的安装: 如果您计划将 Ray 与 TensorFlow、PyTorch 等特定库一起使用,或者用于强化学习,您也可以添加这些额外项。

支持 TensorFlow 和 PyTorch

使用强化学习(包括 RLlib)

使用 Ray Tune 来调整超参数

使用 Ray Serve 来部署模型

启动 Ray

安装 Ray 后,您就可以在 Python 脚本中使用它了。任何 Ray 程序的第一步都是启动 Ray。您可以使用 `ray.init()` 函数来实现。

本地模式设置: 要在单台机器上进行开发和测试,您可以将 Ray 设置为本地模式。Ray 将使用您机器上的所有可用核心。

集群模式设置:要在一台集群上运行 Ray,您需要设置头节点和工作节点。在头节点上,像这样启动 Ray:

在工作节点上,如果设置正确,Ray 将连接到头节点。

编写和运行一个基本的 Ray 程序

设置 Ray 后,您可以通过定义远程函数并并行运行它们来开始编写第一个 Ray 程序。以下是一个简单的示例:

示例: 函数的并行执行

输出

 
[0, 1, 4, 9]   

说明

  • `@ray.remote` 装饰器将 `square` 函数转换为一个可以在任何可用工作节点上运行的远程函数。
  • `.remote()` 方法启动函数。此方法返回一个对象引用(一个 Future)。
  • `ray.get(futures)` 从对象引用中获取实际结果。
  • 这个简单的示例展示了 Ray 如何帮助运行原本会顺序执行的任务。

使用 Actor

在需要跨多个函数调用维护状态的更复杂场景中,您可以使用 Ray 的 Actor 模型。以下是如何在 Ray 中创建和交互 Actor:

示例: 使用 Actor 维护状态

输出

 
1
2   

说明

  • `@ray.remote` 装饰器增强了 `Counter` 类,将其转换为 Actor 类。
  • 我们使用 `.remote()` 创建这个类的实例(`counter`),然后可以调用它的方法。
  • Actor 在函数调用之间维护其状态(`value`),这对于需要持久性的任务非常有用。

设置 Ray 集群

对于大规模分布式应用程序,您可能需要在多台计算机上运行 Ray。设置 Ray 集群包括:

启动头节点

在头节点上,您使用以下命令启动 Ray:

此命令以头模式启动 Ray,并打开一个端口供工作节点连接。

启动工作节点

在每个工作节点上,您通过指定头节点的 IP 地址来连接到头节点:

将 `'head-node-ip'` 替换为头节点的实际 IP 地址。

运行分布式应用程序

设置集群后,您可以像在单台机器上一样运行 Ray 应用程序,但计算会分布到集群的各个节点上。

监控和调试

Ray 提供了用于监控和调试分布式应用程序的工具。

  • Ray Dashboard: Ray Dashboard 是一个 Web 界面,可提供集群的概览,包括节点、任务和 Actor 的状态。您可以通过在浏览器中访问 `http://:8265` 来查看仪表板。
  • 日志和跟踪: Ray 会记录任务和 Actor 的结果和状态。您可以在仪表板或运行 Ray 进程的终端中查看这些日志。
  • Ray CLI: Ray 命令行界面 (CLI) 提供各种命令来管理 Ray 集群,例如 `ray status`、`ray stop` 和 `ray submit`。

结论

分布式处理已成为处理大规模数据处理、机器学习和实时系统的必要手段。Ray 框架提供了一个强大而灵活的解决方案,用于在 Python 中构建和扩展分布式应用程序。凭借其简洁的 API,Ray 使您能够并行化任务、使用 Actor 管理状态,并将应用程序扩展到集群。

通过理解 Ray 的核心概念——例如任务、Actor、分布式对象和 Ray 集群——您可以充分利用分布式计算的潜力。无论您是在单台机器上运行还是在大型集群上运行,Ray 健壮的框架及其丰富的库都能让您创建高效、可扩展且容错的系统。随着您不断探索和测试 Ray,您将能够轻松应对项目中的复杂分布式计算挑战。