Ray 除了 Tune 做超参搜索,其实是一整套「分布式 Python / AI 计算平台」,常用的几块可以按这个层次来理解:
1. Ray Core:分布式 Python 基础设施
Ray Core = 分布式任务 + Actor + 对象存储,是所有高级库的基础。
核心三个原语:
-
Tasks(远程函数)
- 把一个普通函数用
@ray.remote标一下,就可以分布式异步执行。 - 常用场景:批处理、并行推理、网格搜索、模拟等。
pythonimport ray, time ray.init() @ray.remote def f(x): time.sleep(1) return x * x futures = [f.remote(i) for i in range(8)] print(ray.get(futures)) # 8 个任务并行跑完 - 把一个普通函数用
-
Actors(有状态 worker)
- 用在「需要长生命周期 / 持有状态」的场景,比如:缓存、环境仿真、模型服务、参数服务器等。
python@ray.remote class Counter: def __init__(self): self.value = 0 def inc(self): self.value += 1 return self.value c = Counter.remote() print(ray.get(c.inc.remote())) -
Objects(分布式对象存储)
ray.put/ray.get管理跨节点共享的大数组、模型输出等。
一句话: Ray Core 让你把任何 Python 代码「并行化 + 分布式化」,不仅限于深度学习。
2. Ray Train:分布式训练(DDP、Horovod 那一类的替代/封装)
Ray Train 是专门做 多卡 / 多机训练 的库,支持 PyTorch、TF、XGBoost 等。
常见能力:
- 简化分布式训练启动(不用自己写
torch.distributed.launch) - 集成 DDP、FSDP 等,自动管理进程、容错、重试
- 可以和 Ray Data / Tune 串起来:数据 → 训练 → 调参
典型用法(PyTorch):
python
from ray.train.torch import TorchTrainer
from ray.train import ScalingConfig
def train_loop_per_worker(config):
import torch
# 这里写单机单卡训练逻辑,Ray 帮你在多 worker 上复制
...
trainer = TorchTrainer(
train_loop_per_worker=train_loop_per_worker,
scaling_config=ScalingConfig(num_workers=4, use_gpu=True),
)
result = trainer.fit()
3. Ray Data:分布式数据加载 & 预处理
Ray Data 是一个 面向 ML 的分布式数据流水线:读数据 → transform → 直接喂给 Train/Tune/Serve。
常用场景:
- 分布式读取 Parquet/CSV/图片/云存储
- 预处理(map、filter、batch)
- 直接输出给分布式训练,避免自己管理 sharding / worker rank
python
import ray
import ray.data as rd
ray.init()
ds = rd.read_parquet("s3://bucket/train.parquet")
ds = ds.map(lambda row: {"x": row["x"] / 255.0, "y": row["y"]})
for batch in ds.iter_batches(batch_size=128):
...
4. Ray Serve:在线服务 / 模型部署
Ray Serve 是一个分布式 模型服务框架,支持 HTTP、gRPC,适合:
- 部署深度学习模型(包括多模型 ensemble、流水线)
- 动态伸缩、A/B 测试、路由,不用自己造 gunicorn + 多进程那一套。
简单例子(FastAPI + Serve):
python
from ray import serve
import ray
ray.init()
serve.start()
@serve.deployment(num_replicas=2)
class MyModel:
def __init__(self):
self.model = ... # load pytorch model
async def __call__(self, request):
data = await request.json()
# 推理逻辑
return {"result": ...}
MyModel.deploy()
# 然后本地 http://127.0.0.1:8000/MyModel 发请求即可
5. RLlib:大规模强化学习
RLlib 是 Ray 自带的 分布式强化学习库,适合:
- 多环境并行采样
- 多智能体、多算法(PPO、DQN 等)统一接口
- 工业级 RL 训练(游戏、机器人、推荐、控制等)
示意用法:
python
import ray
from ray import tune
from ray.rllib.algorithms.ppo import PPOConfig
ray.init()
config = PPOConfig().environment("CartPole-v1").rollouts(num_rollout_workers=4)
algo = config.build()
for i in range(10):
result = algo.train()
print(result["episode_reward_mean"])
6. 调度 & 集群相关:Ray Jobs / Dashboard / KubeRay
除了编程接口,Ray 还有几块常用的「工程向」功能:
- Ray Jobs
- 一条命令把你的 Python 脚本提交到 Ray 集群执行
- 类似简单版的 job scheduler:
ray job submit -- python my_script.py
- Ray Dashboard
- Web UI,看集群资源、任务图、Actor 状态、日志等
- 调试性能瓶颈、监控训练 / 推理进度非常好用
- KubeRay
- 在 Kubernetes 上管理 Ray 集群(CRD + Operator)
- 做「云上统一 ML 平台」时常用
7. 实际项目里常见的"组合拳"
下面是几个典型 workflow,方便在脑子里形成场景感:
- 数据+训练+调参一条龙
- Ray Data 负责分布式 ETL + 读取
- Ray Train 负责分布式训练
- Ray Tune 负责超参搜索
- 训练+部署一体化
- 训练用 Ray Train / Tune 跑完
- 最优模型 checkpoint 直接挂到 Ray Serve 上对外提供服务
- 多模型在线系统
- Core 的 Actors 作为长期活着的"微服务"(特征服务、召回、ranking)
- Serve 负责 HTTP/gRPC 入口和路由
- 后台 Tune 不定期做新一轮超参搜索/模型刷新
总结一句话
Ray 不是"一个调参工具",而是一个"分布式 Python & AI 计算平台"。
除了 Tune,还常用:
- Ray Core:并行任务、actor、有状态服务
- Ray Train:多机多卡训练
- Ray Data:分布式数据处理
- Ray Serve:在线推理 / 模型部署
- RLlib:强化学习
创作不易,麻烦点点赞和关注咯!