Benchmark for genomic language models; reproduces the gLMBench results of the LOAM paper
Python
0
4 commits
updated Oct 1, 2026
A SOILYTIX BENCHMARK · GENOMIC LANGUAGE MODELS ON BACTERIAL GENOMES
A benchmark harness for genomic language models, and the code to reproduce the benchmark
results of the LOAM paper.
Status. The numbers in
paper/are frozen: they are the records the LOAM manuscript reports, and nothing a benchmark run writes changes them. The manuscript itself is not yet public; its citation will be added to CITATION.cff when the preprint is available.
In its current form, gLMBench scores DNA language models on three bacterial genomics tasks taken from published benchmarks (full references below):
The paper evaluated 13 models: the four released LOAM models
(Soilytix/LOAM-25M, -100M, -340M, -624M) and nine
published models (Evo 2, Evo 1.5, gLM2, GenomeOcean, ProkBERT, Nucleotide Transformer v3). All 13
are included here, with their exact settings.
What you can do with this repository
| I want to… | Start here |
|---|---|
| check the paper's numbers on my own GPU | Quickstart, then docs/REPRODUCING_THE_PAPER.md |
| look up the paper's results, per layer and per assay | paper/ |
| benchmark my own model on these tasks | docs/ADD_A_MODEL.md |
| add a task | docs/ADD_A_TASK.md |
| use LOAM in my own code | docs/USING_LOAM.md |
1. Install (Linux, Python 3.11, conda; details and the separate Evo 2 environment in docs/INSTALL.md):
git clone https://github.com/Soilytix/gLMBench && cd gLMBench
conda env create -f envs/glmbench.yml && conda activate glmbench
pip install -e ".[hf,data,dev,notebook]" -c envs/constraints-paper.txt \
--extra-index-url https://download.pytorch.org/whl/cu126
envs/constraints-paper.txt pins the exact package versions the paper's numbers were produced
with.
2. Check the install (CPU only; no weights and no downloads needed):
pytest tests/unit -q
glmbench run --model specs/echo-full.yaml --benchmark dummy_bench --results results/
3. Reproduce one model's results and compare them with the paper. The LOAM repositories on
the Hugging Face Hub are gated: accept the terms on the model page, then run hf auth login.
scripts/reproduce_paper.sh --model LOAM-25M
This downloads the task data (about 230 MB, once) and the model, runs the five task rows, and
prints a metric-by-metric comparison with the paper. LOAM-25M, the smallest model, is the
quickest to run. The result is written to results/loam_paper/glmb_<model hash>.json.
scripts/reproduce_paper.sh --list shows the 13 model ids; --all runs them all.
The notebook notebooks/loam_hf_benchmark.ipynb does the
same for any LOAM size in a few cells, and plots the per-layer curves.
| Model | Parameters | Essentiality AUROC, last / best layer | EC macro-F1, last / best layer | RNAGym Spearman | RNAGym scoring |
|---|---|---|---|---|---|
| LOAM-25M | 25.5M | 0.7266 / 0.7266 | 0.1815 / 0.1932 | 0.1329 | log-likelihood |
| LOAM-100M | 102.9M | 0.7574 / 0.7574 | 0.3008 / 0.3008 | 0.2027 | log-likelihood |
| LOAM-340M | 340.0M | 0.7623 / 0.7722 | 0.2776 / 0.3234 | 0.2710 | log-likelihood |
| LOAM-624M | 624.2M | 0.7703 / 0.7708 | 0.2974 / 0.3939 | 0.3176 | log-likelihood |
| ProkBERT-mini | 20.6M | 0.7186 / 0.7250 | 0.0865 / 0.0865 | 0.1145 | masked-marginal LLR |
| ProkBERT-mini-c | 25.0M | 0.5565 / 0.5758 | 0.0056 / 0.0056 | 0.1296 | masked-marginal LLR |
| NTv3-100M | 106.5M | 0.6789 / 0.7053 | 0.0465 / 0.1143 | 0.1067 | masked-marginal LLR |
| GenomeOcean-100M | 119.6M | 0.7430 / 0.7611 | 0.0799 / 0.1610 | 0.1718 | log-likelihood |
| gLM2-150M | 152.5M | 0.6799 / 0.6816 | 0.0643 / 0.0643 | 0.0652 | masked-marginal LLR |
| GenomeOcean-500M | 541.1M | 0.7441 / 0.7583 | 0.0904 / 0.3448 | 0.2479 | log-likelihood |
| gLM2-650M | 670.6M | 0.6953 / 0.6953 | 0.0595 / 0.0747 | 0.0956 | masked-marginal LLR |
| Evo 1.5 (8k, 7B) | 6.45B | 0.7028 / 0.7779 | 0.0234 / 0.3318 | 0.3182 | log-likelihood |
| Evo2-7B (residual stream) | 6.48B | 0.6992 / 0.7880 | 0.0513 / 0.3721 | 0.3421 | log-likelihood |
How to read the table:
Every number behind this table (each layer of both sweeps, each of the 11 RNAGym assays) is in
paper/reference_scores.csv, next to the records it comes from.
docs/CAVEATS.md explains these points in more detail.
The three figures below are drawn from the frozen records in paper/ by
scripts/readme_figures.py. They are not copies of the
manuscript's figures. LOAM models are green; the published comparators are gold.
Last-layer and best-layer probe scores for all 13 models, on essentiality (AUROC) and enzyme
class (macro-F1), against the k-mer floor. The best layer is chosen on the test split, so the
ring is an upper bound. Source: paper/reference_scores.csv (single-layer and layer-sweep
rows) and paper/kmer_floor.json.
Gene-essentiality AUROC at every layer of the four LOAM models, plotted against relative depth
(layer index divided by the last layer's index), with the k-mer floor. Source: the
bacbench-essentiality-layer-sweep rows of paper/reference_scores.csv and
paper/kmer_floor.json.
Zero-shot RNAGym Spearman (mean over the 11 assays) against measured parameter count, log
scale. Causal models are scored by log-likelihood, masked models by masked-marginal LLR (see
the table above), so the two groups are not scored identically. Source: the rnagym-dms rows
of paper/reference_scores.csv and the parameter counts in paper/models.csv.
envs/constraints-paper.txt). The runs that show it are in
paper/public_route/.scripts/compare_to_paper.py
then applies per-task tolerances; --exact requires bitwise agreement.Details, compute budgets and the full tolerance table: docs/REPRODUCING_THE_PAPER.md.
specs/**/*.yaml) names a model: its weights, their pinned revision, and how to
serve them.src/glmbench/adapters/) turns a spec into a small, fixed interface: embed
sequences, score sequences, return log-probabilities. The model itself runs in a subprocess,
in whatever environment it needs, so the benchmark core never imports PyTorch.src/glmbench/tasks/) uses only that interface, and scores the output the way
the original benchmark does: with its own metric code where that can run without PyTorch
(RNAGym, DGEB), and with a documented re-implementation where it cannot (BacBench; see
NOTICE).The per-model details (which tensor counts as "layer i" for each architecture, context limits, tokenizers) are in docs/HOW_MODELS_ARE_SERVED.md.
token_budget in the spec. Embedding the essentiality corpus
(164,630 windows) dominates the run time, which grows with model size.hf auth login). Evo 2 needs its own environment (docs/INSTALL.md).gLMBench/
├── src/glmbench/ the package: adapters and runners (one per model family), tasks, leaderboard
├── specs/ one YAML per model: loam/ (4 LOAM models), external/ (9 published models), echo test doubles
├── scripts/ fetch the task data, reproduce the paper, compare with it, compute the k-mer floor
├── paper/ the paper's results: records, a flat table of every metric, the k-mer floor
├── assets/ the README figures, drawn from paper/ by scripts/readme_figures.py
├── notebooks/ a LOAM model from the Hub, through the five task rows, compared with the paper
├── docs/ the guides listed below
├── envs/ conda environments and the exact version pins used for the paper
└── tests/ CPU unit tests (tiny fixtures, no downloads)
| Guide | What it covers |
|---|---|
| INSTALL.md | environments, flash-attn, Hub access, task data, hardware |
| REPRODUCING_THE_PAPER.md | every model, compute and memory, expected agreement, tolerances |
| CAVEATS.md | how to read the numbers: k-mer floor, best-layer selection, readouts, scoring methods, context limits |
| TASKS_OVERVIEW.md | the three tasks, with one page each: essentiality, EC, RNAGym |
| HOW_MODELS_ARE_SERVED.md | each model's environment, pinned revisions, readout and pitfalls |
| USING_LOAM.md | using the LOAM models outside the benchmark |
| ADD_A_MODEL.md · ADD_A_TASK.md | extending the benchmark; echo and loam-hf are the templates |
| paper/README.md | what the reference records are and how they were prepared |
The code is released under the Apache License 2.0 (LICENSE). Vendored upstream code keeps its own licence (NOTICE).
The tasks are the work of their authors; gLMBench only serves them. If you use a task, please cite its source, listed under References below. The task data is downloaded from its upstream sources at pinned revisions and is not redistributed here. Model weights are not part of this repository and are subject to their own licences.
The three benchmarks gLMBench serves:
Benchmark for genomic language models; reproduces the gLMBench results of the LOAM paper
Python
0
4 commits
updated Oct 1, 2026
A SOILYTIX BENCHMARK · GENOMIC LANGUAGE MODELS ON BACTERIAL GENOMES
A benchmark harness for genomic language models, and the code to reproduce the benchmark
results of the LOAM paper.
Status. The numbers in
paper/are frozen: they are the records the LOAM manuscript reports, and nothing a benchmark run writes changes them. The manuscript itself is not yet public; its citation will be added to CITATION.cff when the preprint is available.
In its current form, gLMBench scores DNA language models on three bacterial genomics tasks taken from published benchmarks (full references below):
The paper evaluated 13 models: the four released LOAM models
(Soilytix/LOAM-25M, -100M, -340M, -624M) and nine
published models (Evo 2, Evo 1.5, gLM2, GenomeOcean, ProkBERT, Nucleotide Transformer v3). All 13
are included here, with their exact settings.
What you can do with this repository
| I want to… | Start here |
|---|---|
| check the paper's numbers on my own GPU | Quickstart, then docs/REPRODUCING_THE_PAPER.md |
| look up the paper's results, per layer and per assay | paper/ |
| benchmark my own model on these tasks | docs/ADD_A_MODEL.md |
| add a task | docs/ADD_A_TASK.md |
| use LOAM in my own code | docs/USING_LOAM.md |
1. Install (Linux, Python 3.11, conda; details and the separate Evo 2 environment in docs/INSTALL.md):
git clone https://github.com/Soilytix/gLMBench && cd gLMBench
conda env create -f envs/glmbench.yml && conda activate glmbench
pip install -e ".[hf,data,dev,notebook]" -c envs/constraints-paper.txt \
--extra-index-url https://download.pytorch.org/whl/cu126
envs/constraints-paper.txt pins the exact package versions the paper's numbers were produced
with.
2. Check the install (CPU only; no weights and no downloads needed):
pytest tests/unit -q
glmbench run --model specs/echo-full.yaml --benchmark dummy_bench --results results/
3. Reproduce one model's results and compare them with the paper. The LOAM repositories on
the Hugging Face Hub are gated: accept the terms on the model page, then run hf auth login.
scripts/reproduce_paper.sh --model LOAM-25M
This downloads the task data (about 230 MB, once) and the model, runs the five task rows, and
prints a metric-by-metric comparison with the paper. LOAM-25M, the smallest model, is the
quickest to run. The result is written to results/loam_paper/glmb_<model hash>.json.
scripts/reproduce_paper.sh --list shows the 13 model ids; --all runs them all.
The notebook notebooks/loam_hf_benchmark.ipynb does the
same for any LOAM size in a few cells, and plots the per-layer curves.
| Model | Parameters | Essentiality AUROC, last / best layer | EC macro-F1, last / best layer | RNAGym Spearman | RNAGym scoring |
|---|---|---|---|---|---|
| LOAM-25M | 25.5M | 0.7266 / 0.7266 | 0.1815 / 0.1932 | 0.1329 | log-likelihood |
| LOAM-100M | 102.9M | 0.7574 / 0.7574 | 0.3008 / 0.3008 | 0.2027 | log-likelihood |
| LOAM-340M | 340.0M | 0.7623 / 0.7722 | 0.2776 / 0.3234 | 0.2710 | log-likelihood |
| LOAM-624M | 624.2M | 0.7703 / 0.7708 | 0.2974 / 0.3939 | 0.3176 | log-likelihood |
| ProkBERT-mini | 20.6M | 0.7186 / 0.7250 | 0.0865 / 0.0865 | 0.1145 | masked-marginal LLR |
| ProkBERT-mini-c | 25.0M | 0.5565 / 0.5758 | 0.0056 / 0.0056 | 0.1296 | masked-marginal LLR |
| NTv3-100M | 106.5M | 0.6789 / 0.7053 | 0.0465 / 0.1143 | 0.1067 | masked-marginal LLR |
| GenomeOcean-100M | 119.6M | 0.7430 / 0.7611 | 0.0799 / 0.1610 | 0.1718 | log-likelihood |
| gLM2-150M | 152.5M | 0.6799 / 0.6816 | 0.0643 / 0.0643 | 0.0652 | masked-marginal LLR |
| GenomeOcean-500M | 541.1M | 0.7441 / 0.7583 | 0.0904 / 0.3448 | 0.2479 | log-likelihood |
| gLM2-650M | 670.6M | 0.6953 / 0.6953 | 0.0595 / 0.0747 | 0.0956 | masked-marginal LLR |
| Evo 1.5 (8k, 7B) | 6.45B | 0.7028 / 0.7779 | 0.0234 / 0.3318 | 0.3182 | log-likelihood |
| Evo2-7B (residual stream) | 6.48B | 0.6992 / 0.7880 | 0.0513 / 0.3721 | 0.3421 | log-likelihood |
How to read the table:
Every number behind this table (each layer of both sweeps, each of the 11 RNAGym assays) is in
paper/reference_scores.csv, next to the records it comes from.
docs/CAVEATS.md explains these points in more detail.
The three figures below are drawn from the frozen records in paper/ by
scripts/readme_figures.py. They are not copies of the
manuscript's figures. LOAM models are green; the published comparators are gold.
Last-layer and best-layer probe scores for all 13 models, on essentiality (AUROC) and enzyme
class (macro-F1), against the k-mer floor. The best layer is chosen on the test split, so the
ring is an upper bound. Source: paper/reference_scores.csv (single-layer and layer-sweep
rows) and paper/kmer_floor.json.
Gene-essentiality AUROC at every layer of the four LOAM models, plotted against relative depth
(layer index divided by the last layer's index), with the k-mer floor. Source: the
bacbench-essentiality-layer-sweep rows of paper/reference_scores.csv and
paper/kmer_floor.json.
Zero-shot RNAGym Spearman (mean over the 11 assays) against measured parameter count, log
scale. Causal models are scored by log-likelihood, masked models by masked-marginal LLR (see
the table above), so the two groups are not scored identically. Source: the rnagym-dms rows
of paper/reference_scores.csv and the parameter counts in paper/models.csv.
envs/constraints-paper.txt). The runs that show it are in
paper/public_route/.scripts/compare_to_paper.py
then applies per-task tolerances; --exact requires bitwise agreement.Details, compute budgets and the full tolerance table: docs/REPRODUCING_THE_PAPER.md.
specs/**/*.yaml) names a model: its weights, their pinned revision, and how to
serve them.src/glmbench/adapters/) turns a spec into a small, fixed interface: embed
sequences, score sequences, return log-probabilities. The model itself runs in a subprocess,
in whatever environment it needs, so the benchmark core never imports PyTorch.src/glmbench/tasks/) uses only that interface, and scores the output the way
the original benchmark does: with its own metric code where that can run without PyTorch
(RNAGym, DGEB), and with a documented re-implementation where it cannot (BacBench; see
NOTICE).The per-model details (which tensor counts as "layer i" for each architecture, context limits, tokenizers) are in docs/HOW_MODELS_ARE_SERVED.md.
token_budget in the spec. Embedding the essentiality corpus
(164,630 windows) dominates the run time, which grows with model size.hf auth login). Evo 2 needs its own environment (docs/INSTALL.md).gLMBench/
├── src/glmbench/ the package: adapters and runners (one per model family), tasks, leaderboard
├── specs/ one YAML per model: loam/ (4 LOAM models), external/ (9 published models), echo test doubles
├── scripts/ fetch the task data, reproduce the paper, compare with it, compute the k-mer floor
├── paper/ the paper's results: records, a flat table of every metric, the k-mer floor
├── assets/ the README figures, drawn from paper/ by scripts/readme_figures.py
├── notebooks/ a LOAM model from the Hub, through the five task rows, compared with the paper
├── docs/ the guides listed below
├── envs/ conda environments and the exact version pins used for the paper
└── tests/ CPU unit tests (tiny fixtures, no downloads)
| Guide | What it covers |
|---|---|
| INSTALL.md | environments, flash-attn, Hub access, task data, hardware |
| REPRODUCING_THE_PAPER.md | every model, compute and memory, expected agreement, tolerances |
| CAVEATS.md | how to read the numbers: k-mer floor, best-layer selection, readouts, scoring methods, context limits |
| TASKS_OVERVIEW.md | the three tasks, with one page each: essentiality, EC, RNAGym |
| HOW_MODELS_ARE_SERVED.md | each model's environment, pinned revisions, readout and pitfalls |
| USING_LOAM.md | using the LOAM models outside the benchmark |
| ADD_A_MODEL.md · ADD_A_TASK.md | extending the benchmark; echo and loam-hf are the templates |
| paper/README.md | what the reference records are and how they were prepared |
The code is released under the Apache License 2.0 (LICENSE). Vendored upstream code keeps its own licence (NOTICE).
The tasks are the work of their authors; gLMBench only serves them. If you use a task, please cite its source, listed under References below. The task data is downloaded from its upstream sources at pinned revisions and is not redistributed here. Model weights are not part of this repository and are subject to their own licences.
The three benchmarks gLMBench serves: