反模式:使用 ray.get 按提交顺序处理结果会增加运行时间#
TLDR: 避免使用 ray.get()
按提交顺序处理独立结果,因为结果可能以与提交顺序不同的顺序就绪。
提交了一批任务,我们需要在任务完成后单独处理它们的结果。如果每个任务完成所需时间不同,并且我们按提交顺序处理结果,则可能会浪费时间等待所有较慢(滞后)的早期提交任务完成,而较快的后续任务早已完成。
相反,我们希望使用 ray.wait()
按任务完成的顺序处理它们,以加快总完成时间。
按提交顺序处理结果 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()
相关的反模式有: