Ray remote Actors with modularized codebase

Hi Team,

Well, I have a usual organization level model serving codebase. I need to explore Ray core and Ray serve feasibility within this.

While going through most of Ray’s docs, blogs, videos and even external youtube videos, I couldn’t see any example showcasing Ray remote/serve implementation/usage with modularized code[Help me with any, if I have missed].

One specific example that I could locate is here at https://docs.ray.io/en/latest/actors.html#actor-methods, I changed it little to demonstrate use-case.

## Counter.py
import ray

ray.init(address='ray://127.0.0.1:10001')


@ray.remote
class Counter(object):
    def __init__(self):
        self.value = 0

    def increment(self):
        self.value += 1
        return self.value

    def get_counter(self):
        return self.value

Then I am consuming this Counter.py in another python script CounterUser.py as shown below.

#CounterUser.py
import Counter
import ray


@ray.remote
class Foo(object):

    # Any method of the actor can return multiple object refs.
    @ray.method(num_returns=2)
    def bar(self):
        return 1, 2

f = Foo.remote()

obj_ref1, obj_ref2 = f.bar.remote()
assert ray.get(obj_ref1) == 1
assert ray.get(obj_ref2) == 2

# Calling Counter module
counter_actor = Counter.remote()

assert ray.get(counter_actor.increment.remote()) == 1

I started ray with ray start --head and when I called CounterUser.py, it threw following errors.


❯ python CounterUser.py
Traceback (most recent call last):
  File "/Users/macpro/ray_demo/CounterUser.py", line 20, in <module>
    counter_actor = Counter.remote()
AttributeError: module 'Counter' has no attribute 'remote'

I do not know if this is correct consumption style but module level consumption is much needed. I can not restructure a big modularized code to a single file with all the models, remote functions, actors.

If anyone has already solved this one, please guide me.

I think you want from Counter import Counter to get the class here (or Counter.Counter.remote()).