Decorator to run functions on Ray cluster with S3 mapping between local and remote workers paths
Project description
Ray Decorator
ray-decorator is a powerful Python library designed to seamlessly offload function execution and configuration-driven tasks to a Ray cluster. It specializes in handling environment parity between local and remote environments by intelligently mapping local file paths to S3 URIs, performing deduplication via MD5 hashing, and ensuring all dependencies are available on the worker node.
Why this tool?
This tool was created to solve a common friction point when using Ray and DVC together in a unified pipeline.
In many ML workflows, you want to use DVC to keep your local workspace up-to-date with data and parameters. However, training often requires a remote Ray cluster with powerful GPUs. Balancing these two usually leads to "ugly" staging commands in your Ray job submission, such as:
/bin/bash -c 'uv run dvc pull data/processed_dataset && \
uv run --script scripts/pipeline/train.py --dataset_path data/processed_dataset --model_output_path model/trained_model && \
uv run dvc add model/trained_model && \
uv run dvc push && \
aws s3 cp model/trained_model.dvc s3://my-bucket/models/'
This approach is brittle and hard to maintain. Since DVC tracking of remote files (non-local to the workspace) has been deprecated or is discouraged, you ideally want your dependencies and outputs to remain local from the perspective of your DVC pipeline.
ray-decorator solves this by:
- Transparently copying local dependencies to S3.
- Syncing them to the remote Ray worker so your function runs exactly as it would locally.
- Uploading the results back to S3 and then downloading them to your local machine.
The result? DVC can continue to track local dependencies and outputs while the heavy lifting happens on the Ray cluster, without any manual S3 boilerplate in your scripts.
Features
- Distributed Execution: Offload heavy computations (like ML training or data processing) to a Ray cluster with a simple decorator.
- S3 Path Mapping: Automatically detects local file paths in arguments, uploads them to S3 (transparently), and maps them back to local paths on the Ray worker.
- MD5 Deduplication: Avoids redundant uploads/downloads by checking MD5 hashes of files and directories.
- Hydra & Hydra-Zen Integration: Built-in support for Hydra configurations and first-class integration with
hydra-zenvia theRayZenwrapper. - Environment Parity: Automatically synchronizes local
uvpackage distributions to the Ray cluster’s runtime environment.
Installation
uv add ray-decorator
Requires ray, awscli, and optionally hydra-zen.
Configuration
The following environment variables can be used to configure the default behavior:
RAY_ADDRESS: The address of the Ray cluster (e.g.,ray://127.0.0.1:10001orauto).RAY_S3_BASE_PATH: The base S3 bucket/path for storing dependencies and outputs (e.g.,s3://my-bucket/ray-jobs).
Usage Examples
1. Simple Function Arguments
Use @ray_decorator to offload a standard function. Specify deps for input paths and outs for output paths.
import os
from ray_decorator import ray_decorator
@ray_decorator(
deps=["data_dir"],
outs=["output_dir"],
ray_address="auto",
s3_base_path="s3://my-bucket/jobs",
)
def process_data(data_dir: str, output_dir: str):
print(f"Processing data from {data_dir}")
os.makedirs(output_dir, exist_ok=True)
with open(os.path.join(output_dir, "result.txt"), "w") as f:
f.write("Done!")
if __name__ == "__main__":
process_data(data_dir="./local_data", output_dir="./local_results")
2. Standard Hydra Integration
ray-decorator handles DictConfig objects automatically. You can specify nested paths in deps and outs.
import hydra
from omegaconf import DictConfig
from ray_decorator import ray_decorator
@hydra.main(config_name="config", config_path=".", version_base=None)
@ray_decorator(
deps=["config.data.path"],
outs=["config.training.output_dir"],
)
def train(config: DictConfig):
# This runs on Ray!
print(f"Training on {config.data.path}")
if __name__ == "__main__":
train()
3. Hydra-Zen Integration
For hydra-zen users, ray_zen is a drop-in replacement for zen() that ensures the entire instantiation and execution cycle happens on the Ray worker. This prevents heavy objects (like LLMs) from being instantiated on your local machine.
from hydra_zen import builds, store
from ray_decorator import ray_zen
from transformers import AutoModel
@store(
name="my_app",
model=builds(AutoModel.from_pretrained, pretrained_model_name_or_path="bert-base-uncased"),
data_dir="./data",
output_dir="./outputs"
)
def task(model, data_dir, output_dir):
# 'model' is instantiated ONLY on the Ray worker
print(f"Model: {model.config.model_type}")
if __name__ == "__main__":
store.add_to_hydra_store()
ray_zen(
task,
deps=["data_dir"],
outs=["output_dir"],
ray_address="auto",
s3_base_path="s3://my-bucket/zen",
).hydra_main(config_name="my_app", config_path=None, version_base=None)()
How it Works
- Driver Side:
- Computes a stable "Run ID" based on the MD5 of all dependency paths.
- Syncs local dependencies to S3 if the remote hash doesn't match.
- Updates the configuration/arguments with S3 paths.
- Initializes the Ray cluster with a
RuntimeEnvcontaining the project code and required packages.
- Worker Side:
- Detects S3 paths in the configuration.
- Syncs the required data from S3 to the worker's local storage.
- Executes the function.
- Syncs output files back to S3.
- Driver Side (Post-Execution):
- Downloads the output files from S3 back to the original local paths.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ray_decorator-0.1.5.tar.gz.
File metadata
- Download URL: ray_decorator-0.1.5.tar.gz
- Upload date:
- Size: 7.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c300bac334561a0e42b28e6d322ef66234c0a6875cc7a4e9765e70ea6171191d
|
|
| MD5 |
61a57a826a1881c3ffbb5cd2056fd41b
|
|
| BLAKE2b-256 |
d8b3439146f59705329c48c3f70ffa712f5bea48e470ae6c1f50cc70ce161ee9
|
File details
Details for the file ray_decorator-0.1.5-py3-none-any.whl.
File metadata
- Download URL: ray_decorator-0.1.5-py3-none-any.whl
- Upload date:
- Size: 10.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
85e9514a1f50021f207aad188b3678b48c54d8e35f40fefdf7ba909966e5dfb1
|
|
| MD5 |
24c4c0ed7bd42a6d7fcdefb0a8b13aa8
|
|
| BLAKE2b-256 |
9354381d88be85847a8ff3d379d01d542774fecadf6e2d6ad8f8dc42dca519c9
|