30 lines
1.3 KiB
ReStructuredText
30 lines
1.3 KiB
ReStructuredText
Anti-pattern: Redefining the same remote function or class harms performance
|
|
============================================================================
|
|
|
|
**TLDR:** Avoid redefining the same remote function or class.
|
|
|
|
Decorating the same function or class multiple times using the :func:`ray.remote <ray.remote>` decorator leads to slow performance in Ray.
|
|
For each Ray remote function or class, Ray will pickle it and upload to GCS.
|
|
Later on, the worker that runs the task or actor will download and unpickle it.
|
|
Each decoration of the same function or class generates a new remote function or class from Ray's perspective.
|
|
As a result, the pickle, upload, download and unpickle work will happen every time we redefine and run the remote function or class.
|
|
|
|
Code example
|
|
------------
|
|
|
|
**Anti-pattern:**
|
|
|
|
.. literalinclude:: ../doc_code/anti_pattern_redefine_task_actor_loop.py
|
|
:language: python
|
|
:start-after: __anti_pattern_start__
|
|
:end-before: __anti_pattern_end__
|
|
|
|
**Better approach:**
|
|
|
|
.. literalinclude:: ../doc_code/anti_pattern_redefine_task_actor_loop.py
|
|
:language: python
|
|
:start-after: __better_approach_start__
|
|
:end-before: __better_approach_end__
|
|
|
|
We should define the same remote function or class outside of the loop instead of multiple times inside a loop so that it's pickled and uploaded only once.
|