目录
本文首先介绍Ray分布式的原理,对原理有了一定认识后,具体到使用就相对简单了,因此本文只会对使用做简要介绍,最后再说一下Ray的不足。文章的目的是让大家对Ray能有基本的了解,供大家判断Ray是否适合用于解决手头的问题。
Ray是什么?
Ray是一个开源统一框架,为机器学习和大数据处理相关程序提供了用于并行处理的计算层,降低了大规模端到端机器学习工作流的开发难度。
Ray提供了在数据预处理、分布式训练、超参数调优、模型服务和强化学习几个方面的并行方法,分别对应上图的Data、Train、Tune、Serve和RLib模块,用户只需要在原有代码中新增几行代码,即可实现方法的并行操作。
同时,通过KubeRay可以将Ray程序很容易的移植到Kubernetes集群中,利用云原生生态中的基础能力对Ray任务进行更精细的管理。
如何做到分布式?
集群
Ray通常是以集群的方式部署在多台服务器上。Head node是主节点,Worker node是工作节点,上图展示了由1个Head node和2个Worker node组成的Ray集群。
remote方法
Ray任务在执行的过程中,可以根据用户在代码中的定义,判断将哪些无状态方法(Task)或者有状态类(Actor)进行分布式处理。
以方法举例,在方法上面加入一行@ray.remote装饰器,普通方法便成为了remote方法,可以被多个worker进程同时处理。并且可以指定每个worker进程所需要的资源,比如@ray.remote(num_cpus=4, num_gpus=2),指定需要worker具备4个cpu核心和2个gpu,同时可以指定小于1的资源,比如@ray.remote(num_cpus=0.5, num_gpus=0.5)。
# By adding the `@ray.remote` decorator, a regular Python function
# becomes a Ray remote function.
@ray.remote
def my_function():
return 1
worker进程
现在介绍一下worker进程,这是帮助理解Ray工作原理的核心概念。首先要把worker进程和worker node区分开,worker node指的是服务器,而worker进程是worker node上运行的进程,一个worker node可以运行多个worker进程。
Ray v2 Architecture中如下介绍worker进程:
One or more worker processes, responsible for task submission and execution. A worker process is either stateless (can be reused to execute any @ray.remote function) or an actor (can only execute methods according to its @ray.remote class). Each worker process is associated with a specific job. The default number of initial workers is equal to t