反模式:反复传递相同的大参数会损害性能
Contents
反模式:反复传递相同的大参数会损害性能#
TLDR: 避免将相同的大参数通过值传递给多个任务,使用 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)])