From 05a5e594dd104dbfc16a5a52cd68a4025a8e1225 Mon Sep 17 00:00:00 2001 From: Venkata Jagannath <160357297+venkatajagannath@users.noreply.github.com> Date: Tue, 20 Aug 2024 11:48:57 -0400 Subject: [PATCH] Documentation improvements (#43) * Documentation changes * Added connection screenshot --- docs/CONTRIBUTING.rst | 2 +- docs/_static/connection.png | Bin 0 -> 92875 bytes docs/api/ray_provider.decorators.rst | 15 +------ docs/api/ray_provider.hooks.rst | 18 +------- docs/api/ray_provider.operators.rst | 18 +------- docs/api/ray_provider.triggers.rst | 18 +------- docs/conf.py | 6 ++- docs/getting_started/code_samples.rst | 32 +++++++++++--- docs/getting_started/setup.rst | 59 ++++++++++++-------------- docs/index.rst | 16 ++++--- pyproject.toml | 1 + 11 files changed, 77 insertions(+), 108 deletions(-) create mode 100644 docs/_static/connection.png diff --git a/docs/CONTRIBUTING.rst b/docs/CONTRIBUTING.rst index 082cf32..fb70c17 100644 --- a/docs/CONTRIBUTING.rst +++ b/docs/CONTRIBUTING.rst @@ -16,7 +16,7 @@ To contribute to the **Ray provider** project: #. Please create a `GitHub Issue `_ describing your contribution. #. Open a feature branch off of the ``main`` branch and create a Pull Request into the ``main`` branch from your feature branch. #. Link your issue to the pull request. -#. Once developments are complete on your feature branch, request a review and it will be merged once approved. +#. Once development is complete on your feature branch, request a review and it will be merged once approved. Test Changes Locally -------------------- diff --git a/docs/_static/connection.png b/docs/_static/connection.png new file mode 100644 index 0000000000000000000000000000000000000000..294bda6d20a617f5cf5c0cd2f5c12a5677904e81 GIT binary patch literal 92875 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 F{|oC2cJ=@O literal 0 HcmV?d00001 diff --git a/docs/api/ray_provider.decorators.rst b/docs/api/ray_provider.decorators.rst index 92fad9b..e2f5347 100644 --- a/docs/api/ray_provider.decorators.rst +++ b/docs/api/ray_provider.decorators.rst @@ -1,21 +1,8 @@ -ray\_provider.decorators package -================================ -Submodules +Decorators ---------- -ray\_provider.decorators.ray module ------------------------------------ - .. automodule:: ray_provider.decorators.ray :members: :undoc-members: :show-inheritance: - -Module contents ---------------- - -.. automodule:: ray_provider.decorators - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/ray_provider.hooks.rst b/docs/api/ray_provider.hooks.rst index 50987a9..6cf932c 100644 --- a/docs/api/ray_provider.hooks.rst +++ b/docs/api/ray_provider.hooks.rst @@ -1,21 +1,7 @@ -ray\_provider.hooks package -=========================== - -Submodules ----------- - -ray\_provider.hooks.ray module ------------------------------- +Hook +----- .. automodule:: ray_provider.hooks.ray :members: :undoc-members: :show-inheritance: - -Module contents ---------------- - -.. automodule:: ray_provider.hooks - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/ray_provider.operators.rst b/docs/api/ray_provider.operators.rst index 9bd1002..af1bfa6 100644 --- a/docs/api/ray_provider.operators.rst +++ b/docs/api/ray_provider.operators.rst @@ -1,21 +1,7 @@ -ray\_provider.operators package -=============================== - -Submodules ----------- - -ray\_provider.operators.ray module ----------------------------------- +Operators +--------- .. automodule:: ray_provider.operators.ray :members: :undoc-members: :show-inheritance: - -Module contents ---------------- - -.. automodule:: ray_provider.operators - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/ray_provider.triggers.rst b/docs/api/ray_provider.triggers.rst index bbe58f0..4b71046 100644 --- a/docs/api/ray_provider.triggers.rst +++ b/docs/api/ray_provider.triggers.rst @@ -1,21 +1,7 @@ -ray\_provider.triggers package -============================== - -Submodules ----------- - -ray\_provider.triggers.ray module ---------------------------------- +Trigger +-------- .. automodule:: ray_provider.triggers.ray :members: :undoc-members: :show-inheritance: - -Module contents ---------------- - -.. automodule:: ray_provider.triggers - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/conf.py b/docs/conf.py index a942bcd..b5feb91 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -29,5 +29,7 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_theme = "pydata_sphinx_theme" -html_title = "astro-provider-ray" +html_theme = "furo" +html_title = "Package documentation" + +html_last_updated_fmt = "%b %d, %Y" diff --git a/docs/getting_started/code_samples.rst b/docs/getting_started/code_samples.rst index 6dde7f1..c4bca26 100644 --- a/docs/getting_started/code_samples.rst +++ b/docs/getting_started/code_samples.rst @@ -1,22 +1,42 @@ Code Samples -^^^^^^^^^^^^^^^ +============ There are two main scenarios for using this provider: Scenario 1: Setting up a Ray cluster on an existing Kubernetes cluster -"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +---------------------------------------------------------------------- -If you have an existing Kubernetes cluster and want to install a Ray cluster on it, and then run a Ray job, you can use the ``SetupRayCluster``, ``SubmitRayJob``, and ``DeleteRayCluster`` operators. Here's an example DAG (``setup_teardown.py``): +If you have an existing Kubernetes cluster and want to install a Ray cluster on it, and then run a Ray job, you can use the ``SetupRayCluster``, ``SubmitRayJob``, and ``DeleteRayCluster`` operators. + +This will involve 2 steps - + +Create a YAML file defining your Ray cluster configuration. +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + ``spec.headGroupSpec.serviceType`` must be a 'LoadBalancer' to spin a service that exposes your dashboard externally + +.. literalinclude:: ../../example_dags/scripts/ray.yaml + +Save this file in a location accessible to your Airflow installation, and reference it in your DAG code. + + +Sample DAG (``setup_teardown.py``): +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. literalinclude:: ../../example_dags/setup-teardown.py + :language: python + :linenos: Scenario 2: Using an existing Ray cluster -""""""""""""""""""""""""""""""""""""""""" +----------------------------------------- If you already have a Ray cluster set up, you can use the ``SubmitRayJob`` operator or ``task.ray()`` decorator to submit jobs directly. -In the below example(``ray_taskflow_example.py``), the ``@task.ray`` decorator is used to define a task that will be executed on the Ray cluster. +In the example below (``ray_taskflow_example.py``), the ``@task.ray`` decorator is used to define a task that will be executed on the Ray cluster: .. literalinclude:: ../../example_dags/ray_taskflow_example.py + :language: python + :linenos: -Remember to adjust file paths, connection IDs, and other specifics according to your setup. +.. note:: + Remember to adjust file paths, connection IDs, and other specifics according to your setup. diff --git a/docs/getting_started/setup.rst b/docs/getting_started/setup.rst index 753affd..2c0d093 100644 --- a/docs/getting_started/setup.rst +++ b/docs/getting_started/setup.rst @@ -1,47 +1,42 @@ -Getting started -~~~~~~~~~~~~~~~ +Getting Started +=============== -1. Pre-requisites -^^^^^^^^^^^^^^^^^ - -The ``SetupRayCluster`` and the ``DeleteRayCluster`` operator require helm to install the kuberay operator. See the `installing Helm `_ page for more details. - -2. Installation -^^^^^^^^^^^^^^^ +**1. Install Helm:** .. code-block:: sh - pip install astro-provider-ray + curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 + chmod 700 get_helm.sh + ./get_helm.sh -The astro-provider-ray source code is available on this GitHub `page `_ +See the `installing Helm `_ page for other options. -3. Setting up the connection -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. note:: + This step is only required if you intend to use the ``SetupRayCluster`` & ``DeleteRayCluster`` operators. -For SubmitRayJob operator (using an existing Ray cluster) -""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +**2. Install the python package:** -- **Connection Type**: "Ray" -- **Connection ID**: e.g., "ray_conn" -- **Ray dashboard URL**: URL of the Ray dashboard -- **Optional fields**: Cookies, Metadata, Headers, Verify SSL +.. code-block:: sh + + pip install astro-provider-ray -For SetupRayCluster and DeleteRayCluster operators -"""""""""""""""""""""""""""""""""""""""""""""""""" -- **Connection Type**: "Ray" -- **Connection ID**: e.g., "ray_k8s_conn" -- **Kube config path** OR **Kube config content (JSON format)** : Kubeconfig of the kubernetes cluster where Ray cluster must be setup -- **Namespace**: The k8 namespace where your cluster must be created. If not provided, "default" is used -- **Optional fields**: Cluster context, Disable SSL, Disable TCP keepalive +**3. Setting up the connection** -5. Setting up the Ray cluster spec -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. image:: ../_static/connection.png + :align: center -Create a YAML file defining your Ray cluster configuration. Example: +- For SubmitRayJob operator (using an existing Ray cluster) -**Note:** ``spec.headGroupSpec.serviceType`` must be a 'LoadBalancer' to spin a service that exposes your dashboard externally + - **Connection Type**: "Ray" + - **Connection ID**: e.g., "ray_conn" + - **Ray dashboard URL**: URL of the Ray dashboard + - **Optional fields**: Cookies, Metadata, Headers, Verify SSL -.. literalinclude:: ../../example_dags/scripts/ray.yaml +- For SetupRayCluster and DeleteRayCluster operators -Save this file in a location accessible to your Airflow installation, and reference it in your DAG code. + - **Connection Type**: "Ray" + - **Connection ID**: e.g., "ray_k8s_conn" + - **Kube config path** OR **Kube config content (JSON format)**: Kubeconfig of the Kubernetes cluster where Ray cluster must be set up + - **Namespace**: The K8s namespace where your cluster must be created. If not provided, "default" is used + - **Optional fields**: Cluster context, Disable SSL, Disable TCP keepalive diff --git a/docs/index.rst b/docs/index.rst index bd7ee41..9698b41 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,5 +1,5 @@ -Welcome to astro-provider-ray documentation! -=================================================== +Welcome to Ray provider documentation! +====================================== .. toctree:: :hidden: @@ -27,12 +27,18 @@ Benefits of using this provider include: Table of Contents ----------------- +- `Quickstart`_ - `What is the Ray provider?`_ - `Components`_ - `Contact the Devs`_ - `Changelog`_ - `Contributing Guide`_ +Quickstart +---------- + +See the :doc:`Getting Started ` page for detailed instructions on how to begin using the provider. + What is the Ray provider? ------------------------- @@ -55,7 +61,7 @@ The architecture diagram above shows how we can deploy both Airflow & Ray on a K Use Cases -^^^^^^^^ +^^^^^^^^^ - **Scalable ETL**: Orchestrate and monitor Ray jobs on on-demand compute clusters using the Ray Data library. These operations could be custom Python code or ML model inference. - **Model Training**: Schedule model training or fine-tuning jobs on flexible cadences (daily/weekly/monthly). Benefits include: @@ -88,12 +94,12 @@ Decorators Operators ^^^^^^^^^ - **SetupRayCluster**: Sets up or Updates a ray cluster on kubernetes using a kubeconfig input provided through the Ray connection -- **DeleteRayCluster**: Deletes and existing Ray cluster on kubernetes using the same Ray connection +- **DeleteRayCluster**: Deletes an existing Ray cluster on kubernetes using the same Ray connection - **SubmitRayJob**: Submits jobs to a Ray cluster using a specified host name and monitors its execution Triggers ^^^^^^^^ -- **RayJobTrigger**: Monitors asynchronous job execution submitted via ``SubmitRayJob`` or using the ``@task.ray()`` decorator and prints real-time logs to the the Airflow UI +- **RayJobTrigger**: Monitors asynchronous job execution submitted via the ``SubmitRayJob`` operator or using the ``@ray.task()`` decorator and prints real-time logs to the the Airflow UI Contact the devs diff --git a/pyproject.toml b/pyproject.toml index 85d834d..266c2e6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -102,6 +102,7 @@ dependencies = [ "sphinx", "sphinx-autoapi", "sphinx-autobuild", + "furo", ] [tool.hatch.envs.docs.scripts]