{"id":572,"library":"ray","title":"Ray Distributed Framework","description":"Ray is a unified open-source framework for building and scaling distributed applications and AI workloads in Python. It provides simple APIs for parallelizing Python functions and classes (tasks and actors) and a toolkit of specialized libraries (Ray Data, Train, Tune, Serve, RLlib) for machine learning. Ray offers a universal compute layer for orchestrating clusters, scheduling processes, fault tolerance, and autoscaling. The project maintains a very frequent release cadence, with minor and patch releases occurring every few weeks.","status":"active","version":"2.54.1","language":"python","source_language":"en","source_url":"https://github.com/ray-project/ray","tags":["distributed-computing","machine-learning","deep-learning","data-processing","scalability","ai-runtime","parallel-computing"],"install":[{"cmd":"pip install ray","lang":"bash","label":"Base Installation"},{"cmd":"pip install \"ray[data,train,tune,serve,rllib]\"","lang":"bash","label":"With Common ML Libraries"}],"dependencies":[{"reason":"Ray requires Python 3.10 or newer. Support for Python 3.9 was dropped in Ray 2.52.0.","package":"Python","optional":false}],"imports":[{"note":"Commonly imported as 'ray' for initialization and core functionalities.","symbol":"ray","correct":"import ray"},{"note":"Decorator used to convert Python functions into Ray tasks and Python classes into Ray actors for distributed execution.","symbol":"remote","correct":"@ray.remote"}],"quickstart":{"code":"import ray\nimport time\nimport os\n\n# Initialize Ray (connects to an existing cluster or starts a local one)\n# For a cluster, you might use ray.init(address=\"auto\") or specify an address.\n# For local testing, ray.init() is sufficient.\nray.init(address=os.environ.get('RAY_ADDRESS', None), ignore_reinit_error=True)\n\n@ray.remote\ndef fibonacci(n):\n    if n <= 1:\n        return n\n    return fibonacci.remote(n - 1) + fibonacci.remote(n - 2)\n\n@ray.remote\ndef slow_square(x):\n    time.sleep(1) # Simulate a slow computation\n    return x * x\n\nif __name__ == '__main__':\n    print(\"--- Ray Tasks Example ---\")\n    # Run tasks in parallel\n    futures = [slow_square.remote(i) for i in range(5)]\n    results = ray.get(futures)\n    print(f\"Results from slow_square: {results}\")\n\n    # Example of recursive Ray tasks (note: fibonacci is a common but inefficient example for Ray's overhead)\n    # For larger N, this can quickly create too many tasks.\n    # result_fib = ray.get(fibonacci.remote(10))\n    # print(f\"Fibonacci(10) using Ray: {result_fib}\")\n\n    print(\"Ray initialized successfully, dashboard at:\", ray.get_dashboard_url())\n\n    ray.shutdown()\n    print(\"Ray shutdown.\")","lang":"python","description":"This quickstart demonstrates basic Ray Core usage, including initializing Ray, defining remote functions (tasks) using the `@ray.remote` decorator, launching these tasks with `.remote()`, and retrieving results with `ray.get()`. It includes an example of parallel execution with simulated delay."},"warnings":[{"fix":"Upgrade your Python environment to 3.10 or higher (e.g., `conda install python=3.10` or `pyenv install 3.10.13`).","message":"Ray 2.52.0 (released in early 2026) officially ended support for Python 3.9. Users on Python 3.9 must upgrade to Python 3.10 or newer to use current and future Ray versions.","severity":"breaking","affected_versions":">=2.52.0"},{"fix":"Upgrade Pydantic to V2 (`pip install -U pydantic`) and update your code to use Pydantic V2 APIs. Consult the Pydantic migration guide and Ray's RFC on this change.","message":"Ray plans to drop support for Pydantic V1 starting with version 2.56.0. If your project uses Pydantic V1, you will need to migrate to Pydantic V2 to remain compatible with Ray.","severity":"breaking","affected_versions":">=2.56.0 (planned)"},{"fix":"Review the Ray Train V2 Migration Guide (issues #49454 and REP) to adapt your training scripts. You can temporarily disable V2 by setting the environment variable `RAY_TRAIN_V2_ENABLED=0`.","message":"Ray Train V2 is now enabled by default starting from Ray 2.51.0. This introduces significant API changes and improvements, particularly affecting the `Trainer.restore` API. Existing Ray Train users should consult the migration guide.","severity":"breaking","affected_versions":">=2.51.0"},{"fix":"If unexpected behavior or performance issues arise with Ray Data aggregations, you may need to explicitly configure the shuffle strategy to `ray.data.DataContext.get_current().shuffle_strategy = ShuffleStrategy.SORT_SHUFFLE_PULL_BASED` or re-evaluate your data pipeline.","message":"In Ray Data 2.50.0, the default shuffle strategy for aggregations changed from sort-based to hash-based. While intended for lower memory usage and improved performance, this might alter behavior or performance characteristics if you relied on the previous sort-based default.","severity":"gotcha","affected_versions":">=2.50.0"},{"fix":"For production deployments, enable token authentication as per Ray's security documentation to prevent unauthorized access and code execution.","message":"Ray includes built-in token authentication for enhanced security across its components (dashboard, CLI, API clients, internal services). However, this feature is initially off by default and requires explicit configuration to enable.","severity":"gotcha","affected_versions":">=2.52.0"},{"fix":"Remove calls to `ray.get_dashboard_url()`. The dashboard URL is typically printed in the logs when Ray starts (e.g., '127.0.0.1:8265') or can be retrieved from the `ray.init()` return value if available.","message":"The `ray.get_dashboard_url()` API has been removed. This function was deprecated in Ray 2.0 and is no longer available in current versions.","severity":"breaking","affected_versions":">=2.2.0"},{"fix":"Downgrade your Python environment to an officially supported version (e.g., Python 3.9, 3.10, 3.11, or 3.12 for current Ray versions). Check Ray's official documentation for supported Python versions and platform requirements.","message":"Installing Ray on Python 3.13 is currently not supported, as official wheels may not be available on PyPI for this bleeding-edge Python version or the alpine distribution. This leads to `pip` failing to find any matching distribution.","severity":"breaking","affected_versions":"* (when used with Python 3.13)"}],"env_vars":null,"last_verified":"2026-05-12T16:13:26.590Z","next_check":"2026-06-26T00:00:00.000Z","problems":[{"fix":"Install the required component using pip: `pip install \"ray[tune]\"` (replace `tune` with the specific component needed).","cause":"A specific optional Ray component (e.g., Tune, Train, Serve, RLlib, Data) was not installed, only the base `ray` package.","error":"ModuleNotFoundError: No module named 'ray.tune'"},{"fix":"Ensure `ray start --head` is running on the head node, verify the `--address` used in `ray.init()` is correct, and check firewall settings.","cause":"The Ray head node process is not running, or the client is attempting to connect to an incorrect or unreachable IP address/port.","error":"ConnectionRefusedError: [Errno 111] Connection refused"},{"fix":"Start a Ray cluster using `ray start --head` before attempting to connect, or explicitly set `address=None` (default) in `ray.init()` to start a local Ray instance if no external cluster is intended.","cause":"Ray's `ray.init()` was called with `address='auto'` or an explicit address, but no Ray cluster was found running or reachable at the specified location.","error":"ValueError: The Ray cluster is not running. Please run `ray start --head` on the head node or pass an `address` to `ray.init()` that specifies a running cluster."},{"fix":"Add `ray.init()` at the beginning of your script or program before using any Ray functions.","cause":"Ray's core functionalities like `ray.get()`, `ray.put()`, `ray.wait()`, or `@ray.remote` are being used before `ray.init()` has been called to initialize the Ray runtime.","error":"AttributeError: module 'ray' has no attribute 'get'"}],"ecosystem":"pypi","meta_description":null,"install_score":50,"install_tag":"draft","quickstart_score":0,"quickstart_tag":"stale","pypi_latest":"2.55.1","install_checks":{"last_tested":"2026-05-12","tag":"draft","tag_description":"notable install failures or slow imports","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"data,train,tune,serve,rllib","exit_code":1,"wheel_type":null,"failure_reason":"build_error","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":1,"wheel_type":null,"failure_reason":"build_error","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"data,train,tune,serve,rllib","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"data,train,tune,serve,rllib","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":35.5,"import_time_s":1.39,"mem_mb":24.8,"disk_size":"783M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":9.3,"import_time_s":1.26,"mem_mb":24.5,"disk_size":"243M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"data,train,tune,serve,rllib","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.15,"mem_mb":24.3,"disk_size":"771M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.16,"mem_mb":24,"disk_size":"238M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"data,train,tune,serve,rllib","exit_code":1,"wheel_type":null,"failure_reason":"build_error","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":1,"wheel_type":null,"failure_reason":"build_error","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"data,train,tune,serve,rllib","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"data,train,tune,serve,rllib","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":32,"import_time_s":2.08,"mem_mb":27.5,"disk_size":"822M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":8.6,"import_time_s":1.91,"mem_mb":27.2,"disk_size":"256M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"data,train,tune,serve,rllib","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.76,"mem_mb":27.1,"disk_size":"810M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.8,"mem_mb":26.7,"disk_size":"251M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"data,train,tune,serve,rllib","exit_code":1,"wheel_type":null,"failure_reason":"build_error","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":1,"wheel_type":null,"failure_reason":"build_error","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"data,train,tune,serve,rllib","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"data,train,tune,serve,rllib","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":28.6,"import_time_s":2.11,"mem_mb":27.2,"disk_size":"804M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":8.1,"import_time_s":2.1,"mem_mb":26.9,"disk_size":"246M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"data,train,tune,serve,rllib","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":2.23,"mem_mb":26.7,"disk_size":"792M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":2.09,"mem_mb":26.4,"disk_size":"241M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"data,train,tune,serve,rllib","exit_code":1,"wheel_type":null,"failure_reason":"build_error","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":1,"wheel_type":null,"failure_reason":"build_error","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"data,train,tune,serve,rllib","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"data,train,tune,serve,rllib","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":28.4,"import_time_s":1.96,"mem_mb":27.8,"disk_size":"801M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":8.3,"import_time_s":2.06,"mem_mb":27.3,"disk_size":"244M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"data,train,tune,serve,rllib","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":2.09,"mem_mb":27.4,"disk_size":"789M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":2.13,"mem_mb":26.9,"disk_size":"239M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"data,train,tune,serve,rllib","exit_code":1,"wheel_type":null,"failure_reason":"build_error","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":" $EXIT -eq 0 ","exit_code":1,"wheel_type":null,"failure_reason":"build_error","install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"data,train,tune,serve,rllib","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":1,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":null,"mem_mb":null,"disk_size":null},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"data,train,tune,serve,rllib","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":39.7,"import_time_s":1.41,"mem_mb":23.8,"disk_size":"767M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":" $EXIT -eq 0 ","exit_code":0,"wheel_type":"wheel","failure_reason":null,"install_time_s":10.2,"import_time_s":1.39,"mem_mb":23.4,"disk_size":"231M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"data,train,tune,serve,rllib","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.27,"mem_mb":23.8,"disk_size":"764M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":1.3,"mem_mb":23.5,"disk_size":"230M"}]},"quickstart_checks":{"last_tested":"2026-04-23","tag":"stale","tag_description":"widespread failures or data too old to trust","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]}}