Ray(分布式统一计算框架)
3 秒看懂
Ray 是一个开源分布式计算框架,由 UC Berkeley RISELab 孵化,旨在为 AI/ML 全生命周期(数据处理→训练→调参→服务)提供统一的编程接口和集群调度层。 它不是训练框架本身(不替代 PyTorch/TensorFlow),而是在其之上的”分布式操作系统”——把单机 Python 代码几乎原封不动地扩展到数千节点集群。商业公司 Anyscale 围绕 Ray 构建商业化产品,OpenAI 等头部 AI 实验室被多方报道为深度用户。
3 分钟产业解释
为什么需要 Ray?
在大模型时代,一个典型的 AI 工作流至少涉及 4 个独立环节:
| 环节 | 传统方案(碎片化) | Ray 的统一方案 |
|---|---|---|
| 数据预处理 | Spark / Dask / 自研脚本 | Ray Data |
| 分布式训练编排 | Horovod / DeepSpeed 手动集成 | Ray Train |
| 超参搜索 | Optuna / 自研循环 | Ray Tune |
| 模型服务 | TF Serving / Triton / vLLM 独立部署 | Ray Serve |
传统方案的痛点在于:每个环节需要独立的集群、独立的调度器、独立的序列化/通信协议,运维复杂度随规模呈超线性增长。
Ray 的核心价值主张:用一套统一的运行时和 API 覆盖以上所有环节,共享同一个集群资源池,通过自动扩缩容和细粒度调度降低成本。
产业位置
┌──────────────────────────────────────────────────────┐
│ 应用层 (LLM/推荐/RLHF...) │
├──────────────────────────────────────────────────────┤
│ ML 框架层 (PyTorch / TensorFlow / JAX) │
├──────────────────────────────────────────────────────┤
│ ★ Ray: 分布式编排 & 统一计算运行时 (本页) ★ │
│ (Ray Core → Ray Data/Train/Tune/Serve/RLlib) │
├──────────────────────────────────────────────────────┤
│ 资源管理层 (Kubernetes / YARN / 云 API) │
├──────────────────────────────────────────────────────┤
│ 硬件层 (GPU/TPU/InfiniBand/NVLink) │
└──────────────────────────────────────────────────────┘
Ray 位于 ML 框架与集群资源管理之间,是”AI 时代的中间件”。
15 分钟专家深入
历史脉络
| 时间 | 里程碑 | 意义 |
|---|---|---|
| 2017 | UC Berkeley RISELab 开源 Ray | RISELab 是 AMPLab(孵化了 Apache Spark)的继任实验室 |
| 2018 | OSDI 论文发表 | ”Ray: A Distributed Framework for Emerging AI Applications”,奠定学术地位 |
| 2019 | Anyscale 成立(Robert Nishihara、Ion Stoica 等) | 商业化推动 |
| ~2020 | Ray 1.0 发布 | API 稳定化,生产就绪信号 |
| ~2021 | Ray AIR (AI Runtime) 统一品牌 | 将 Tune/Train/Serve/Data 整合为统一产品叙事 |
| ~2022 | Ray 2.0 发布 | 架构重构:Ray Data 成为一等公民,统一数据-训练-服务流水线 |
| 2023-至今 | LLM 时代加速渗透 | 多方报道 OpenAI、Anyscale 与 LLM 训练/推理/RLHF 管线深度绑定 |
注:OpenAI 使用 Ray 的信息来自多家行业媒体报道及 Anyscale 公开引用,OpenAI 自身未正式发布详细技术栈白皮书确认全部细节。
创始团队的学术谱系
Ray 背后的核心团队与以下实验室/项目有直接传承关系:
- AMPLab → Apache Spark、Apache Mesos
- RISELab → Ray、Clipper(早期模型服务系统)
- Ion Stoica 是 Spark 和 Ray 的共同导师级人物
这意味着 Ray 在分布式调度理论、Actor 模型、共享内存对象存储方面有深厚学术积累。
技术原理(深度机制层)
1. 核心架构
┌─────────────────────────┐
│ Driver(用户进程) │
│ 提交 task / 创建 actor │
└──────────┬──────────────┘
│ gRPC
┌──────────▼──────────────┐
│ GCS (Global Control │
│ Store) — 全局元数据中心 │
│ · Actor 表 · Placement │
│ · 资源视图 · 失败恢复 │
└──────────┬──────────────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌────────▼────────┐ ┌───────▼───────┐ ┌────────▼────────┐
│ Head Node │ │ Worker Node │ │ Worker Node │
│ (GCS Server + │ │ │ │ │
│ Dashboard) │ │ ┌─────────┐ │ │ ┌─────────┐ │
│ │ │ │ Raylet │ │ │ │ Raylet │ │
│ │ │ │(本地调度+ │ │ │ │(本地调度+│ │
│ │ │ │ 资源管理) │ │ │ │ 资源管理)│ │
│ │ │ ├─────────┤ │ │ ├─────────┤ │
│ │ │ │Plasma │ │ │ │Plasma │ │
│ │ │ │Object │ │ │ │Object │ │
│ │ │ │Store │ │ │ │Store │ │
│ │ │ │(共享内存) │ │ │ │(共享内存)│ │
│ │ │ └─────────┘ │ │ └─────────┘ │
│ │ │ Worker 进程 │ │ Worker 进程 │
└──────────────────┘ └───────────────┘ └─────────────────┘
2. 两种编程原语:Task 与 Actor
这是 Ray 的核心抽象,直接映射到分布式执行:
Task(无状态远程函数):
@ray.remote
def process_data(data):
# 无状态,可被任意调度到任何 worker
return heavy_computation(data)
# 提交远程任务,返回 ObjectRef(future)
ref = process_data.remote(data)
# 按需获取结果
result = ray.get(ref)
Actor(有状态远程对象):
@ray.remote
class ParameterServer:
def __init__(self, model):
self.model = model
def update(self, gradients):
self.model.apply_gradients(gradients)
def get_weights(self):
return self.model.get_weights()
# 在集群中创建一个有状态的 Actor 实例
ps = ParameterServer.remote(model)
ps.update.remote(gradients)
关键设计决策:
- Task 通过 Ray 的分布式调度器全局调度,适合数据并行的无状态计算
- Actor 绑定到特定节点,维护状态(如模型权重、环境状态),适合有状态的服务或 RL 环境
- 两者都通过 ObjectRef(类似 future/promise)进行异步数据流编排
3. 分布式对象存储(Plasma)
Ray 内嵌了一个基于共享内存的分布式对象存储(源自 Apache Arrow 的 Plasma 项目):
- 节点内:通过共享内存(shared memory)实现零拷贝数据传递——同一节点上的 Task/Actor 直接读取共享内存段,避免序列化/反序列化开销
- 节点间:当某个 ObjectRef 对应的数据不在本地时,Raylet 自动从远程节点拉取
- 对象不可变:一旦写入 Plasma 的对象不可修改(immutable),这简化了一致性模型,但也是设计约束
这正是 Ray 相比纯消息传递框架的核心性能优势:大量 AI 工作负载涉及大型 NumPy/PyTorch 张量在不同计算步骤间传递,共享内存零拷贝可带来数量级的延迟降低。
4. 调度架构
Ray 采用两层调度:
| 层级 | 组件 | 职责 |
|---|---|---|
| 全局调度 | GCS + Global Scheduler | 将 Task/Actor 分配到节点(考虑资源、亲和性、数据局部性) |
| 本地调度 | Raylet (每节点一个守护进程) | 在节点内部将 Task 分配到具体 CPU/GPU 核;管理本地资源(CPU slots、GPU、内存) |
性能优化:对于本地可满足的任务,Raylet 直接在本地调度,绕过全局调度器以降低延迟。这是 Ray 能支撑毫秒级小任务的关键。
5. 自动扩缩容(Autoscaler)
Ray 内置集群 Autoscaler:
- 监控任务队列深度和资源利用率
- 自动向底层资源管理器(Kubernetes、云 API)申请/释放节点
- 支持对 Ray on K8s (KubeRay) 的原生集成
6. Ray AI 库栈(Ray 2.x)
┌────────────────────────────────────────────────────┐
│ Ray Serve │ Ray Train │ Ray Tune │
│ (模型服务推理) │ (分布式训练) │ (超参搜索) │
├────────────────────────────────────────────────────┤
│ Ray Data(分布式数据管道) │
│ · 流式读取 · 映射/转换 · 与 Train 无缝衔接 │
├────────────────────────────────────────────────────┤
│ Ray Core(Task/Actor/Object Store) │
├────────────────────────────────────────────────────┤
│ Cluster Manager / Autoscaler │
└────────────────────────────────────────────────────┘
Ray Train 本身不做梯度计算——它是一个编排层,负责:
- 设置分布式环境变量
- 在多个 Worker 上启动 PyTorch DDP / DeepSpeed / HuggingFace Accelerate 等
- 管理 checkpointing、容错、弹性训练
Ray Serve 的特点:
- 支持复杂 DAG 部署(多模型 pipeline、shadow testing、A/B 测试)
- 动态批处理(dynamic batching)
- 可独立扩展每个模型副本
- 与 Ray Core 的 Actor 模型深度整合——每个 Serve Replica 就是一个 Ray Actor
技术演进史
| 阶段 | 时间 | 核心特征 |
|---|---|---|
| 学术原型期 | 2017-2019 | Ray Core + RLlib;定位为强化学习的分布式运行时 |
| 平台化期 | 2019-2021 | 加入 Tune、Serve;开始服务通用 ML 工作负载 |
| 统一 AI Runtime 期 | 2021-2022 | Ray AIR 品牌统一;Ray Data 升级为一等公民 |
| LLM 基建期 | 2022-至今 | 深度整合 LLM 训练/推理/RLHF 管线;Anyscale 推出 Anyscale Platform(商业版);开源 Anyscale 托管的 RayTurbo 引擎 |
关键架构变迁:
- Ray 1.x → 2.x:GCS 从 Redis-based 演进为内置 GCS Server(减少外部依赖、提升可靠性);Ray Data 从实验性质变为数据-训练-服务统一管线的核心
技术路线对比
| 维度 | Ray | Apache Spark | Dask | Kubeflow | 纯 K8s + 手动编排 |
|---|---|---|---|---|---|
| 核心抽象 | Task + Actor(动态 DAG) | RDD/DataFrame(批/流) | Task + Delayed(动态 DAG) | K8s CRD + Pipeline | Pod + Service |
| 原生 Python 生态 | ★★★★★ | ★★☆ (PySpark 有限) | ★★★★★ | ★★★☆ | N/A |
| ML 训练编排 | 原生(Ray Train) | 无(需外部框架) | 有限 | 原生(但较重) | 手动 |
| 模型服务 | 原生(Ray Serve) | 无 | 无 | KServe(独立) | Triton/vLLM 等 |
| 细粒度低延迟任务 | ★★★★★(毫秒级) | ★★☆(批处理导向) | ★★★☆ | N/A(编排层) | 取决于实现 |
| 大规模数据 ETL | ★★★☆(改进中) | ★★★★★ | ★★★★☆ | N/A | N/A |
| 状态管理 | Actor 原生支持 | 无原生支持 | 有限 | 无 | 手动 |
| 运维复杂度 | 中(需理解 Ray 概念) | 高 | 低-中 | 高 | 非常高 |
| GPU 调度成熟度 | 中-高(持续改进) | 低 | 低 | 中 | 中(取决于调度器) |
| 社区/生态成熟度 | 中-高(增长快) | 非常高 | 中 | 中 | N/A |
总结:Ray 的独特定位是 “Python-native + 细粒度任务 + 有状态 Actor + ML 全栈”。Spark 主导大数据 ETL;Dask 是轻量 Python 并行;Kubeflow 是 K8s 上的 ML pipeline 编排工具集;Ray 尝试用一个运行时统一以上场景。
上下游
上游依赖
| 层级 | 具体技术 | 关系 |
|---|---|---|
| 编程语言 | Python, C++ (核心运行时) | Python API 是主要用户接口 |
| 序列化/数据 | Apache Arrow (Plasma object store) | 对象存储层直接复用 Arrow 的 Plasma |
| 通信 | gRPC(节点间控制面), 共享内存(节点内数据面) | — |
| 集群管理 | Kubernetes (KubeRay Operator), 云 API | KubeRay 是主流部署方式 |
| ML 框架 | PyTorch, TensorFlow, JAX, HuggingFace Transformers | Ray Train 封装这些框架进行分布式训练 |
| GPU 通信 | NCCL (通过 PyTorch DDP/DeepSpeed) | Ray 自身不直接实现 AllReduce,而是编排 |
下游消费者
| 消费者 | 使用方式 |
|---|---|
| AI 研究团队 | 用 Ray Tune 做大规模超参搜索;用 Ray Train 做分布式训练 |
| LLM 训练/推理平台 | 数据预处理(Ray Data) → 训练(Ray Train+DeepSpeed) → 服务(Ray Serve/vLLM on Ray) |
| 推荐系统 | 特征工程 + 在线推理服务 |
| 强化学习 | RLlib 提供分布式 RL 训练和环境仿真 |
| MLOps 平台 | 作为底层计算引擎(如 Anyscale Platform) |
关键指标
| 指标 | 数值/状态 | 说明 |
|---|---|---|
| GitHub Stars | ~34k+(截至 2024 年中,估算) | 开源社区活跃度的粗略代理 |
| 集群规模上限 | 数千节点级别 | Anyscale 官方案例中有大规模部署描述,具体上限取决于工作负载 |
| 任务调度延迟 | 亚毫秒~毫秒级(本地任务) | 本地 Raylet 调度路径极短 |
| 对象存储吞吐 | 取决于共享内存带宽 | 节点内零拷贝;节点间受限于网络 |
| 支持语言 | Python(主要), Java, C++ | Python 是绝大多数用户的选择 |
| 容错机制 | Task/Actor 自动重试 + lineage-based 重建 | Actor 支持 checkpoint + 重启 |
| 调度策略 | 默认基于资源的贪心调度;支持 Placement Group 和自定义调度策略 | Placement Group 用于保证亲和性(如 GPU 节点拓扑感知) |
供需与市场数据
需求侧驱动力
- LLM 训练/推理规模爆炸:单模型训练动辄数千 GPU,传统手动编排已不可行
- RLHF 管线复杂性:涉及多阶段(SFT→Reward Model→PPO/DPO),每阶段资源需求不同,需要弹性调度
- GPU 资源稀缺:统一集群调度可提升 GPU 利用率(避免各环节独立集群的资源碎片化)
- Python 生态主导:AI 研发几乎全部用 Python,Ray 的 Python-native 特性是刚需
供给侧格局
| 供应商/项目 | 产品 | 定位 |
|---|---|---|
| Anyscale(商业公司) | Anyscale Platform, RayTurbo | Ray 的商业化托管平台(SaaS + 私有部署) |
| Ray OSS | ray (PyPI) | 开源版本,社区维护 |
| AWS | Amazon SageMaker 分布式训练 | 底层集成了 Ray 组件(具体集成深度需据实确认) |
| 云厂商 | 各家 K8s 托管服务 + KubeRay | 基础设施层支持 |
Anyscale 融资(公开报道信息,具体金额以官方公告为准)
| 轮次 | 时间(约) | 金额(报道口径) |
|---|---|---|
| Series B | ~2020 | 报道约 $40M 量级 |
| Series C | ~2021 | 报道约 $100M,估值报道约 $1B 量级 |
| Series D | ~2023 | 报道约 $100M,估值报道约 $2.5B 量级 |
注:以上为多家科技媒体报道的概数,Anyscale 未在公开 SEC 文件中披露全部细节,请以官方公告为准。
代表公司与资本映射
| 公司/组织 | 与 Ray 的关系 | 上市/融资状态 |
|---|---|---|
| Anyscale | Ray 创始团队创立的商业公司 | 私有(如上融资) |
| OpenAI | 多方报道为 Ray 深度用户(用于内部训练/推理编排),未官方确认完整技术栈 | 私有 |
| Uber | 公开案例:用 Ray 支撑大规模 ML 管线 | 上市 (UBER) |
| Spotify | 公开案例:推荐系统 | 上市 (SPOT) |
| Ant Group (蚂蚁集团) | 多方报道在 ML 基础设施中使用 Ray | 私有 |
| Intel | Ray 开源贡献者,Intel 优化相关的合作 | 上市 (INTC) |
| Amazon (AWS) | SageMaker 与 Ray 有集成 | 上市 (AMZN) |
| Google Cloud | Vertex AI 与 Ray 的互操作性支持 | 上市 (GOOGL) |
投资映射思路:
- 直接受益:Anyscale(未上市)
- 间接受益:GPU 供应商(NVIDIA)、云厂商(通过提升 GPU 集群利用率降低客户 TCO)、采用 Ray 提升研发效率的 AI 公司
投资逻辑
看多逻辑
- LLM 时代的”分布式操作系统”刚需:随着模型规模和集群规模同步扩大,统一调度编排层的市场空间确定性高
- 事实标准地位:OpenAI(据多方报道)+ 众多头部 AI 公司的采用形成了强网络效应;学术引用量高
- Python 生态壁垒:AI 研发几乎 100% Python,Ray 的 Python-native 优势是结构性的
- Anyscale 的商业化路径清晰:开源漏斗 → Anyscale Platform SaaS → 企业私有部署
- 向上整合潜力:Ray 作为中间件,有可能逐步吸收更多 ML 框架层功能(如数据处理、特征工程)
看空/风险
- 云厂商自建替代:AWS、Google、Azure 可能在自己的 ML 平台中内置类似功能,挤压 Anyscale 的独立市场空间
- Kubernetes 生态竞争:KubeFlow、Knative 等 K8s 原生方案持续演进;K8s 本身也可能增加更智能的调度能力
- 技术风险:Ray 的复杂性持续增长(Core + 6-7 个子库),维护和稳定性挑战加大
- Moat 验证期:开源框架的商业化从来不容易(参见 Databricks 之于 Spark 的漫长商业化路径,且 Databricks 有 Spark 的大数据市场作为基本盘,Ray 的 ML 中间件市场更窄)
- OpenAI 依赖风险:如果核心大客户自建替代方案(OpenAI 有动力和能力自研)
关键观察点
- Anyscale ARR 增速和客户集中度
- Ray 在非 OpenAI 客户中的渗透率
- KubeRay 的 K8s 社区采纳度
- Ray Data vs Spark/Dask 在 ML 数据管道中的竞争态势
- vLLM、TensorRT-LLM 等推理引擎与 Ray Serve 的整合深度
常见误读纠偏
误读 1:“Ray 是一个训练框架,和 PyTorch 竞争”
纠正:Ray 不是训练框架。Ray Train 不做梯度计算,它是编排层——负责在多个节点上启动 PyTorch DDP / DeepSpeed / HuggingFace Trainer 等实际训练框架。类比:Ray 是”交响乐指挥”,PyTorch 是”乐器”。两者是互补关系,不是竞争关系。
误读 2:“Ray 只适合强化学习”
纠正:Ray 最初因 RLlib(分布式强化学习库)而知名,这导致了”Ray = RL 工具”的早期印象。但实际上 Ray Core 是通用分布式计算框架,RL 只是其应用之一。在 LLM 时代,Ray 更广泛地用于数据预处理、分布式训练编排、推理服务等非 RL 场景。
误读 3:“Ray 的对象存储 Plasma 是独立的分布式存储系统”
纠正:Plasma 不是独立的存储系统(如 Redis/Alluxio),而是嵌入在每个节点 Raylet 中的共享内存管理器。它利用操作系统级的 shared memory 实现节点内零拷贝,节点间通过内部协议按需传输。这是设计选择——追求低延迟而非持久化。
误读 4:“Ray 可以替代 Spark 做大数据 ETL”
纠正:Ray Data 确实提供了数据处理能力,但其设计重心是ML 管线中的数据准备(如图像解码、tokenization、特征变换),而非通用的大规模 ETL。对于 TB/PB 级的数据清洗和 SQL 分析,Spark 仍然是更成熟的选择。两者有交集但并非全面替代关系。
学习路径
阶段 1:入门(1-2 天)
- 官方 Quick Start:
pip install ray→ 跑通@ray.remote的 Task 和 Actor 示例 - 理解 ObjectRef:
ray.get()/ray.put()的异步语义 - 核心概念:Driver、Task、Actor、Object Store、GCS
阶段 2:中级(1-2 周)
- Ray Data:学习
ray.data.Dataset的 API,理解与 Spark DataFrame 的异同 - Ray Train:跑通一个 PyTorch DDP on Ray 的端到端示例
- Ray Serve:部署一个简单的模型服务,理解 Deployment、Replica、Ingress 的概念
- Placement Group:理解资源亲和性控制
阶段 3:高级(持续)
- 阅读 Ray 源码:从
python/ray/目录入手,重点看 Raylet 和 GCS 的实现 - OSDI 2018 论文:理解设计动机和架构权衡
- 生产部署实践:KubeRay 部署、监控(Ray Dashboard + Prometheus)、调试
- 性能调优:对象存储溢出控制、调度策略调优、GPU 资源隔离
- RLHF 管线实战:用 Ray 编排 SFT→Reward→PPO 的完整流程
推荐阅读
- Ray 官方文档(最权威的一手资料)
- Ray Architecture Whitepaper(如有更新)
- “Ray: A Distributed Framework for Emerging AI Applications” (OSDI 2018)
- “RLlib: Abstractions for Distributed Reinforcement Learning” (ICML 2018)
- Anyscale 博客中的 LLM infra 相关文章
一句话总结
Ray 是 AI 基础设施栈中”分布式操作系统”层的事实标准候选者——它不替代 PyTorch,而是在其之上为数据→训练→推理的全链路提供统一的 Python-native 分布式编排,其战略地位随 LLM 集群规模扩大而持续提升。
延伸阅读与来源
- Moritz, P. et al., “Ray: A Distributed Framework for Emerging AI Applications”, OSDI 2018 — Ray 的奠基论文
- Liang, E. et al., “RLlib: Abstractions for Distributed Reinforcement Learning”, ICML 2018
- Ray 官方文档 — 技术规格和 API 参考的一手来源
- Anyscale 官方博客 — 商业化案例和技术深度文章
- KubeRay GitHub — K8s 上部署 Ray 的 operator
- Ray GitHub — 源码和社区讨论
- 各大科技媒体对 Anyscale 融资的报道(TechCrunch、The Information 等)
数据来源说明:本页中的具体数字标注了来源口径。未明确标注的定量数据多为行业估算或公开报道汇编,不构成投资建议。Anyscale 的具体财务数据(ARR、客户数等)未充分披露,本文不编造。