如何使用 Ray 分配多个计算

How distribute multiple computations with Ray

在我的用例中,我有一个包含许多阶段的巨大计算。

阶段必须按顺序执行。

对于每个阶段,可以有很多任务,它们可以并行执行。 每个任务需要 1 CPU.

每个任务都得到一个大数据集(例如 150G)作为输入。

数据集位于远程存储中,但缓存到机器上。所以尽可能做到机器粘性很重要。

For example:
Computation
- Stage1  (100 tasks)
- Stage2  (200 tasks)
 ....

在一个系统中,有多个用户,他们可以运行 多个计算(巨大,大,...取决于用例)

我的问题是我可以为这个系统使用 ray 框架。 使用它的最佳方法是什么? 是否可以为每个 stage/computation 提示 ray,应该使用哪些机器?

如果不是 ray,什么框架可能符合要求?

据我所知,SLURM may be an easier option. It seems easier to make jobs "sticky", since you can specify the actual nodes. There, you could define a job array for each stage, while each task will be executed on a single machine. At least that is how I would solve it. That being said, there's probably also a way to make it work with ray, depending on how exactly your problem is defined and if you need to reassign specific tasks to specific nodes later on. Since ray does not expose the cluster topology for assignment,如果你想使用 ray,这可能是个问题。

你绝对可以用 Ray 做到这一点。例如

ray.init(address="same_address_for_all_jobs")

@ray.remote
def stage1(x):
  # do stage 1 compute here

@ray.remote
def stage2(x):
  # do stage 2 compute here

stage1_results = []
for i in range(100):
    ref = stage1.options(resources={ # add resources here to specify requirements to run on a certain node }).remote(i)


stage2_results = []
for stage1_ref in stage1_results:
  # Now stage2 will wait for the corresponding task from stage 1 before starting.
  stage2_ref = stage2.remote(stage1_ref)
  stage2_results.append(stage2_ref)

请注意,一旦数据集位于 Ray 的对象存储中,Ray 的调度程序就可以识别位置,因此它应该尽可能将剩余任务安排在与数据相同的节点上。