反模式:使用 ray.get 按提交顺序处理结果会增加运行时间#

TLDR: 避免使用 ray.get() 按提交顺序处理独立结果,因为结果可能以与提交顺序不同的顺序就绪。

提交了一批任务,我们需要在任务完成后单独处理它们的结果。如果每个任务完成所需时间不同,并且我们按提交顺序处理结果,则可能会浪费时间等待所有较慢(滞后)的早期提交任务完成,而较快的后续任务早已完成。

相反,我们希望使用 ray.wait() 按任务完成的顺序处理它们,以加快总完成时间。

../../_images/ray-get-submission-order.svg

按提交顺序处理结果 vs 按完成顺序处理结果#

代码示例#

import random
import time
import ray

ray.init()


@ray.remote
def f(i):
    time.sleep(random.random())
    return i


# Anti-pattern: process results in the submission order.
sum_in_submission_order = 0
refs = [f.remote(i) for i in range(100)]
for ref in refs:
    # Blocks until this ObjectRef is ready.
    result = ray.get(ref)
    # process result
    sum_in_submission_order = sum_in_submission_order + result

# Better approach: process results in the completion order.
sum_in_completion_order = 0
refs = [f.remote(i) for i in range(100)]
unfinished = refs
while unfinished:
    # Returns the first ObjectRef that is ready.
    finished, unfinished = ray.wait(unfinished, num_returns=1)
    result = ray.get(finished[0])
    # process result
    sum_in_completion_order = sum_in_completion_order + result

其他与 ray.get() 相关的反模式有: