Ray Compatibility Layer
Scaler is a lightweight distributed computation engine similar to Ray. Scaler supports many of the same concepts as Ray including remote functions (known as tasks in Scaler), futures, cluster object storage, labels (known as capabilities in Scaler), and it comes with comparable monitoring tools.
Unlike Ray, Scaler supports both local clusters and also easily integrates with multiple cloud providers out of the box, including AWS EC2 and IBM Symphony, with more providers planned for the future. You can view our roadmap on GitHub for details on upcoming cloud integrations.
Scaler provides a compatibility layer that allows developers familiar with the Ray API to adopt Scaler with minimal code changes.
Quickstart
To start using Scaler’s Ray compatibility layer, ensure you have opengris-scaler installed in your Python environment.
Then import scaler.compat.ray in your application after importing ray and before using any Ray APIs.
This import patches the ray module, allowing you to use Ray’s API as you normally would.
import ray
import scaler.compat.ray
# existing Ray app
This will start a new local scheduler and cluster combo. To use an existing cluster, pass the address of the scheduler to scaler_init():
import ray
from scaler.compat.ray import scaler_init
# connects to an existing cluster
# when an address is provided, a local cluster is not started
scaler_init(address="tcp://<scheduler-ip>:<scheduler-port>")
# existing Ray app
You can also provide scheduler and cluster configuration options to scaler_init() to configure the locally created cluster:
import ray
from scaler.compat.ray import scaler_init
# overrides the number of workers in the implicitly-created local cluster (defaults to number of CPU cores)
scaler_init(n_workers=5)
# existing Ray app
Remote Function Limitations
ray.remote() accepts many parameters, but Scaler’s compatibility layer only supports num_returns. Other parameters will be ignored.
Shutting Down
The implicitly-created local cluster is a subprocess with global scope, and won’t be shut down automatically.
This can cause your program to keep executing after your program has completed, it is therefore important to call ray.shutdown()
when your program is done when using the implicit local cluster.
A Note about the Actor Model
Ray supports a powerful actor model that allows for stateful computation. This is currently not supported by the Scaler, but is planned for a future release.
This documentation will be updated when actor support is added. For now please view our roadmap on GitHub for more details.
Decorating a class with @ray.remote will raise a NotImplementedError.
Full Examples
See the examples directory for complete Scaler Ray compatibility layer examples including: * basic_local_cluster.py: Demonstrates using the Scaler Ray compatibility layer with the implicitly-created local cluster. * basic_remote_cluster.py: Demonstrates using the Scaler Ray compatibility layer with an existing remote cluster. * batch_prediction.py: Demonstrates using Scaler’s Ray compatibility layer for batch prediction, copied from Ray Core’s documentation. * highly_parallel.py: Demonstrates highly parallel computations, copied from Ray Core’s documentation. * map_reduce.py: Demonstrates a MapReduce pattern using Scaler’s Ray compatibility layer, copied from Ray Core’s documentation. * plot_hyperparameter.py: Demonstrates hyperparameter tuning and plotting, copied from Ray Core’s documentation. * web_crawler.py: Demonstrates a web crawling example, copied from Ray Core’s documentation.
Supported APIs
The compatibility layer supports a subset of Ray Core’s API.
Below is a comprehensive list of the supported APIs. Functions and classes not in this list
Core API
@ray.remote: Only supports remote functions. Decorating a class with@ray.remotewill raise aNotImplementedError.ray.shutdown()ray.is_initialized()ray.get()ray.put()ray.wait()ray.cancel()
Ray Utilities (ray.util)
ray.util.as_completed()ray.util.map_unordered()
Unsupported APIs
The following APIs are not supported by the Scaler Ray compatibility layer.
Some functions will be no-ops or return a mock object while others will raise a NotImplementedError exception.
ray.init(): No-op. Usescaler_init()fromscaler.compat.rayinstead.ray.get_actor(): Returns a mock object.ray.method(): RaisesNotImplementedError.ray.actor: RaisesNotImplementedError.ray.runtime_context: RaisesNotImplementedError.ray.cross_language: RaisesNotImplementedError.ray.get_gpu_ids(): RaisesNotImplementedError.ray.get_runtime_context(): RaisesNotImplementedError.ray.kill(): RaisesNotImplementedError.