简介
ray 是伯克利大学开源的一个解决 AI 异构计算负载的通用分布式计算引擎,初期主要是解决强化学习这种多类型负载的计算问题,目前其应用面也超出 AI 领域,例如蚂蚁将其应用于图计算等场景
计算模型
ray 提供了 task 和 actor 两种计算原语
- task
task 是无状态的计算任务,一般通过一个方法进行定义
@ray.remote
def f(x):
return x * x
- actor
actor 是有状态的计算任务,一般通过一个 class 进行定义,且其执行的方式是串行进行,且共享其状态
@ray.remote
class Counter(object):
def __init__(self):
self.n = 0
def increment(self):
self.n += 1
def read(self):
return self.n
系统构成
ray 由若干个同质的 Worker node 及一个 Head node 组成
每个 Worker node 包括一个 Raylet 进程及若干个 Worker 进程, Head node 除了 Worker node 包含的进程外,还包括 Driver 及 GCS
特点
- 调度方式
相较于传统的分布式计算引擎的中心化调度模式,ray 的调度方式为本地调度及远程转发调度两种方式,调度的灵活性及低延迟性更好 - 动态任务依赖
类似 Spark、TensorFlow 等调度模式,都是提前已知整个 job 的任务依赖关系,而后进行调度执行,ray 可以在 runtime 构建出新的任务依赖(任务中动态创建任务),更加灵活 - 异构计算负载及资源支持
例如强化学习的计算负载类型就包括随机梯度下降的训练(training)、在线服务(serving)及仿真(simulation),而对于各种异构计算资源也存在诉求,例如 GPU、CPU 等