My final solution is this:
- instead of using actors, use normal Python classes and Ray functions
- each call of the Ray function creates a component classifier, fits it, and returns it
- subsequent use of the classifiers (e.g., making predictions) depend on using the returned component classifiers.
A working MWE is below:
import ray
import time
class MyClass:
def fit(self, value):
time.sleep(1)
print('done with fitting value {}'.format(value))
return value
def predict(self, value):
time.sleep(1)
print('done with prediction value {}'.format(value))
return value
@ray.remote(num_cpus=2)
def _fit(value):
obj = MyClass()
obj.fit(value)
return obj
ray.init(num_cpus=4) # we request 4 cpus
obj_ids = [_fit.remote(v) for v in range(4)]
@ray.remote
def _predict(obj, value):
return obj.predict(value)
res_ids = [_predict.remote(obj, value) for obj, value in zip(obj_ids, range(len(obj_ids)))]
ray.get(res_ids)
ray.shutdown()