Ray Core
Ray Core 是一款功能强大的分布式计算框架,提供了包括 Tasks、Actor 和 Objects 在内的核心原语(Primitives),帮助用户高效构建和扩展分布式应用程序。
Tasks
Task 是 Ray 对普通函数的分布式封装,允许将任意函数在独立的 worker 进程上异步执行。
声明资源需求时,可以指定 CPU、GPU 或自定义资源,集群调度器依据这些需求将任务分配到合适的节点,从而实现跨节点的并行执行。
Tip
Task 是无状态的,每次调用之间不共享任何状态。每个任务独立执行,输入通过参数传递,而不是依赖于全局状态或共享变量。
Actors
Actor 将 Ray 的抽象从函数扩展到类,是 Ray 对有状态服务的原生支持。
Actor 本质上是一个长驻的有状态 worker。实例化 Actor 时,Ray 会为其专门创建一个 worker 进程,后续对该 Actor 方法的所有调用都会路由到同一个 worker,方法之间共享 worker 的内部状态。
Tip
Actor 是有状态的,能够在实例化后持续保持内部状态,直到销毁。它允许在任务之间共享状态,并支持 CPU、GPU 和自定义资源的声明。
| 维度 | Task | Actor |
|---|---|---|
| 抽象 | 函数 | 类 |
| 状态 | 无状态 | 有状态 |
| 生命周期 | 单次调用 | 长驻进程 |
Objects
Ray 不直接传递计算结果的值,而是通过远程对象(remote objects) 和对象引用(object refs) 来处理 Task 和 Actor 的输出。
- 远程对象:计算结果被存储在 Ray 集群的分布式共享内存对象存储(object store) 中,具体存放在哪个节点由 Ray 自动决定。
- 对象引用:持有引用的进程通过
object ref访问数据,无需关心对象的实际存储位置,Ray 会自动完成定位与传输。
Tip
Ray 通过解耦 "数据在哪" 和 "谁在用数据",实现了透明分布式计算,使得数据的位置对用户和程序透明,简化了分布式任务的处理。
Placement Groups
Placement Group(放置组)允许用户跨多个节点原子性地预留一批资源,确保所需资源要么全部分配成功,要么全部失败(避免死锁)。
| 调度策略 | 行为 | 适用场景 |
|---|---|---|
PACK |
尽量将资源集中在少数节点 | 提高数据局部性,减少网络开销 |
SPREAD |
将资源尽量分散到不同节点 | 提升容错性,避免单点故障 |
Tip
典型使用场景是对一组 Actor 或 Task 进行成组调度(gang scheduling),即要求所有成员同时启动。
Environment Dependencies
当 Ray 在远程机器上执行 Task 和 Actor 时,它们所依赖的运行环境(Python 包、本地文件、环境变量等)必须在远程机器上可用。Ray 提供两种解决方案:
| 方案 | 时机 | 适用场景 |
|---|---|---|
| Ray Cluster Launcher | 集群启动时预装 | 依赖固定、变化少 |
| Runtime Environments | Task/Actor 运行时动态安装 | 依赖灵活、需要隔离 |