From 09e8aed247846fc1aee75cc269c790fbd13bbd3f Mon Sep 17 00:00:00 2001 From: Sahil Date: Tue, 21 May 2024 22:46:55 +0530 Subject: [PATCH] [Add] basic pipelines documentation --- docs/Pipelines/BranchingStrategy.md | 29 ++++ docs/Pipelines/GettingStarted.md | 25 +++ docs/Pipelines/NextflowVsPWL.md | 23 +++ .../Nextflow/QuickStartNextflow.md | 140 ++++++++++++++++ .../WritingPipelines/PWL/QuickStartPWL.md | 157 ++++++++++++++++++ .../WritingPipelines/PWL/Subflows.md | 107 ++++++++++++ docs/img/Pipelines/toy_pipeline.png | Bin 0 -> 46417 bytes mkdocs.yml | 26 ++- 8 files changed, 505 insertions(+), 2 deletions(-) create mode 100644 docs/Pipelines/BranchingStrategy.md create mode 100644 docs/Pipelines/GettingStarted.md create mode 100644 docs/Pipelines/NextflowVsPWL.md create mode 100644 docs/Pipelines/WritingPipelines/Nextflow/QuickStartNextflow.md create mode 100644 docs/Pipelines/WritingPipelines/PWL/QuickStartPWL.md create mode 100644 docs/Pipelines/WritingPipelines/PWL/Subflows.md create mode 100644 docs/img/Pipelines/toy_pipeline.png diff --git a/docs/Pipelines/BranchingStrategy.md b/docs/Pipelines/BranchingStrategy.md new file mode 100644 index 00000000..bcb20254 --- /dev/null +++ b/docs/Pipelines/BranchingStrategy.md @@ -0,0 +1,29 @@ + +Your feature branch must be forked off from master ideally. Suppose, you are creating a new pipeline named pipeline_007 pertaining to Jira ticket TKT-162, you should create a branch like this: + +``` +git checkout master +git checkout -b TKT-162/ftr/pipeline_007_dev +``` +
+ +There are 3 main branches in the pipelines repository - `develop`, `staging` & `master`. Your branch should be first merged to `develop` followed by `staging` and then when it is production-ready, a last PR should be raised to `master`. Each branch merge or commit to 3 main branches or on `*_dev` branches triggers a deployment to specific environment(s). Check the following table to understand deployment triggers: + +| Branch | Devpolly | Testpolly | Polly | Description | +| --------- | ----------------- | ----------------- | ----------------- | ----------------------------------------------------------------------------- | +| `*_dev` | :material-check: | :material-close: | :material-check: | Commits to branches ending with `_dev` are deployed to devpolly and on polly | +| `develop` | :material-check: | :material-close: | :material-check: | PR merges to `develop` branch is deployed to devpolly and polly | +| `staging` | :material-close: | :material-check: | :material-check: | PR merges to `staging` branch is deployed to testpolly and polly | +| `master` | :material-close: | :material-close: | :material-check: | PR merges to `master` branch is only deployed to polly | + + +!!! note "Important Note" + As you can see, all the 4 branch types (`*_dev`, `develop`, `staging`, `master`) are deployed to production along with other environments. This approach ensures that pipeline developers can test their pipelines without relying solely on the stability of devpolly and testpolly environments. In the production environment, each pipeline is assigned a 'stage' attribute that differentiates its maturity level. The *_dev and develop branches are designated as the 'dev' stage, the staging branch represents the 'test' stage, and the master branch is considered the 'prod' or production stage. + +
+
+
+
+
+
+ diff --git a/docs/Pipelines/GettingStarted.md b/docs/Pipelines/GettingStarted.md new file mode 100644 index 00000000..db20bada --- /dev/null +++ b/docs/Pipelines/GettingStarted.md @@ -0,0 +1,25 @@ + + +Welcome to Polly Pipelines, a powerful workflow orchestration framework designed to simplify the process of building, managing, and executing complex pipelines. With Polly Pipelines, users can focus on running their pipelines without worrying about the underlying infrastructure. + + +## Why use Polly Pipelines? +- **Multi-language support:** Supports two languages for writing pipelines: Nextflow and Polly Workflow Language (PWL). We are planning to support Snakemake soon! +- **GUI and Programmatic Interface:** Provides user-friendly GUI and polly-python interfaces to monitor and execute pipelines +- **No infrastructure management:** Abstracts away complexities of infrastructure management and deployment. As a user, you just need to focus on writing pipelines! +- **Cloud and on-prem execution:** You can choose to execute your pipelines on cloud or on-prem. Helps you save costs! This feature is available only on Nextflow pipelines for now + + +If you are confused on what language to choose from while writing pipelines, please [check these guidelines](NextflowVsPWL.md) + + +
+ +To learn how to write pipelines, please check the following quick start guides + +
+ +- :material-arrow-right: [__Nextflow__ Quick Start Guide](WritingPipelines/Nextflow/QuickStartNextflow.md) +- :material-arrow-right: [__PWL__ Quick Start Guide](WritingPipelines/PWL/QuickStartPWL.md) + +
diff --git a/docs/Pipelines/NextflowVsPWL.md b/docs/Pipelines/NextflowVsPWL.md new file mode 100644 index 00000000..1ca92fb1 --- /dev/null +++ b/docs/Pipelines/NextflowVsPWL.md @@ -0,0 +1,23 @@ + + +#### Choose Nextflow if: +- You like to use [nf-core](https://nf-co.re/) community pipelines +- You primarily work in bioinformatics and scientific workflows +- You need data-parallelism capabilities +- You're comfortable with learning a new syntax + +#### Choose PWL if: +- You're a Python developer comfortable with functional programming +- You need a highly scalable and flexible framework for diverse workflows, including data science +- You prioritize ease of use, user-friendliness, and a rich feature set + +
+ +
+ +- :material-arrow-right: [__Nextflow__ Quick Start Guide](WritingPipelines/Nextflow/QuickStartNextflow.md) +- :material-arrow-right: [__PWL__ Quick Start Guide](WritingPipelines/PWL/QuickStartPWL.md) + +
+ + diff --git a/docs/Pipelines/WritingPipelines/Nextflow/QuickStartNextflow.md b/docs/Pipelines/WritingPipelines/Nextflow/QuickStartNextflow.md new file mode 100644 index 00000000..5128a699 --- /dev/null +++ b/docs/Pipelines/WritingPipelines/Nextflow/QuickStartNextflow.md @@ -0,0 +1,140 @@ + +Welcome to Nextflow quick start guide! + +## Setting up the environment + +Start by cloning the repository. Assuming you have your ElucidataInc GitHub SSH key setup: +``` bash +git clone git@github.com:ElucidataInc/pipelines.git +``` + +Create a virtual environment in Python [refer to this doc](https://www.freecodecamp.org/news/how-to-setup-virtual-environments-in-python/) and activate it + +``` bash +cd pipelines +# Activate your virtual env here +``` + +Install some basic requirements + +``` bash +pip install -r requirements.txt +``` + +Install pre-commit hooks for basic formatting checks on code commit + +``` bash +pre-commit install +``` + +
+ + +## Understanding the structure of pipelines repo + +Let’s go over the structure of the repository in brief. The following schematic shows some important root level files and folders and their purposes: + +``` hl_lines="7 8 9 10 11 12 13 14" +pipelines # the repository + │ + ├── .circleci/ # config for CI/CD + ├── deployment/ # deployment scripts and utilities + ├── orchestration/ # utilities for enabling pipeline development + │ + ├── pipelines/ + │ │ + │ ├── nextflow/ # All Nextflow pipelines + │ │ ├── pipeline_1/ + │ │ └── pipeline_2/ + │ │ + │ └── pwl/ # All PWL pipelines + │ └── pipeline_3/ + ├── ... + ├── requirements.txt # dependencies + ├── ... + └── scripts/ # common scripts +``` + +!!! info + As a pipeline developer, you should only care about the pipelines directory (highlighted above). It will contain both Nextflow and PWL pipelines + +
+ +A Pipeline will follow a specific directory structure. To better grasp this concept, let's explore the directory structure of a demo pipeline. + +``` +toy/ # nextflow pipeline named "toy" + │ + ├── __init__.py + │ + ├── build + │ ├── Dockerfile # For building docker image (must) + │ └── environment.yml # dependencies for pipeline (must) + │ + ├── config + │ ├── dev.json # config for devpolly + │ ├── test.json # config for testpolly + │ └── prod.json # config for polly + │ + ├── src # Source code + │ ├── main.nf + │ ├── Makefile + │ └── nextflow.config + │ + └── parameter_schema.json # Defines pipeline's parameters (must) + +``` + + +## Let's create your first pipeline + +1. We will start by forking a branch from `#! master` + + ``` bash + git checkout master + git checkout -b _dev + # Make sure your branch name ends with _dev. + ``` + + The pipelines repository employs a branching strategy. For more details please refer to [this page](../../BranchingStrategy.md). + + +2. Secondly, instead of creating a pipeline from scratch, let's copy an example pipeline and try playing with it + + ``` bash + mkdir pipelines/nextflow/ + cp -r pipelines/nextflow/toy/ pipelines/nextflow// + ``` + +3. Go to `build/Dockerfile` and change the pipeline path in the highlighted `COPY` command + + ``` hl_lines="4" + FROM nfcore/base:2.1 + + # Install the conda environment + COPY pipelines/nextflow/toy/build/environment.yml . + RUN pip3 --no-cache-dir install --upgrade awscli + + CMD ["bash","echo 'ECS_IMAGE_PULL_BEHAVIOR=once' >> /etc/ecs/ecs.config"] + ``` + +4. After all the above changes are done, let's push your pipeline + + ``` bash + git add . + git commit -m 'First pipeline' + git push origin + ``` + +6. Go to [circleCI](https://app.circleci.com/pipelines/github/ElucidataInc/pipelines) and approve the hold to deploy your pipeline + + +Congrats! You have deployed your first pipeline. Go to [Polly](https://polly.elucidata.io/manage/pipelines) (after circleCI jobs are completed). Click on your pipeline, pass in the parameters and initiate your first run. + + +
+
+
+
+
+
\ No newline at end of file diff --git a/docs/Pipelines/WritingPipelines/PWL/QuickStartPWL.md b/docs/Pipelines/WritingPipelines/PWL/QuickStartPWL.md new file mode 100644 index 00000000..c3dfaa37 --- /dev/null +++ b/docs/Pipelines/WritingPipelines/PWL/QuickStartPWL.md @@ -0,0 +1,157 @@ + +Welcome to PWL quick start guide! + +## Setting up the environment + +Start by cloning the repository. Assuming you have your ElucidataInc GitHub SSH key setup: +``` bash +git clone git@github.com:ElucidataInc/pipelines.git +``` + +Create a virtual environment in Python [refer to this doc](https://www.freecodecamp.org/news/how-to-setup-virtual-environments-in-python/) and activate it + +``` bash +cd pipelines +# Activate your virtual env here +``` + +Install some basic requirements + +``` bash +pip install -r requirements.txt +``` + +Install pre-commit hooks for basic formatting checks on code commit + +``` bash +pre-commit install +``` + +
+ + +## Understanding the structure of pipelines repo + +Let’s go over the structure of the repository in brief. The following schematic shows some important root level files and folders and their purposes: + +``` hl_lines="7 8 9 10 11 12 13 14" +pipelines # the repository + │ + ├── .circleci/ # config for CI/CD + ├── deployment/ # deployment scripts and utilities + ├── orchestration/ # utilities for enabling pipeline development + │ + ├── pipelines/ + │ │ + │ ├── nextflow/ # All Nextflow pipelines + │ │ ├── pipeline_1/ + │ │ └── pipeline_2/ + │ │ + │ └── pwl/ # All PWL pipelines + │ └── pipeline_3/ + ├── ... + ├── requirements.txt # dependencies + ├── ... + └── scripts/ # common scripts +``` + +!!! info + As a pipeline developer, you should only care about the pipelines directory (highlighted above). It will contain both Nextflow and PWL pipelines + +
+ +A Pipeline will follow a specific directory structure. To better grasp this concept, let's explore the directory structure of a demo pipeline. + +``` +demo_protein_processing/ # pwl pipeline named "demo_protein_processing" + │ + ├── __init__.py + │ + ├── build + │ ├── Dockerfile # For building docker image (must be present) + │ └── requirements.txt # dependencies for pipeline (must be present) + │ + ├── config + │ ├── dev.json # config for devpolly + │ ├── test.json # config for testpolly + │ └── prod.json # config for polly + │ + ├── src # Source code + │ ├── __init__.py + │ └── main.py + │ + └── parameter_schema.json # Defines pipeline's parameters (must be present) +``` + + +## Let's create your first pipeline + +1. We will start by forking a branch from `#! master` + + ``` bash + git checkout master + git checkout -b _dev + # Make sure your branch name ends with _dev. + ``` + + The pipelines repository employs a branching strategy. For more details please refer to [this page](../../BranchingStrategy.md). + + +2. Secondly, instead of creating a pipeline from scratch, let's copy an example pipeline and try playing with it + + ``` bash + mkdir pipelines/pwl/ + cp -r pipelines/pwl/demo_protein_processing/ pipelines/pwl// + ``` + +3. Go to `build/Dockerfile` and change the pipeline path in the highlighted `COPY` command + + ``` hl_lines="3" + FROM mithoopolly/workflows-base:python3.9 + + COPY pipelines/pwl/demo_protein_processing/build/requirements.txt . + + RUN pip install -r requirements.txt + + ``` + +4. Change the entrypoint function name in `main.py` to match pipeline name. This is important! + + ``` python hl_lines="2 12" + @workflow(result_serialization=Serialization.JSON) + def demo_protein_processing(exp_id: str = "exp1", pre_process: bool = False): + secret_key = "MY_SECRET_KEY" + secret_value = Secrets.get(secret_key) + Logger.info(f"My secret value: {secret_value}") + + ## + ## + ## + + if __name__ == "__main__": + demo_protein_processing("exp1.data", True) + ``` + + +5. After all the above changes are done, let's push your pipeline + + ``` bash + git add . + git commit -m 'First pipeline' + git push origin + ``` + +6. Go to [circleCI](https://app.circleci.com/pipelines/github/ElucidataInc/pipelines) and approve the hold to deploy your pipeline + + +Congrats! You have deployed your first pipeline. Go to [Polly](https://polly.elucidata.io/manage/pipelines) (after circleCI jobs are completed). Click on your pipeline, pass in the parameters and initiate your first run. + + +Now that you have deployed your first PWL pipeline, let's do in-depth dive on creating your pipelines from scratch. [Check this page](UnderstandingTheSyntax.md). + +
+
+
+
+
+
\ No newline at end of file diff --git a/docs/Pipelines/WritingPipelines/PWL/Subflows.md b/docs/Pipelines/WritingPipelines/PWL/Subflows.md new file mode 100644 index 00000000..33abee5b --- /dev/null +++ b/docs/Pipelines/WritingPipelines/PWL/Subflows.md @@ -0,0 +1,107 @@ + +Pipelines can import and call other Pipelines. We call the child Pipeline a “subflow”. This is simply a terminology to name this pattern and no special work is required on the developer’s part. + +At the code level, pipelines are just functions and they can call other pipeline functions. However, behind the scenes, subflows will get executed as child processes in their own containers. This is why the subflow function must be an already registered pipeline. + + +## Example + +Consider the following two pipelines and their configuration: + +
+ +``` py title="pipelines/pwl/toy/src/main.py" +from orchestration import task, workflow +from pipelines.pwl.words.src.main import words + + +@task +def validate_url(url: str): + pass + + +@task +def counts_per_word(words: list): + pass + + +@workflow +def toy(url: str): + validate_url(url) + words_ = words(url) + return couns_per_word(words_) +``` + +``` py title="pipelines/pwl/words/src/main.py" +from orchestration import task, workflow + + + +@task +def download_text(url: str) -> str: + pass + + +@task +def text_to_words(text: str) -> list: + pass + + +@workflow +def words(url) -> list: + text = download_text(url) + words = text_to_words(text) + return words +``` + +
+ +
+ + +
+ +``` json title="pipelines/pwl/toy/config.json" +{ + "infra": { + "memory": 2048, + "cpu": 1024 + } +} +``` + +``` json title="pipelines/pwl/words/config.json" +{ + "infra": { + "memory": 4096, + "cpu": 2048 + } +} +``` + +
+ +
+ +In this example, the pipeline `words` is being called from the pipeline `toy`. This makes `words` a subflow of `toy` in this context. Whenever `toy` is run, `words` will be run as a subflow. But `words` will not run in the same container as its parent `toy`. A separate container will be created for `words` based on its `config.json` file and its result will be seamlessly send back to `toy` for further use. The following diagram depicts this visually: + +![Toy Pipeline](../../../img/Pipelines/toy_pipeline.png) + +When observed on the monitoring dashboard, the pipeline and its subflows together will behave as if it were all just one sequence of tasks. There may be logs saying that a pipeline is being called as a subflow, but that’s about it. If needed, we can make this more obvious on the dashboard in some future iteration. + + +!!! Note + While theoretically possible, please try to avoid multiple levels of subflow nesting. But if its necessary, go ahead and do it anyway. We will do our best to support it. + + The subflow is just another pipeline and as such needs to be deployed separately to make it work as described in this document. Simply decorating a standalone function with `@workflow` may not achieve the outcome you intended. + + The logs from the parent pipeline and its subflows will come interleaved on the monitoring dashboard. + + + +
+
+
+
+
+
diff --git a/docs/img/Pipelines/toy_pipeline.png b/docs/img/Pipelines/toy_pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..6ec7cfdadb8c9853fe47eb6565ef95c7ef8b49ca GIT binary patch literal 46417 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