From 600e9ff81e85031bd6190811f0d8848540a5046d Mon Sep 17 00:00:00 2001 From: ChristineSchulz Date: Tue, 7 Jul 2026 10:14:07 +0200 Subject: [PATCH 1/5] add: PLM notebook --- .github/workflows/main.yml | 4 + notebooks/PLM-interact.ipynb | 189 +++++++++++++++++++++++++++++++++++ 2 files changed, 193 insertions(+) create mode 100644 notebooks/PLM-interact.ipynb diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5029267..e8db408 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -70,3 +70,7 @@ jobs: run: | python -m pytest --nbval notebooks/RFDiffusion.ipynb tests/rfdiffusion_output.py + - name: Run PLM-Interact + run: | + python -m pytest --nbval notebooks/PLM-Interact.ipynb + diff --git a/notebooks/PLM-interact.ipynb b/notebooks/PLM-interact.ipynb new file mode 100644 index 0000000..4a167e7 --- /dev/null +++ b/notebooks/PLM-interact.ipynb @@ -0,0 +1,189 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "5b554a86-ff7e-453a-9e79-877f88bb3290", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path" + ] + }, + { + "cell_type": "markdown", + "id": "1e510275-e8e5-400b-bde1-c6b67007177f", + "metadata": {}, + "source": [ + "First we need to define where PLM_interact finds our input data and where the output files are written to. You can see these files in the file browser on the left. If you change these names, remember to change them in the analysis notebook as well.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "4e09c3bd-e8ad-42c0-ada0-798eefbed072", + "metadata": {}, + "outputs": [], + "source": [ + "WORKING_DIR = Path.home() / \"PLM_interact\"\n", + "OUTPUT_DIR = WORKING_DIR / \"output\"" + ] + }, + { + "cell_type": "markdown", + "id": "7b0c1ba2-55c2-44dc-86e6-1e950be264a8", + "metadata": {}, + "source": [ + "Next we need to upload our sequence pairs. A description of the `.csv` format can be found [here](https://github.com/liudan111/PLM-interact/tree/main#1-ppi-inference-with-multi-gpus). You also need to tell PLM-interact the length of the longest sequence." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f4e4a1ed-4ac8-46dd-8566-59eb6ac9312c", + "metadata": {}, + "outputs": [], + "source": [ + "list_of_sequence_pairs = WORKING_DIR / \"test.csv\"\n", + "max_length = 1520" + ] + }, + { + "cell_type": "markdown", + "id": "fe247cff-b189-4aa4-8270-00bed455be0f", + "metadata": {}, + "source": [ + "Now we can prepare a bash file that calls PLM-interact." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "0af52ad0-7482-434d-88c1-d479cf1d68e9", + "metadata": {}, + "outputs": [], + "source": [ + "RUN_FILE = \"run.sh\"\n", + "\n", + "run_file = f\"\"\"\n", + "#!/bin/bash\n", + "\n", + "module load devel/miniforge/24.9.2\n", + "conda activate /mnt/sds-hd/sd25g005/PLMinteract\n", + "\n", + "! torchrun --nproc_per_node=1 -m PLMinteract inference_PPI \\\\\n", + "--seed 2 \\\\\n", + "--batch_size_val 1 \\\\\n", + "--test_filepath {list_of_sequence_pairs} \\\\\n", + "--resume_from_checkpoint /mnt/sds-hd/sd25g005/PLMinteract/download_huggingface_folder/PLM-interact-650M-humanV11/pytorch_model.bin \\\\\n", + "--output_filepath {OUTPUT_DIR}/ \\\\\n", + "--offline_model_path /mnt/sds-hd/sd25g005/PLMinteract/download_huggingface_folder/offline/ \\\\\n", + "--model_name esm2_t33_650M_UR50D \\\\\n", + "--embedding_size 1280 --max_length {max_length}\n", + "\"\"\"\n", + "\n", + "with open(RUN_FILE, \"w\") as file:\n", + " file.write(run_file)" + ] + }, + { + "cell_type": "markdown", + "id": "ce271a31-601b-44da-897a-9ba5f2b2e17e", + "metadata": {}, + "source": [ + "Execute the cell below to start the PLM-interact:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "4a42c64e-0880-4a05-8d19-1d1bc59074bd", + "metadata": { + "scrolled": true, + "tags": [ + "nbval-skip" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Running file run.sh\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Be aware, overflowing tokens are not returned for the setting you have chosen, i.e. sequence pairs with the 'longest_first' truncation strategy. So the returned list will always be empty even if some tokens have been removed.\n" + ] + }, + { + "data": { + "text/plain": [ + "256" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "os.system(f'echo \"Running file {RUN_FILE}\"')\n", + "os.system(f\"bash {RUN_FILE}\")" + ] + }, + { + "cell_type": "markdown", + "id": "2e0f40d5-349e-4289-bf73-45fc3b2ee1d1", + "metadata": {}, + "source": [ + "If you want to have your input sequences and the output scores in one `.csv` file, execute the following cells:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "b0e04a4c-3288-4458-a433-cd3d24ef1f14", + "metadata": { + "tags": [ + "nbval-skip" + ] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "input_csv = pd.read_csv(list_of_sequence_pairs)\n", + "output_csv = pd.read_csv(OUTPUT_DIR / \"pred_scores.csv\", header=None)\n", + "\n", + "results_csv = pd.merge(input_csv, output_csv, left_index=True, right_index=True)\n", + "results_csv.to_csv(OUTPUT_DIR / \"pred_scores_w_sequences.csv\", index=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From f243b470beb0bd0c77b5e1ba1508ad14046450a6 Mon Sep 17 00:00:00 2001 From: ChristineSchulz Date: Tue, 7 Jul 2026 10:14:48 +0200 Subject: [PATCH 2/5] add: PLM tutorial --- docs/images/tutorial/bwVisu_PLM_files.png | Bin 0 -> 20416 bytes docs/images/tutorial/bwVisu_PLM_input.png | Bin 0 -> 25207 bytes .../tutorial/bwVisu_PLM_more_output.png | Bin 0 -> 22438 bytes docs/images/tutorial/bwVisu_PLM_output.png | Bin 0 -> 15158 bytes docs/tutorials/tutorial_PLM_bwVisu.md | 88 ++++++++++++++++++ mkdocs.yml | 1 + 6 files changed, 89 insertions(+) create mode 100644 docs/images/tutorial/bwVisu_PLM_files.png create mode 100644 docs/images/tutorial/bwVisu_PLM_input.png create mode 100644 docs/images/tutorial/bwVisu_PLM_more_output.png create mode 100644 docs/images/tutorial/bwVisu_PLM_output.png create mode 100644 docs/tutorials/tutorial_PLM_bwVisu.md diff --git a/docs/images/tutorial/bwVisu_PLM_files.png b/docs/images/tutorial/bwVisu_PLM_files.png new file mode 100644 index 0000000000000000000000000000000000000000..9961ce12271f1c7a618568898c9c6867e8e447e3 GIT binary patch literal 20416 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 literal 0 HcmV?d00001 diff --git a/docs/tutorials/tutorial_PLM_bwVisu.md b/docs/tutorials/tutorial_PLM_bwVisu.md new file mode 100644 index 0000000..25621ae --- /dev/null +++ b/docs/tutorials/tutorial_PLM_bwVisu.md @@ -0,0 +1,88 @@ +# PLM-Interact on bwVisu + +Welcome to the PLM-interact Tutorial for bwVisu! + +PLM-interact is an open-source protein language model that predicts whether two proteins can interact from their sequences. This tutorial will guide you through running PLM-interact on bwVisu. Please follow these steps carefully. Any feedback on the tutorial is welcome! Feel free to [contact us](../contact.md)! + +### Step 1: Get access to bwVisu + +To start, get access to bwVisu via bwForCluster Helix or SDS. For more information, visit + +https://www.urz.uni-heidelberg.de/en/service-catalogue/software-and-applications/bwvisu + +For technical questions regarding the high performance cluster, see https://bw-support.scc.kit.edu. Feel free to [contact us](../contact.md) for support. + +### Step 2: Connect to bwVisu and Start Jupyter + +Go to https://bwvisu.bwservices.uni-heidelberg.de/ and log in with your credentials and one-time password. + +Choose Jupyter and start a new session. Now you can select the resources you need. + +For the inference model in PLM-interact we need a GPU. A list of available GPUs and their specifications is available at https://wiki.bwhpc.de/e/Helix/Hardware#Compute_Nodes, or in the table below. + +![Screenshot](../images/tutorial/Helix_GPU.png){:.invertable} + + +The GPU is selected by "GPU Type". The memory of each GPU Type is specified in GPU Memory per GPU (GB). For this example we select one of the A40 GPUs. Larger jobs (= longer sequences, more chains) require more memory. To access these, it is suggested to run the job directly on the Helix cluster. Feel free to contact us, if you need assistance! + + + +![Screenshot](../images/tutorial/bwVisu_GPU.png){:.invertable} + + +Click on "Launch". This will bring you to a new screen showing your interactive sessions. Wait for your session to be ready, then click on "Connect to Jupyter". This brings you into a JupyterLab environment. + +### Step 3: Set a Working Directory and Upload Files + +Now we need to define a working directory. These will contain all files necessary for the tutorial. A new directory can be created using folder icon on the top left of the file browser: + +![Screenshot](../images/tutorial/bwVisu_newDir.png){: .invertable style="height:111px;width:444px"} + + +#### Input Sequences in `.csv` Format +PLM-interact reads the input sequence pairs from a `.csv` file. More information can be found here. + +| query | text | +| -------- | ------- | +| {sequence1} | {sequence2} | + +If you copy these from `.fasta` files, make sure that there are no spaces within the sequences. + +Upload the PLM-interact notebook from our github and the `.csv` file by clicking on the upload button: + +![Screenshot](../images/tutorial/bwVisu_upload.png){: .invertable style="height:111px;width:444px"} + +After the upload, you can see the notebooks in the file browser on the left. + +![Screenshot](../images/tutorial/bwVisu_PLM_files.png){: .invertable style="width:377px"} + +### Step 4: Open the Notebook and Start the Calculation + +Open `PLM_interact.ipynb` and execute the cells in the notebook to start your Boltzgen run! + + +#### Verify Input + +Before starting your Boltz prediction you should see the following files in your working directory: + +![Screenshot](../images/tutorial/bwVisu_PLM_input.png){:.invertable style="width:377px"} + +#### Verify Output + +In the output directory, there will be a `.csv` file with the output scores. For more information on the scoring, see the PLM-interact publication. + +![Screenshot](../images/tutorial/bwVisu_PLM_output.png){:.invertable style="width:377px"} + +Note that the entries in the output `.csv` file are in the same order as the input sequence pairs. In the tutorial `.ipynb` we include a simple cell to merge the input sequences and output scores, if you prefer this: + +![Screenshot](../images/tutorial/bwVisu_PLM_more_output.png){:.invertable style="width:377px"} + +### References + +https://www.nature.com/articles/s41467-025-64512-w + +https://github.com/liudan111/PLM-interact + +https://huggingface.co/danliu1226/PLM-interact-650M-humanV11 + +https://huggingface.co/facebook/esm2_t33_650M_UR50D diff --git a/mkdocs.yml b/mkdocs.yml index 1b68a08..539da4d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -59,6 +59,7 @@ nav: - tutorials/tutorial_Boltz_bwVisu.md - tutorials/tutorial_Boltzgen_bwVisu.md - tutorials/tutorial_RFDiffusion_bwVisu.md + - tutorials/tutorial_PLM_bwVisu.md - Contact: contact.md extra_css: From ef3380ae99b7c0210acfda92e61af2402741925c Mon Sep 17 00:00:00 2001 From: ChristineSchulz Date: Thu, 16 Jul 2026 15:13:30 +0200 Subject: [PATCH 3/5] tests: PLM Interact --- notebooks/PLM-interact.ipynb | 10 +++++----- references/PLM/run.sh | 15 +++++++++++++++ references/PLM/test.csv | 3 +++ tests/PLM_output.py | 24 ++++++++++++++++++++++++ tests/PLM_prepare.py | 15 +++++++++++++++ tests/__init__.py | 0 tests/conftest.py | 1 + 7 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 references/PLM/run.sh create mode 100644 references/PLM/test.csv create mode 100644 tests/PLM_output.py create mode 100644 tests/PLM_prepare.py create mode 100644 tests/__init__.py diff --git a/notebooks/PLM-interact.ipynb b/notebooks/PLM-interact.ipynb index 4a167e7..4fd4a54 100644 --- a/notebooks/PLM-interact.ipynb +++ b/notebooks/PLM-interact.ipynb @@ -21,12 +21,12 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "4e09c3bd-e8ad-42c0-ada0-798eefbed072", "metadata": {}, "outputs": [], "source": [ - "WORKING_DIR = Path.home() / \"PLM_interact\"\n", + "WORKING_DIR = Path.cwd() / \"PLM_interact\"\n", "OUTPUT_DIR = WORKING_DIR / \"output\"" ] }, @@ -40,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "f4e4a1ed-4ac8-46dd-8566-59eb6ac9312c", "metadata": {}, "outputs": [], @@ -59,12 +59,12 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "0af52ad0-7482-434d-88c1-d479cf1d68e9", "metadata": {}, "outputs": [], "source": [ - "RUN_FILE = \"run.sh\"\n", + "RUN_FILE = WORKING_DIR / \"run.sh\"\n", "\n", "run_file = f\"\"\"\n", "#!/bin/bash\n", diff --git a/references/PLM/run.sh b/references/PLM/run.sh new file mode 100644 index 0000000..d419597 --- /dev/null +++ b/references/PLM/run.sh @@ -0,0 +1,15 @@ + +#!/bin/bash + +module load devel/miniforge/24.9.2 +conda activate /mnt/sds-hd/sd25g005/PLMinteract + +! torchrun --nproc_per_node=1 -m PLMinteract inference_PPI \ +--seed 2 \ +--batch_size_val 1 \ +--test_filepath PLM_interact/test.csv \ +--resume_from_checkpoint /mnt/sds-hd/sd25g005/PLMinteract/download_huggingface_folder/PLM-interact-650M-humanV11/pytorch_model.bin \ +--output_filepath PLM_interact/output/ \ +--offline_model_path /mnt/sds-hd/sd25g005/PLMinteract/download_huggingface_folder/offline/ \ +--model_name esm2_t33_650M_UR50D \ +--embedding_size 1280 --max_length 1520 diff --git a/references/PLM/test.csv b/references/PLM/test.csv new file mode 100644 index 0000000..272d98a --- /dev/null +++ b/references/PLM/test.csv @@ -0,0 +1,3 @@ +query,text +MSAPTPLAEASQIPTIPALSPLTAKQSKGNFFSSNPISSFVVDTYKQLHSHRQSLELVNPGTVENLNKEVSRDVFLSQYFFTGLRADLNKAFSMNPAFQTSHTFSIGSQALPKYAFSALFANDNLFAQGNIDNDLSVSGRLNYGWDKKNISKVNLQISDGQPTMCQLEQDYQASDFSVNVKTLNPSFSEKGEFTGVAVASFLQSVTPQLALGLETLYSRTDGSAPGDAGVSYLTRYVSKKQDWIFSGQLQANGALIASLWRKVAQNVEAGIETTLQAGMVPITDPLMGTPIGIQPTVEGSTTIGAKYEYRQSVYRGTLDSNGKVACFLERKVLPTLSVLFCGEIDHFKNDTKIGCGLQFETAGNQELLMLQQGLDADGNPLQALPQL,MSFLPSFILSDESKERISKILTLTHNVAHYGWIPFVLYLGWAHTSNRPNFLNLLSPLPSV +MALWMRLLPLLALLALWGPDPAAAFVNQHLCGSHLVEALYLVCGERGFFYTPKTRREAEDLQVGQVELGGGPGAGSLQPLALEGSLQKRGIVEQCCTSICSLYQLENYCN,MSFLPSFILSDESKERISKILTLTHNVAHYGWIPFVLYLGWAHTSNRPNFLNLLSPLPSV diff --git a/tests/PLM_output.py b/tests/PLM_output.py new file mode 100644 index 0000000..c0dff81 --- /dev/null +++ b/tests/PLM_output.py @@ -0,0 +1,24 @@ +from pathlib import Path +from tests.utils import normalize_text_paths + + +REPO_ROOT = Path(__file__).resolve().parent.parent +OUTPUT_DIR = REPO_ROOT / "notebooks" / "PLM_interact" + +output_sh = OUTPUT_DIR / "run.sh" +reference_sh = REPO_ROOT / "references" / "PLM" / "run.sh" + +MARKER = "PLM_interact" + + +def test_run_sh_exists(): + assert output_sh.exists(), f"{output_sh} was not created by the notebook" + + +def test_run_sh_content(): + produced_text = normalize_text_paths(output_sh.read_text(), [MARKER]) + expected_text = normalize_text_paths(reference_sh.read_text(), [MARKER]) + + assert produced_text == expected_text, ( + f"Produced {output_sh} differs from reference" + ) diff --git a/tests/PLM_prepare.py b/tests/PLM_prepare.py new file mode 100644 index 0000000..2d3613f --- /dev/null +++ b/tests/PLM_prepare.py @@ -0,0 +1,15 @@ +from pathlib import Path +from tests.utils import prepare_file + +REPO_ROOT = Path(__file__).resolve().parent.parent + + +SRC_csv = REPO_ROOT / "references" / "PLM" / "test.csv" +DST_csv = REPO_ROOT / "notebooks" / "PLM_interact" / "test.csv" + + +def test_prepare_csv(): + """Ensure reference PLM input files are copied for prediction notebook.""" + prepare_file(SRC_csv, DST_csv) + + assert DST_csv.exists() diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py index 166f4b0..449f6ad 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -12,6 +12,7 @@ "BOLTZGEN_WORKING_DIR": NOTEBOOKS_DIR / "protein_design_w_Boltzgen", "RFDIFFUSION_WORKING_DIR": NOTEBOOKS_DIR / "protein_design_w_RFDiffusion", "BINDCRAFT_WORKING_DIR": NOTEBOOKS_DIR / "protein_design_w_Bindcraft", + "PLM_INTERACT_WORKING_DIR": NOTEBOOKS_DIR / "PLM_interact", } From 7585a8b9f7ccbe8425ba1d093616822db9f8045c Mon Sep 17 00:00:00 2001 From: ChristineSchulz Date: Thu, 16 Jul 2026 15:16:22 +0200 Subject: [PATCH 4/5] add: csv example to PLM tutorial --- docs/tutorials/tutorial_PLM_bwVisu.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/tutorial_PLM_bwVisu.md b/docs/tutorials/tutorial_PLM_bwVisu.md index 25621ae..3f73c35 100644 --- a/docs/tutorials/tutorial_PLM_bwVisu.md +++ b/docs/tutorials/tutorial_PLM_bwVisu.md @@ -40,7 +40,7 @@ Now we need to define a working directory. These will contain all files necessar #### Input Sequences in `.csv` Format -PLM-interact reads the input sequence pairs from a `.csv` file. More information can be found here. +PLM-interact reads the input sequence pairs from a `.csv` file. More information can be found here. We also provide an example in our github. | query | text | | -------- | ------- | From f5ef12d0f337ff0642d47cc8527e2de34056c69b Mon Sep 17 00:00:00 2001 From: ChristineSchulz Date: Thu, 16 Jul 2026 15:19:53 +0200 Subject: [PATCH 5/5] test: PLM to CI --- .github/workflows/main.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e8db408..205ce89 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -72,5 +72,6 @@ jobs: - name: Run PLM-Interact run: | - python -m pytest --nbval notebooks/PLM-Interact.ipynb + python -m pytest --nbval tests/PLM_prepare.py notebooks/PLM-interact.ipynb tests/PLM_output.py +