使用ray,你需要解决以下两个问题:
1.ray执行异步任务时是怎样实现平行的。(ray集群中每个节点共享本节点本地存储,节点中worker并行运行,集群间worker的并行)
2.ray是怎样使用对象ID来表示不可变对象的远程对象的。(任务执行前,对象值已存入存储对象中,任务执行是通过对象ID调用存储对象的)
综述
Ray是一个分布式执行引擎。同样的代码可以在一台机器上实现高效的多处理,也可以在集群是用于大型的计算。
当我们使用Ray时,涉及到多个进程。
- 多worker进程执行多个任务并将结果存储在对象存储中,每个worker都是一个独立的进程。
- 每个节点上的对象存储都将不可变的对象存储存储在共享内存中,允许worker以少量的复制和并行化有效的共享同一节点上的存储对象。
- 每一节点上的本地调度将任务分配给同一节点上的worker(一个节点上的本地调度把任分配给本节点的worker)
- 一个driver是用户控制的python进程。例如,如果用户正在运行脚本或者使用python shell,那么driver就是运行脚本或者shell的python进程。driver和worker很相似,他们都可以提交任务给本地调度并从对象存储中获取对象,但是不同之处是本地调度不会将任务分配给driver执行。
- Redis服务器维护系统的大部分状态。例如,它跟踪哪些对象位于哪些机器上,以及任务规范(但不包括数据)。另外可以对有问题的目标进行直接的质问(就是错误或者警告提示)。
运行Ray
启动python并运行一下命令:
import ray
ray.init()
ray启动了。(其中ray.init()方法可以加参数,具体请参考Ray相关的API)
不可变的远程(remote)对象
在Ray中,我们可以在对象上创建和计算。我们将这些