Anti-pattern: Redefining the same remote function or class harms performance#

Avoid redefining the same remote function or class.

Decorating the same function or class multiple times with the ray.remote decorator leads to slow performance in Ray. For each remote function or class, Ray pickles it and uploads it to GCS. Later, the worker that runs the task or actor downloads and unpickles it. From Ray’s perspective, each decoration of the same function or class generates a new remote function or class. As a result, the pickle, upload, download, and unpickle work happens every time you redefine and run the remote function or class.

Code example#

Anti-pattern:

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.

Better approach:

@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.

Define the remote function or class once outside the loop, instead of multiple times inside it, so that Ray pickles and uploads it only once.