File size: 4,587 Bytes
7618068
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
---
license: apache-2.0
library_name: pytorch
base_model: Bitbol-Lab/ProteomeLM-L
tags:
- biology
- proteomics
- gene-essentiality
- protein-language-model
- proteomelm
---

# ProteomeLM-ess

Gene-essentiality classifier of [ProteomeLM](https://github.com/Bitbol-Lab/ProteomeLM)
([PNAS 2026](https://www.pnas.org/doi/10.1073/pnas.2524201123), Fig. 5). Given a whole
proteome, it gives each protein a probability of being essential.

## Model

- **Input**: a whole proteome (one genome), as a protein FASTA file.
- **Embeddings**: every protein is embedded with ESM-C 600M (mean over residues, first
  4096 residues). The frozen backbone [Bitbol-Lab/ProteomeLM-L](https://huggingface.co/Bitbol-Lab/ProteomeLM-L) then reads the
  whole proteome at once, in bfloat16, with each protein's own ESM-C embedding as input and
  group embedding.
- **Head**: a two-layer classifier (linear 1152 → 2048, ReLU, dropout 0.5, linear
  2048 → 2) on the backbone's `hidden_states[8]` (index 0 is the input projection).
  Class 0 is *essential*, class 1 *non-essential*; the output is `p_essential` = softmax class 0.
- **Files**: `config.json` (backbone, layer, dimensions, labels) and `model.safetensors`
  (2,365,442 parameters, stored in bfloat16; inference runs the head in float32).

## Training data

Essentiality labels (E / NE) from [OGEE](https://v3.ogee.info) for 82 genomes, mostly
bacteria plus several eukaryotes (e.g. mouse, zebrafish, *Drosophila*, *C. elegans*,
*Arabidopsis*, fission yeast). The head was trained on the training folds of the paper's
gene-level train / validation / test split, with Adam (learning rate 1e-3) and early stopping
on the validation-fold AUPR (ProteomeLM-L layer 8, seed 42).

Seven OGEE genomes were held out of training entirely: *S. cerevisiae* S288C (taxid 580240),
*E. coli* K-12 MG1655 (83333), and taxids 199310, 679895, 941322, 1380365 and 1124478.

## Performance

Whole-genome predictions on genomes held out of training (as in Fig. 5B of the paper): the N
highest-ranked proteins are called essential, with N the number of labelled essential genes.
AUROC is computed on the genes labelled essential or non-essential.

| genome | proteins | labelled essential (N) | AUROC | labelled essential genes in the top N |
|---|---|---|---|---|
| *E. coli* K-12 MG1655 (taxid 83333) | 4,361 | 286 | 0.952 | 201 (70.3%) |
| *S. cerevisiae* S288C (taxid 580240) | 5,975 | 937 | 0.810 | 432 (46.1%) |
| JCVI-Syn1.0 (taxid 766747) | 820 | 202 | 0.879 | 121 (59.9%) |
| JCVI-Syn3A (taxid 2144189) | 455 | 199 | 0.830 | 130 (65.3%) |

Labels: OGEE (*E. coli*, *S. cerevisiae*), Hutchison et al. 2016 (JCVI-Syn1.0) and SynWiki
(JCVI-Syn3A). The embeddings are computed in bfloat16, so scores vary slightly across GPUs
and library versions (top-N counts by a gene or two).

## Usage

```bash
pip install "proteomelm @ git+https://github.com/Bitbol-Lab/ProteomeLM"
python -m proteomelm.essentiality --fasta proteome.fasta --out scores.tsv --top-fraction 0.1
```

The TSV lists every protein, most essential first: `protein_id`, `p_essential`, `rank` and,
with `--top-n N`, `--top-fraction F` or `--threshold T`, `predicted_essential`. Ranks are
more reliable than the raw probabilities, which are not calibrated across organisms (the
fraction of essential genes ranges from a few percent in free-living bacteria to about half
in minimal cells), so a top-N or top-fraction rule is recommended.

or, from Python:

```python
from proteomelm.essentiality import EssentialityPredictor, read_fasta

ids, sequences = read_fasta("proteome.fasta")
predictor = EssentialityPredictor.from_pretrained("Bitbol-Lab/ProteomeLM-ess", device="cuda")
table = predictor.predict(ids, sequences, top_fraction=0.1)   # pandas DataFrame, sorted by rank
```

The input should be one complete proteome: ProteomeLM scores every protein in the context
of all the others. A GPU is recommended (a bacterial proteome takes about a minute, most of
it ESM-C); the first run downloads ESM-C 600M and Bitbol-Lab/ProteomeLM-L.

## Citation

```bibtex
@article{malbranke2026proteomelm,
  title={ProteomeLM: A proteome-scale language model enables accurate and rapid prediction of protein-protein interactions and gene essentiality across taxa},
  author={Malbranke, Cyril and Zalaffi, Gionata Paolo and Bitbol, Anne-Florence},
  journal={Proceedings of the National Academy of Sciences},
  volume={123},
  number={21},
  pages={e2524201123},
  year={2026},
  publisher={National Academy of Sciences},
  doi={10.1073/pnas.2524201123},
  url={https://www.pnas.org/doi/10.1073/pnas.2524201123}
}
```