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

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

一批任务被提交,我们需要在它们完成后分别处理结果。如果每个任务完成所需的时间不同,而我们按提交顺序处理结果,可能会浪费时间等待所有较慢(落后)的早期任务完成,而较快的后期任务已经完成。

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

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

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

代码示例#

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() 相关的反模式包括: