反模式:重复定义相同的远程函数或类会损害性能#
简而言之: 避免重复定义相同的远程函数或类。
使用 ray.remote 装饰器多次装饰同一个函数或类会导致 Ray 性能下降。对于每个 Ray 远程函数或类,Ray 会对其进行 pickle,然后上传到 GCS。之后,运行任务或 Actor 的工作进程会下载并 unpickle 它。从 Ray 的角度来看,每一次对同一个函数或类的装饰都会生成一个新的远程函数或类。因此,每次重新定义和运行远程函数或类时,都会进行 pickle、上传、下载和 unpickle 操作。
代码示例#
反模式
import ray
ray.init()
outputs = []
for i in range(10):
@ray.remote
def double(i):
return i * 2
outputs.append(double.remote(i))
outputs = ray.get(outputs)
# The double remote function is pickled and uploaded 10 times.
更好的方法
@ray.remote
def double(i):
return i * 2
outputs = []
for i in range(10):
outputs.append(double.remote(i))
outputs = ray.get(outputs)
# The double remote function is pickled and uploaded 1 time.
我们应该将同一个远程函数或类定义在循环之外,而不是在循环内部多次定义,这样它只会进行一次 pickle 和上传。