反模式:重复按值传递相同的巨大参数会损害性能#
简而言之: 避免按值将相同的巨大参数传递给多个任务,请使用 ray.put() 并改为按引用传递。
当按值将巨大参数(>100KB)传递给任务时,Ray 会隐式地将该参数存储在对象存储中,并且工作进程在运行任务之前会从调用者的对象存储中将该参数获取到本地对象存储。如果我们向多个任务传递相同的巨大参数,Ray 最终会在对象存储中存储该参数的多个副本,因为 Ray 不会进行去重。
与其将巨大参数按值传递给多个任务,不如使用 ray.put() 将该参数一次性存储到对象存储中,并获取一个 ObjectRef,然后将该参数的引用传递给任务。这样,我们可以确保所有任务都使用同一份参数副本,从而提高速度并减少对象存储的内存占用。
代码示例#
反模式
import ray
import numpy as np
ray.init()
@ray.remote
def func(large_arg, i):
return len(large_arg) + i
large_arg = np.zeros(1024 * 1024)
# 10 copies of large_arg are stored in the object store.
outputs = ray.get([func.remote(large_arg, i) for i in range(10)])
更好的方法
# 1 copy of large_arg is stored in the object store.
large_arg_ref = ray.put(large_arg)
outputs = ray.get([func.remote(large_arg_ref, i) for i in range(10)])