反模式:重复按值传递相同的大参数会损害性能#

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)])