如何用Ray分配多个计算



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

各阶段必须依次执行。

对于每个阶段,可以有许多任务,并且它们可以并行执行。每个任务占用1个CPU。

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

数据集位于远程存储中,但缓存到机器上。因此,尽可能保持机器粘性是很重要的。

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

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

我的问题是我可以在这个系统中使用射线框架吗?使用它的最佳方法是什么?是否有可能提示每个阶段/计算,应该使用哪些机器?

如果不是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的调度程序是局部性的,因此它应该尽可能将剩余的任务调度到与数据相同的节点上。

在我看来,SLURM可能是一个更容易的选择。使作业具有"粘性"似乎更容易,因为您可以指定实际节点。在这里,您可以为每个阶段定义一个作业数组,而每个任务将在单个机器上执行。至少我是这么解的。也就是说,可能还有一种方法可以使它与ray一起工作,这取决于您的问题是如何精确定义的,以及稍后是否需要将特定任务重新分配给特定节点。由于ray不公开集群拓扑以供分配,如果您想使用ray,这可能是一个问题。

最新更新