反模式:重复按值传递相同的巨型参数会损害性能#
总结:避免将相同的巨型参数多次按值传递给多个任务,而应使用 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)])