Feature Extraction
PEFT
Safetensors
PyTorch
English
biology
genomics
bioinformatics
protein-language-model
lora
Instructions to use Amin-Saeidi/PhageContraMLM with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use Amin-Saeidi/PhageContraMLM with PEFT:
Task type is invalid.
- Notebooks
- Google Colab
- Kaggle
| pipeline_tag: feature-extraction | |
| tags: | |
| - biology | |
| - genomics | |
| - bioinformatics | |
| - protein-language-model | |
| - pytorch | |
| - peft | |
| - lora | |
| license: apache-2.0 | |
| language: | |
| - en | |
| # PhageContraMLM: Contrastive Learning for Phage Protein Representations | |
| PhageContraMLM is a fine-tuned version of the `Rostlab/prot_t5_xl_uniref50` protein language model, trained with Low-Rank Adaptation (LoRA) using a hybrid objective that combines standard Masked Language Modeling (MLM) with a contrastive loss. | |
| The model is built to improve the embedding space for bacteriophage proteins, clustering them by functional group and PHROG family in a zero-shot setting. | |
| ## Intended Use | |
| PhageContraMLM is intended for researchers in computational biology and virology who need function-aware embeddings for phage protein sequences. | |
| **Primary use cases:** | |
| - **Zero-shot functional retrieval:** querying unknown phage proteins against a database of known PHROG families using cosine similarity or L2 distance. | |
| - **Embedding extraction:** generating dense representations of sequences for downstream tasks such as functional annotation or clustering. | |
| ## How to Use | |
| The model relies on the Hugging Face `transformers` and `peft` libraries. The LoRA adapters live inside this repo under `runs/protrans_XL_Full_lora_envhog_ContraMLM_v1_1/lora_adapters`, so make sure to pass `subfolder` when loading. | |
| ```python | |
| import torch | |
| from transformers import T5Tokenizer, T5ForConditionalGeneration | |
| from peft import PeftModel | |
| device = torch.device("cuda" if torch.cuda.is_available() else "cpu") | |
| base_model_name = "Rostlab/prot_t5_xl_uniref50" | |
| adapter_repo = "Amin-Saeidi/PhageContraMLM" | |
| adapter_subfolder = "runs/protrans_XL_Full_lora_envhog_ContraMLM_v1_1/lora_adapters" | |
| # 1. Load tokenizer and base model | |
| tokenizer = T5Tokenizer.from_pretrained(base_model_name, do_lower_case=False) | |
| model = T5ForConditionalGeneration.from_pretrained(base_model_name, torch_dtype=torch.float16) | |
| # 2. Attach LoRA adapters and merge | |
| model = PeftModel.from_pretrained(model, adapter_repo, subfolder=adapter_subfolder) | |
| model = model.merge_and_unload().to(device).eval() | |
| # 3. Prepare sequence (space-separated, rare amino acids replaced) | |
| seq = "M A K K L K I L L L A A S L V S L S P S V F A" | |
| inputs = tokenizer(seq, return_tensors="pt").to(device) | |
| # 4. Extract mean-pooled embeddings | |
| with torch.no_grad(): | |
| outputs = model.encoder(**inputs) | |
| hidden = outputs.last_hidden_state | |
| mask = inputs.attention_mask.unsqueeze(-1).to(hidden.dtype) | |
| pooled_embedding = (hidden * mask).sum(dim=1) / mask.sum(dim=1).clamp(min=1.0) | |
| print(pooled_embedding.shape) | |
| ``` | |
| ## From Source | |
| If you want to retrain or modify the model locally, clone the full repo (adapters, data, and scripts included). | |
| First, create a virtual environment in Python 3.11.5: | |
| ``` | |
| conda create -n phagecontramlm_env python=3.11.5 | |
| conda activate phagecontramlm_env | |
| ``` | |
| Clone the repo. You will need git-lfs: for WSL or Linux use `sudo apt-get install git-lfs`, for Windows either use [git bash](https://git-scm.com/downloads) or get git-lfs from [here](https://github.com/git-lfs/git-lfs/releases). Then: | |
| ``` | |
| git lfs install | |
| git clone https://huggingface.co/Amin-Saeidi/PhageContraMLM | |
| ``` | |
| Install dependencies: | |
| ``` | |
| cd PhageContraMLM | |
| pip install -r requirements.txt | |
| ``` | |
| Usage (training): | |
| ``` | |
| python src/train.py | |
| ``` | |
| Check `src/train.py` for the available config flags (data paths, LoRA rank/alpha, loss weighting) before launching a run. | |
| ## Training Data and Process | |
| - **Data:** `envhog_phrog2` dataset. | |
| - **Architecture:** ProtT5-XL (encoder-decoder). | |
| - **Fine-tuning method:** LoRA (rank=32, alpha=64, target modules: q, k, v, o). | |
| - **Loss function:** convex combination of curriculum-aware MLM loss (80%) and temperature-scaled contrastive loss (20%). | |
| - **Positive sampling:** the contrastive adjacency matrix is built on-the-fly from a known VISEQ pair graph, pulling positive pairs that share identical VISEQs or cross-VISEQ structural similarities. | |
| ## Repository Structure & Scripts | |
| This repository contains everything needed to reproduce training and evaluation, organized around `src/`, `data/`, and `runs/` directories. | |
| **`src/train.py`** | |
| Main training loop. Implements a custom `PairGraphCollator` that samples positive protein pairs on-the-fly and builds a dynamic adjacency matrix for the contrastive loss, combined with a curriculum-aware MLM objective. | |
| **`src/produce_test_data_embeddings.py`** | |
| High-throughput script for generating mean-pooled encoder embeddings. Loads the base ProtT5 model, attaches the best LoRA adapters from your checkpoints, and processes raw FASTA/CSV sequences in batches, saving results as `.pkl` and `.csv` files. | |
| **`src/eval_EmbeddingSpace.py`** | |
| Generates publication-quality plots analyzing the embedding space: | |
| - t-SNE grids colored by PhrogCat category | |
| - Pairwise L2 and cosine scatter plots comparing the base model against the fine-tuned PhageContraMLM model | |
| **`src/eval_PhrogRetrieval.py`** | |
| Zero-shot functional retrieval benchmarking using `hnswlib` (Hierarchical Navigable Small World graphs): | |
| - Precision@k (k = 5, 10, 50) | |
| - Per-family and per-size-bin (rare, medium, common) statistics | |
| - Functional group confusion matrices and Seaborn clustermaps | |
| ## Dependencies | |
| ``` | |
| torch==2.6.0 | |
| transformers==4.37.2 | |
| peft==0.10.0 | |
| pandas==3.0.1 | |
| numpy==2.3.5 | |
| matplotlib==3.10.8 | |
| seaborn==0.13.2 | |
| scikit-learn==1.8.0 | |
| hnswlib==0.8.0 | |
| safetensors==0.7.0 | |
| sentencepiece==0.2.0 | |
| ``` | |
| ## Acknowledgments | |
| This work was conducted by Amin SaeidiKelishami during an internship at the Laboratoire Microorganismes: Génome et Environnement (LMGE), under the supervision of Professor Clovis Galiez and Professor Francois ENAULT. | |