From b6a333b686f85fb0711f922117ba042bc4dd990d Mon Sep 17 00:00:00 2001 From: Joshua Kravitz Date: Mon, 1 Jul 2024 13:36:45 -0400 Subject: [PATCH] Initial commit --- .editorconfig | 12 + .github/workflows/ci.yml | 34 + .github/workflows/release.yml | 51 ++ .gitignore | 5 + LICENSE | 201 ++++++ README.md | 120 ++++ benchmarks.png | Bin 0 -> 354896 bytes docs/images/tatta_logo.png | Bin 0 -> 7786 bytes geb/__init__.py | 28 + geb/eval_utils.py | 394 ++++++++++++ geb/evaluators.py | 839 +++++++++++++++++++++++++ geb/geb.py | 129 ++++ geb/modality.py | 10 + geb/models.py | 482 ++++++++++++++ geb/results.py | 50 ++ geb/tasks/__init__.py | 13 + geb/tasks/bigene_mining_tasks.py | 77 +++ geb/tasks/classification_tasks.py | 208 ++++++ geb/tasks/clustering_tasks.py | 70 +++ geb/tasks/eds_tasks.py | 198 ++++++ geb/tasks/pair_classification_tasks.py | 96 +++ geb/tasks/retrieval_tasks.py | 98 +++ geb/tasks/tasks.py | 136 ++++ plot_benchmarks.py | 152 +++++ pyproject.toml | 113 ++++ requirements.txt | 13 + ruff.toml | 8 + run_geb.py | 135 ++++ 28 files changed, 3672 insertions(+) create mode 100644 .editorconfig create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 benchmarks.png create mode 100644 docs/images/tatta_logo.png create mode 100644 geb/__init__.py create mode 100644 geb/eval_utils.py create mode 100644 geb/evaluators.py create mode 100644 geb/geb.py create mode 100644 geb/modality.py create mode 100644 geb/models.py create mode 100644 geb/results.py create mode 100644 geb/tasks/__init__.py create mode 100644 geb/tasks/bigene_mining_tasks.py create mode 100644 geb/tasks/classification_tasks.py create mode 100644 geb/tasks/clustering_tasks.py create mode 100644 geb/tasks/eds_tasks.py create mode 100644 geb/tasks/pair_classification_tasks.py create mode 100644 geb/tasks/retrieval_tasks.py create mode 100644 geb/tasks/tasks.py create mode 100644 plot_benchmarks.py create mode 100644 pyproject.toml create mode 100644 requirements.txt create mode 100644 ruff.toml create mode 100644 run_geb.py diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..efb1e94 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true + +[*.py] +charset = utf-8 +indent_style = space +indent_size = 4 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..bb313d0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,34 @@ +name: CI for GEB + +on: + push: + branches: ["**"] + pull_request: + branches: ["**"] + +permissions: + id-token: write + contents: read + actions: write + pull-requests: read + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + ruff: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: "3.11" + - uses: yezz123/setup-uv@v4 + with: + uv-venv: ".geb_venv" + - run: uv pip install ruff + - run: ruff format . + - run: ruff check . + # TODO: pytest + # TODO: pyright diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..5ddbbd1 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,51 @@ +# This workflow will +# - Find the latest version tag based on the commit history +# - Create a git tag for the new version +# - Update the version number in pyproject.toml based on the commit history +# - Upload the package to PyPI +# - Create a release on GitHub + +# This workflow required the following secrets to be set: +# - a GitHub personal access token with the `repo` scope called `RELEASE` +# - and that you setup trusted publishing using PyPI as described here: https://blog.pypi.org/posts/2023-04-20-introducing-trusted-publishers/ + +name: Release +on: + push: + branches: + - main + +jobs: + release: + runs-on: ubuntu-latest + concurrency: release + permissions: + id-token: write # IMPORTANT: this permission is mandatory for trusted publishing using PyPI + contents: write + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Python Semantic Release + id: release + uses: python-semantic-release/python-semantic-release@v9.8.3 + with: + github_token: ${{ secrets.GEB_RELEASE }} + + - name: Publish package distributions to PyPI + uses: pypa/gh-action-pypi-publish@v1.9.0 + if: steps.release.outputs.released == 'true' + with: + repository-url: https://test.pypi.org/legacy/ + # This action supports PyPI's trusted publishing implementation, which allows authentication to PyPI without a manually + # configured API token or username/password combination. To perform trusted publishing with this action, your project's + # publisher must already be configured on PyPI. + + - name: Publish package distributions to GitHub Releases + uses: python-semantic-release/upload-to-gh-release@v9.8.3 + if: steps.release.outputs.released == 'true' + with: + github_token: ${{ secrets.GEB_RELEASE }} + tag: ${{ steps.release.outputs.tag }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ebcd68 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.venv/ +__pycache__/ +.vscode/ +build/ +dist/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f49a4e1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a77f005 --- /dev/null +++ b/README.md @@ -0,0 +1,120 @@ +

Genomic Embedding Benchmark

+ +

+ + GitHub release + + + arXiv URL + + + License + + + Downloads + +

+ +

+

+ Installation | + Usage | + Leaderboard | + Documentation | + Citing +

+

+ +

+ +

+ +## Installation + +TODO(joshua): +```bash +pip install geb +``` + +## Usage + +- Using the python script (see [run_geb.py](https://github.com/tattabio/geb/blob/main/run_geb.py)): + +```bash +python run_geb.py --model facebook/esm2_t6_8M_UR50D +``` + + +- Using the python API: + +```py +import geb + +model = geb.get_model("facebook/esm2_t6_8M_UR50D") +tasks = geb.get_tasks_by_modality(geb.Modality.PROTEIN) +evaluation = geb.GEB(tasks=tasks) +evaluation.run(model, output_folder="results") +``` + + +### Using a custom model + +Custom models should be wrapped with the `geb.models.BioSeqTransformer` abstract class, and specify the modality, number of layers, and embedding dimension. See see [models.py](https://github.com/tattabio/geb/blob/main/geb/models.py) for additional examples on custom model loading and inference. + + +```python +import geb +from geb.models import BioSeqTransformer +from geb.modality import Modality + +class MyModel(BioSeqTransformer): + + @property + def modality(self) -> Modality: + return Modality.PROTEIN + + @property + def num_layers(self) -> int: + return self.config.num_hidden_layers + + @property + def embed_dim(self) -> int: + return self.config.hidden_size + + +model = MyModel() +tasks = geb.get_tasks_by_modality(model.modality) +evaluation = MTEB(tasks=tasks) +evaluation.run(model) +``` + +### Evaluating on a custom dataset + +TODO(andre): Update this section + +To evaluate on a custom task, you can run the following code on your custom task. + +```python +import geb +from geb.tasks import AbsTask + +class MyCustomTask(AbsTask): + def run( + self, model: BioSeqTransformer, layers: Optional[List[int]] = None + ) -> TaskResult: + pass + +model = geb.models.ESM("facebook/esm2_t6_8M_UR50D") +evaluation = geb.GEB(tasks=[MyCustomTask()]) +evaluation.run(model) +``` + + + +## Citing + +GEB was introduced in "[GEB: Genomic Embedding Benchmark]()", feel free to cite: + +TODO(andre): bibtex + +For works that have used GEB for benchmarking, you can find them on the [leaderboard](https://huggingface.co/spaces/tattabio/GEB/leaderboard). diff --git a/benchmarks.png b/benchmarks.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c6c766318643e95f531c4e2ce02da7b43f07f2 GIT binary patch literal 354896 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
B-Qb7MSAh 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

@}6-a02KLRJg0}C_n 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ℑ1L+!|#nzj`&{z`#Tp5|xN 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≪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 literal 0 HcmV?d00001 diff --git a/docs/images/tatta_logo.png b/docs/images/tatta_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..76220bd5a3d978c7cdff2d4b783916e72357a40c GIT binary patch literal 7786 zcmeHMYfzI{8a^M1CRjA z&SlP=_j#W8$@!0CW4xBFT?PQ~+Pi1>rvPAHE`IP!VatK4pPmCi+O~K1&d+kCBTsrV z6D*RmCPr=l{xz2hv1Mz#OXyNO-ga|c*l97@IKrnSFZ~R=G;r%>y6-pQH3;h-DR0mD z4V&Mdw?-#1{?M(j-q&RrURNztHn+C=!v&IWMBO04Z-CE+VUIUl8hEeoMF3b&ufzaA z7twJ5h=7;?I}ne>As*Op7_qMh;N1hMlt4rC6Rk811|Ms%pGMVs#Ja2_}q^ZH7cSm$ihBEH03t8Au$h{ z-x7SIsSG&RlW}Sr*|j<(apsjwt%{n|trq0KSuSTzga56ZInvA)T;Y3EPR*i*xHxjZ}eZ zS~_THt^=LIq}IZ!$<)CQyYo3h%=G7KCc1LsJEzT+SZlcVNRdDj;fAvuKvdbS#fThO zejkxMe$0U{F;u~=Ht?~;?uD`}IPm+J@+Xr;+Cb4A_)h;2a+7z94~XiHAp{)p@Gp_l zOZ!I}G@X4L!$~Jj>Vs-x>|00bHcnAQrKfHS-^crH5gWL7`9NSi?f|3<^;!%dpuY|w zXt+mfSKq$0ge!tAwHrlo+`2P?n|e>lYDpk~bKuqYO@9TEJ*_KBzICfJwz-A zt5zbvs@E4Z@-am{p;!(NX6M+D7rNHNzo|H=2FI}{>;k;0Tn9+@dQ;Lg758Z|)ZFSC z9PqmYA4Q?qaE>qh$+5>Wh=96&u_qm$Z48#pejQR!=e#qX?I4ISPY3=SxUpBP2#=?U z3UeTUqR8wK2QUt=e2FsiuA#OUzaZ0sRM~g!V{gM2+AkvwzBMtNFD7-WDs2QH^j3}G zVyQ6EEu%w-eceKOy?&OKZapfzk(=php9|xee#B46C^a}VD1qPYFaMz}Iylv=?>Gnu z6}IqF8CF`Ae3pj_JYqP^z%gJtwY1Y)@k;lUgy6ech70oct_n)!LZkdVOTMBsEZl z9Gb~w1y?BS9Q?#}XX=HFPRe?2Q=&$ZKFu0kuDsbbCydjnff1vA^6Vs;Oo7C}DCXI5 zo)cTyIk4!A>?<9&`d_?SQ)HjP@&{Orv~r2-a4RfIshioU<_^chnU0}%1}f-LU`~^l zSkkC~U2+SbrLK)r5B`&Mzj{V;2XoW)v^40MMF)#mO}#`?Hgf6X zU|8xBR7ryEtp_RtuDhnjqcxrJg9s2QW{6Qex{bX7qSq9rEa$NcT^VD3kEsYmekRmH%0zH<^lFo zd11+Qb#dxAMyc^CHhc#i-cUu}6myBIId|DWkxM2ih6E?9C3$RpHt-_ZIrExS@rIyY z6QUQ+o3zuP?j)U+v&<6tdE_5bh2QG9M}=@6&RpA2TbZP~rV$O`(8$%YGE9z|Nl>-T zy~i)67X{wxKT+3NyoAsSWu+ttij*$omphYj~TpKshz&WpN%6d6a)agFpaUYK{>A)+xKQr(XW2o!ZLaq18VH*E$n|27H%ir*2S9kpA^}B~@z(}I<#BnQLa{eap z^!*&(LAV_t_)5(*2D^O@w;SZPz@WPL&G++b)ImDJC0s#wnMpAh(?5uYX?v<3vJe{T zx#Orc^QWdwDKJYLp=vf_u0q}%sCx5gSF$tMYz7h@#eFn8nJ|Fecl+bbx|~E3?t0@hx_Sz<7+x^W<2g^G*{~Dk+4eM-lNb ziT}7r!d1M*DkioP!_Chs2qg>Sp~QDIIz#cCRZ_)!<^iv9AD%H4;%ycLWy8Hs^77z& zP|Kss)Jz|awG+-ce_YsJ(9Flhv=?KI*TZ--|B@ torch.Tensor: + """Pool embeddings across the sequence length dimension.""" + assert ( + last_hidden_states.ndim == 3 + ), f"Expected hidden_states to have shape [batch, seq_len, D], got shape: {last_hidden_states.shape}" + assert ( + attention_mask.ndim == 2 + ), f"Expected attention_mask to have shape [batch, seq_len], got shape: {attention_mask.shape}" + last_hidden = last_hidden_states.masked_fill(~attention_mask[..., None].bool(), 0.0) + if pool_type == "mean": + emb = last_hidden.sum(dim=1) / attention_mask.sum(dim=1)[..., None] + elif pool_type == "max": + emb = last_hidden.max(dim=1)[0] + elif pool_type == "cls": + emb = last_hidden[:, 0] + elif pool_type == "last": + emb = last_hidden[torch.arange(last_hidden.size(0)), attention_mask.sum(1) - 1] + else: + raise ValueError(f"pool_type {pool_type} not supported") + return emb + + +def set_all_seeds(seed): + random.seed(seed) + np.random.seed(seed) + torch.manual_seed(seed) + torch.cuda.manual_seed(seed) + torch.backends.cudnn.deterministic = True + + +def write_results_to_json(results: Dict[str, Any], results_path: str): + """Write results dict to a json file.""" + with open(results_path, "w") as f: + json.dump(results, f, indent=4) + + +def merge_split_elem_embeds(ids, embeds, preserve_order: bool = False): + """Merge embeddings with the same id by mean-pooling and optionally preserve order in which they appear. + + Args: + ids: Array of string ids, [batch]. + embeds: Array of embeddings, [batch, ...]. + + Returns: + ids: Unique ids, [unique_batch]. + embeds: Array of embeddings, [unique_batch, ...]. + """ + unique_ids, indices = np.unique(ids, return_inverse=True) + shape_no_batch = embeds.shape[1:] + sums = np.zeros([unique_ids.size, *shape_no_batch], dtype=embeds.dtype) + counts = np.bincount(indices, minlength=unique_ids.size) + np.add.at(sums, indices, embeds) + # Add trailing dimensions to counts. + counts = counts[(...,) + (None,) * len(shape_no_batch)] + mean_pooled = sums / counts + # Preserve the order of the input ids. + if preserve_order: + order = [] + for id in unique_ids: + idx = np.where(ids == id)[0][0] + order.append(idx) + re_order = np.argsort(order) + unique_ids = unique_ids[re_order] + mean_pooled = mean_pooled[re_order] + return unique_ids, mean_pooled + + +def paired_dataset(labels, embeds): + """Creates a paired dataset for consecutive operonic gene pairs.""" + embeds1 = embeds[:-1] + embeds2 = embeds[1:] + labels = labels[:-1] + return embeds1, embeds2, labels + + +def cos_sim(a, b): + """Computes the cosine similarity cos_sim(a[i], b[j]) for all i and j. + + Return: + Matrix with res[i][j] = cos_sim(a[i], b[j]) + """ # noqa: D402 + if not isinstance(a, torch.Tensor): + a = torch.tensor(a) + + if not isinstance(b, torch.Tensor): + b = torch.tensor(b) + + if len(a.shape) == 1: + a = a.unsqueeze(0) + + if len(b.shape) == 1: + b = b.unsqueeze(0) + + a_norm = torch.nn.functional.normalize(a, p=2, dim=1) + b_norm = torch.nn.functional.normalize(b, p=2, dim=1) + return torch.mm(a_norm, b_norm.transpose(0, 1)) + + +def dot_score(a: torch.Tensor, b: torch.Tensor): + """Computes the dot-product dot_prod(a[i], b[j]) for all i and j. + :return: Matrix with res[i][j] = dot_prod(a[i], b[j]) + """ + if not isinstance(a, torch.Tensor): + a = torch.tensor(a) + + if not isinstance(b, torch.Tensor): + b = torch.tensor(b) + + if len(a.shape) == 1: + a = a.unsqueeze(0) + + if len(b.shape) == 1: + b = b.unsqueeze(0) + + return torch.mm(a, b.transpose(0, 1)) + + +# From https://github.com/beir-cellar/beir/blob/f062f038c4bfd19a8ca942a9910b1e0d218759d4/beir/retrieval/custom_metrics.py#L4 +def mrr( + qrels: dict[str, dict[str, int]], + results: dict[str, dict[str, float]], + k_values: List[int], + output_type: str = "mean", +) -> Tuple[Dict[str, float]]: + MRR = {} + + for k in k_values: + MRR[f"MRR@{k}"] = [] + + k_max, top_hits = max(k_values), {} + + for query_id, doc_scores in results.items(): + top_hits[query_id] = sorted( + doc_scores.items(), key=lambda item: item[1], reverse=True + )[0:k_max] + + for query_id in top_hits: + query_relevant_docs = set( + [doc_id for doc_id in qrels[query_id] if qrels[query_id][doc_id] > 0] + ) + for k in k_values: + rr = 0 + for rank, hit in enumerate(top_hits[query_id][0:k]): + if hit[0] in query_relevant_docs: + rr = 1.0 / (rank + 1) + break + MRR[f"MRR@{k}"].append(rr) + + if output_type == "mean": + for k in k_values: + MRR[f"MRR@{k}"] = round(sum(MRR[f"MRR@{k}"]) / len(qrels), 5) + + elif output_type == "all": + pass + + return MRR + + +# From https://github.com/embeddings-benchmark/mteb/blob/8178981fd8fcd546d7031afe61a083d13c41520f/mteb/evaluation/evaluators/utils.py +def recall_cap( + qrels: dict[str, dict[str, int]], + results: dict[str, dict[str, float]], + k_values: List[int], + output_type: str = "mean", +) -> Tuple[Dict[str, float]]: + capped_recall = {} + + for k in k_values: + capped_recall[f"R_cap@{k}"] = [] + + k_max = max(k_values) + + for query_id, doc_scores in results.items(): + top_hits = sorted(doc_scores.items(), key=lambda item: item[1], reverse=True)[ + 0:k_max + ] + query_relevant_docs = [ + doc_id for doc_id in qrels[query_id] if qrels[query_id][doc_id] > 0 + ] + for k in k_values: + retrieved_docs = [ + row[0] for row in top_hits[0:k] if qrels[query_id].get(row[0], 0) > 0 + ] + denominator = min(len(query_relevant_docs), k) + capped_recall[f"R_cap@{k}"].append(len(retrieved_docs) / denominator) + + if output_type == "mean": + for k in k_values: + capped_recall[f"R_cap@{k}"] = round( + sum(capped_recall[f"R_cap@{k}"]) / len(qrels), 5 + ) + + elif output_type == "all": + pass + + return capped_recall + + +# From https://github.com/embeddings-benchmark/mteb/blob/8178981fd8fcd546d7031afe61a083d13c41520f/mteb/evaluation/evaluators/utils.py +def hole( + qrels: dict[str, dict[str, int]], + results: dict[str, dict[str, float]], + k_values: List[int], + output_type: str = "mean", +) -> Tuple[Dict[str, float]]: + Hole = {} + + for k in k_values: + Hole[f"Hole@{k}"] = [] + + annotated_corpus = set() + for _, docs in qrels.items(): + for doc_id, score in docs.items(): + annotated_corpus.add(doc_id) + + k_max = max(k_values) + + for _, scores in results.items(): + top_hits = sorted(scores.items(), key=lambda item: item[1], reverse=True)[ + 0:k_max + ] + for k in k_values: + hole_docs = [ + row[0] for row in top_hits[0:k] if row[0] not in annotated_corpus + ] + Hole[f"Hole@{k}"].append(len(hole_docs) / k) + + if output_type == "mean": + for k in k_values: + Hole[f"Hole@{k}"] = round(Hole[f"Hole@{k}"] / len(qrels), 5) + + elif output_type == "all": + pass + + return Hole + + +# From https://github.com/embeddings-benchmark/mteb/blob/8178981fd8fcd546d7031afe61a083d13c41520f/mteb/evaluation/evaluators/utils.py +def top_k_accuracy( + qrels: dict[str, dict[str, int]], + results: dict[str, dict[str, float]], + k_values: List[int], + output_type: str = "mean", +) -> Tuple[Dict[str, float]]: + top_k_acc = {} + + for k in k_values: + top_k_acc[f"Accuracy@{k}"] = [] + + k_max, top_hits = max(k_values), {} + + for query_id, doc_scores in results.items(): + top_hits[query_id] = [ + item[0] + for item in sorted( + doc_scores.items(), key=lambda item: item[1], reverse=True + )[0:k_max] + ] + + for query_id in top_hits: + query_relevant_docs = set( + [doc_id for doc_id in qrels[query_id] if qrels[query_id][doc_id] > 0] + ) + for k in k_values: + for relevant_doc_id in query_relevant_docs: + if relevant_doc_id in top_hits[query_id][0:k]: + top_k_acc[f"Accuracy@{k}"].append(1.0) + break + + if output_type == "mean": + for k in k_values: + top_k_acc[f"Accuracy@{k}"] = round( + top_k_acc[f"Accuracy@{k}"] / len(qrels), 5 + ) + + elif output_type == "all": + pass + + return top_k_acc + + +# From https://github.com/embeddings-benchmark/mteb/blob/8178981fd8fcd546d7031afe61a083d13c41520f/mteb/evaluation/evaluators/utils.py +def confidence_scores(sim_scores: List[float]) -> Dict[str, float]: + """Computes confidence scores for a single instance = (query, positives, negatives) + + Args: + sim_scores: Query-documents similarity scores with length `num_pos+num_neg` + + Returns: + conf_scores: + - `max`: Maximum similarity score + - `std`: Standard deviation of similarity scores + - `diff1`: Difference between highest and second highest similarity scores + """ + sim_scores_sorted = sorted(sim_scores)[::-1] + + cs_max = sim_scores_sorted[0] + cs_std = np.std(sim_scores) + if len(sim_scores) > 1: + cs_diff1 = sim_scores_sorted[0] - sim_scores_sorted[1] + elif len(sim_scores) == 1: + cs_diff1 = 0.0 + + conf_scores = {"max": cs_max, "std": cs_std, "diff1": cs_diff1} + + return conf_scores + + +# From https://github.com/embeddings-benchmark/mteb/blob/8178981fd8fcd546d7031afe61a083d13c41520f/mteb/evaluation/evaluators/utils.py +def nAUC( + conf_scores: np.ndarray, + metrics: np.ndarray, + abstention_rates: np.ndarray = np.linspace(0, 1, 11)[:-1], +) -> float: + """Computes normalized Area Under the Curve on a set of evaluated instances as presented in the paper https://arxiv.org/abs/2402.12997 + 1/ Computes the raw abstention curve, i.e., the average evaluation metric at different abstention rates determined by the confidence scores + 2/ Computes the oracle abstention curve, i.e., the best theoretical abstention curve (e.g.: at a 10% abstention rate, the oracle abstains on the bottom-10% instances with regard to the evaluation metric) + 3/ Computes the flat abstention curve, i.e., the one remains flat for all abstention rates (ineffective abstention) + 4/ Computes the area under the three curves + 5/ Finally scales the raw AUC between the oracle and the flat AUCs to get normalized AUC + + Args: + conf_scores: Instance confidence scores used for abstention thresholding, with shape `(num_test_instances,)` + metrics: Metric evaluations at instance-level (e.g.: average precision, NDCG...), with shape `(num_test_instances,)` + abstention_rates: Target rates for the computation of the abstention curve + + Returns: + abst_nauc: Normalized area under the abstention curve (upper-bounded by 1) + """ + + def abstention_curve( + conf_scores: np.ndarray, + metrics: np.ndarray, + abstention_rates: np.ndarray = np.linspace(0, 1, 11)[:-1], + ) -> np.ndarray: + """Computes the raw abstention curve for a given set of evaluated instances and corresponding confidence scores + + Args: + conf_scores: Instance confidence scores used for abstention thresholding, with shape `(num_test_instances,)` + metrics: Metric evaluations at instance-level (e.g.: average precision, NDCG...), with shape `(num_test_instances,)` + abstention_rates: Target rates for the computation of the abstention curve + + Returns: + abst_curve: Abstention curve of length `len(abstention_rates)` + """ + conf_scores_argsort = np.argsort(conf_scores) + abst_curve = np.zeros(len(abstention_rates)) + + for i, rate in enumerate(abstention_rates): + num_instances_abst = min( + round(rate * len(conf_scores_argsort)), len(conf_scores) - 1 + ) + abst_curve[i] = metrics[conf_scores_argsort[num_instances_abst:]].mean() + + return abst_curve + + abst_curve = abstention_curve(conf_scores, metrics, abstention_rates) + or_curve = abstention_curve(metrics, metrics, abstention_rates) + abst_auc = auc(abstention_rates, abst_curve) + or_auc = auc(abstention_rates, or_curve) + flat_auc = or_curve[0] * (abstention_rates[-1] - abstention_rates[0]) + + if or_auc == flat_auc: + abst_nauc = np.nan + else: + abst_nauc = (abst_auc - flat_auc) / (or_auc - flat_auc) + + return abst_nauc diff --git a/geb/evaluators.py b/geb/evaluators.py new file mode 100644 index 0000000..5098970 --- /dev/null +++ b/geb/evaluators.py @@ -0,0 +1,839 @@ +""" +Evaluator objects for different evaluation types. +""" + +import logging +import random +from abc import ABC, abstractmethod +import heapq +from collections import defaultdict +import pytrec_eval +import numpy as np +import sklearn.cluster +import torch +from scipy.stats import pearsonr +from sklearn.linear_model import LogisticRegression +from sklearn.metrics import ( + accuracy_score, + average_precision_score, + classification_report, + f1_score, + precision_score, + recall_score, + label_ranking_average_precision_score, +) +from sklearn.metrics.cluster import v_measure_score +from sklearn.metrics.pairwise import ( + paired_cosine_distances, + paired_euclidean_distances, + paired_manhattan_distances, +) +from sklearn.multioutput import MultiOutputRegressor +from sklearn.preprocessing import MultiLabelBinarizer +from typing import Dict, List, Tuple + +from .eval_utils import ( + cos_sim, + dot_score, + mrr, + recall_cap, + hole, + confidence_scores, + nAUC, + top_k_accuracy, +) + + +class Evaluator(ABC): + """Base class for all evaluators + Extend this class and implement __call__ for custom evaluators. + """ + + def __init__(self, seed=42, **kwargs): + self.seed = seed + random.seed(self.seed) + np.random.seed(self.seed) + torch.manual_seed(self.seed) + torch.cuda.manual_seed_all(self.seed) + + @abstractmethod + def __call__(self, model): + """This is called during training to evaluate the model. + It returns scores. + + Parameters + ---------- + model: + the model to evaluate + """ + pass + + +logger = logging.getLogger(__name__) + + +class logRegClassificationEvaluator(Evaluator): + def __init__( + self, + embeds_train, + y_train, + embeds_test, + y_test, + max_iter=1000, + **kwargs, + ): + super().__init__(**kwargs) + self.embeds_train = embeds_train + self.y_train = y_train + self.embeds_test = embeds_test + self.y_test = y_test + + self.max_iter = max_iter + + def __call__(self): + scores = {} + clf = LogisticRegression( + random_state=self.seed, + n_jobs=-1, + max_iter=self.max_iter, + verbose=1 if logger.isEnabledFor(logging.DEBUG) else 0, + ) + logger.info(f"Encoding {len(self.embeds_train)} training embeds...") + X_train = np.asarray(self.embeds_train) + + logger.info(f"Encoding {len(self.embeds_test)} test embeds...") + X_test = np.asarray(self.embeds_test) + logger.info("Fitting logistic regression classifier...") + clf.fit(X_train, self.y_train) + logger.info("Evaluating...") + y_pred = clf.predict(X_test) + accuracy = accuracy_score(self.y_test, y_pred) + f1 = f1_score(self.y_test, y_pred, average="macro") + scores["accuracy"] = accuracy + scores["f1"] = f1 + + # if binary classification + if len(np.unique(self.y_train)) == 2: + ap = average_precision_score(self.y_test, y_pred) + scores["ap"] = ap + + return scores + + +class ClusteringEvaluator(Evaluator): + def __init__( + self, + embeds, + labels, + clustering_batch_size=500, + **kwargs, + ): + super().__init__(**kwargs) + self.embeds = embeds + self.labels = labels + self.clustering_batch_size = clustering_batch_size + + def __call__(self): + logger.info(f"Encoding {len(self.embeds)} embeds...") + corpus_embeddings = np.asarray(self.embeds) + + logger.info("Fitting Mini-Batch K-Means model...") + clustering_model = sklearn.cluster.MiniBatchKMeans( + n_clusters=len(set(self.labels)), + batch_size=self.clustering_batch_size, + n_init="auto", + ) + clustering_model.fit(corpus_embeddings) + cluster_assignment = clustering_model.labels_ + + logger.info("Evaluating...") + v_measure = v_measure_score(self.labels, cluster_assignment) + + return {"v_measure": v_measure} + + +class PairClassificationEvaluator(Evaluator): + """Evaluate a model based on the similarity of the embeddings by calculating the accuracy of identifying similar and + dissimilar embeds. + The metrics are the cosine similarity as well as euclidean and Manhattan distance + The returned score is the accuracy with a specified metric. + The results are written in a CSV. If a CSV already exists, then values are appended. + The labels need to be 0 for dissimilar pairs and 1 for similar pairs. + :param embeds1: The first column of embeds + :param embeds2: The second column of embeds + :param labels: labels[i] is the label for the pair (embeds1[i], embeds2[i]). Must be 0 or 1 + :param name: Name for the output + :param write_csv: Write results to a CSV file + """ + + def __init__(self, embeds1, embeds2, labels, **kwargs): + super().__init__(**kwargs) + self.embeds1 = embeds1 + self.embeds2 = embeds2 + self.labels = labels + + assert len(self.embeds1) == len(self.embeds2) + assert len(self.embeds1) == len(self.labels) + for label in labels: + assert label == 0 or label == 1 + + def __call__(self): + scores = self.compute_metrics() + # Compute the max of Average Precision (AP) over all distance metrics. + top_ap_score = max(score for k, score in scores.items() if k.endswith("_ap")) + scores["top_ap"] = top_ap_score + return scores + + def compute_metrics(self): + embeddings1 = np.array(self.embeds1) + embeddings2 = np.array(self.embeds2) + + logger.info("Computing similarity distances...") + cosine_scores = 1 - paired_cosine_distances(embeddings1, embeddings2) + manhattan_distances = paired_manhattan_distances(embeddings1, embeddings2) + euclidean_distances = paired_euclidean_distances(embeddings1, embeddings2) + + embeddings1_np = np.asarray(embeddings1) + embeddings2_np = np.asarray(embeddings2) + dot_scores = [ + np.dot(embeddings1_np[i], embeddings2_np[i]) + for i in range(len(embeddings1_np)) + ] + + logger.info("Computing metrics...") + labels = np.asarray(self.labels) + output_scores = {} + for short_name, name, scores, reverse in [ + ["cos_sim", "Cosine-Similarity", cosine_scores, True], + ["manhattan", "Manhattan-Distance", manhattan_distances, False], + ["euclidean", "Euclidean-Distance", euclidean_distances, False], + ["dot", "Dot-Product", dot_scores, True], + ]: + metrics = self._compute_metrics(scores, labels, reverse) + metrics = {short_name + "_" + k: v for k, v in metrics.items()} + output_scores.update(metrics) + + return output_scores + + @staticmethod + def _compute_metrics(scores, labels, high_score_more_similar): + """Compute the metrics for the given scores and labels. + + Args: + scores (`np.ndarray` of shape (n_pairs, )): The similarity/dissimilarity scores for the pairs. + labels (`np.ndarray` of shape (n_pairs, )): The labels for the pairs. + high_score_more_similar (`bool`): If true, then the higher the score, the more similar the pairs are. + + Returns: + `dict`: The metrics for the given scores and labels. + """ + acc, acc_threshold = PairClassificationEvaluator.find_best_acc_and_threshold( + scores, labels, high_score_more_similar + ) + f1, precision, recall, f1_threshold = ( + PairClassificationEvaluator.find_best_f1_and_threshold( + scores, labels, high_score_more_similar + ) + ) + ap = PairClassificationEvaluator.ap_score( + scores, labels, high_score_more_similar + ) + + return { + "accuracy": acc, + "accuracy_threshold": acc_threshold, + "f1": f1, + "f1_threshold": f1_threshold, + "precision": precision, + "recall": recall, + "ap": ap, + } + + @staticmethod + def find_best_acc_and_threshold(scores, labels, high_score_more_similar: bool): + assert len(scores) == len(labels) + rows = list(zip(scores, labels)) + + rows = sorted(rows, key=lambda x: x[0], reverse=high_score_more_similar) + + max_acc = 0 + best_threshold = -1 + + positive_so_far = 0 + remaining_negatives = sum(np.array(labels) == 0) + + for i in range(len(rows) - 1): + score, label = rows[i] + if label == 1: + positive_so_far += 1 + else: + remaining_negatives -= 1 + + acc = (positive_so_far + remaining_negatives) / len(labels) + if acc > max_acc: + max_acc = acc + best_threshold = (rows[i][0] + rows[i + 1][0]) / 2 + + return max_acc, best_threshold + + @staticmethod + def find_best_f1_and_threshold(scores, labels, high_score_more_similar: bool): + assert len(scores) == len(labels) + + scores = np.asarray(scores) + labels = np.asarray(labels) + + rows = list(zip(scores, labels)) + + rows = sorted(rows, key=lambda x: x[0], reverse=high_score_more_similar) + + best_f1 = best_precision = best_recall = 0 + threshold = 0 + nextract = 0 + ncorrect = 0 + total_num_duplicates = sum(labels) + + for i in range(len(rows) - 1): + score, label = rows[i] + nextract += 1 + + if label == 1: + ncorrect += 1 + + if ncorrect > 0: + precision = ncorrect / nextract + recall = ncorrect / total_num_duplicates + f1 = 2 * precision * recall / (precision + recall) + if f1 > best_f1: + best_f1 = f1 + best_precision = precision + best_recall = recall + threshold = (rows[i][0] + rows[i + 1][0]) / 2 + + return best_f1, best_precision, best_recall, threshold + + @staticmethod + def ap_score(scores, labels, high_score_more_similar: bool): + return average_precision_score( + labels, scores * (1 if high_score_more_similar else -1) + ) + + +class MultiClassMultiOutputLogRegClassificationEvaluator(Evaluator): + def __init__( + self, + embeds_train, + y_train, + embeds_test, + y_test, + max_iter=1000, + **kwargs, + ): + super().__init__(**kwargs) + self.embeds_train = embeds_train + self.y_train = y_train + self.embeds_test = embeds_test + self.y_test = y_test + self.max_iter = max_iter + + def __call__(self): + scores = {} + mlb = MultiLabelBinarizer() + # all classes in y_train and y_test + + class_labels = list(self.y_train) + list(self.y_test) + labels = [class_label.split(", ") for class_label in class_labels] + mlb.fit(labels) + train_labels = [class_label.split(", ") for class_label in self.y_train] + test_labels = [class_label.split(", ") for class_label in self.y_test] + + y_train = mlb.transform(train_labels) + y_test = mlb.transform(test_labels) + clf = MultiOutputRegressor( + LogisticRegression( + random_state=self.seed, solver="lbfgs", max_iter=self.max_iter + ) + ).fit(self.embeds_train, y_train) + y_pred = clf.predict(self.embeds_test) + + results_dict = classification_report(y_test, y_pred, output_dict=True) + assert isinstance( + results_dict, dict + ), "Should always be true since `output_dict=True` is passed to sklearn.metric.classification_report" + scores["precision"] = results_dict["macro avg"]["precision"] + scores["recall"] = results_dict["macro avg"]["recall"] + scores["f1"] = results_dict["macro avg"]["f1-score"] + scores["accuracy"] = accuracy_score(y_test, y_pred) + + return scores + + +class MultiClassMultiOutputKNNClassificationEvaluator(Evaluator): + def __init__( + self, + embeds_train, + y_train, + embeds_test, + y_test, + n_neighbors=5, + **kwargs, + ): + super().__init__(**kwargs) + self.embeds_train = embeds_train + self.y_train = y_train + self.embeds_test = embeds_test + self.y_test = y_test + self.n_neighbors = n_neighbors + + def __call__(self): + scores = {} + + mlb = MultiLabelBinarizer() + class_labels = list(self.y_train) + list(self.y_test) + labels = [class_label.split(", ") for class_label in class_labels] + mlb.fit(labels) + train_labels = [class_label.split(", ") for class_label in self.y_train] + test_labels = [class_label.split(", ") for class_label in self.y_test] + + y_train = mlb.transform(train_labels) + y_test = mlb.transform(test_labels) + clf = sklearn.neighbors.KNeighborsClassifier( + n_neighbors=self.n_neighbors, metric="cosine" + ) + logger.info("Fitting KNN classifier...") + clf.fit(self.embeds_train, y_train) + logger.info("Evaluating...") + y_pred = clf.predict(self.embeds_test) + accuracy = accuracy_score(y_test, y_pred) + f1 = f1_score(y_test, y_pred, average="macro") + precision = precision_score(y_test, y_pred, average="macro") + recall = recall_score(y_test, y_pred, average="macro") + lrap = label_ranking_average_precision_score(y_test, y_pred) + scores["f1"] = f1 + scores["accuracy"] = accuracy + scores["precision"] = precision + scores["recall"] = recall + scores["lrap"] = lrap + + return scores + + +class BiGeneMiningEvaluator(Evaluator): + """ + BiGene Mining Evaluator, analogous to Bitext Mining Evaluator https://github.com/embeddings-benchmark/mteb/blob/main/mteb/evaluation/evaluators/BitextMiningEvaluator.py. + + If top_k > 1, then recall@k is also computed. + """ + + def __init__(self, embeds1, embeds2, top_k=1, **kwargs): + super().__init__(**kwargs) + self.n = len(embeds1) + self.embeds1 = np.array(embeds1) + self.embeds2 = np.array(embeds2) + self.gold = list(zip(range(self.n), range(self.n))) + self.top_k = top_k + + def __call__(self): + scores = self.compute_metrics() + return scores + + def compute_metrics(self): + logger.info(f"Finding nearest neighbors... with top_k={self.top_k}") + nearest_neighbors = self._similarity_search( + self.embeds1, self.embeds2, top_k=self.top_k + ) + + # Compute errors + logger.info("Computing metrics...") + labels = [] + predictions = [] + + # Get predictions and labels for top_k=1. + for i, x in enumerate(nearest_neighbors): + j = x[0]["corpus_id"] + predictions.append(j) + labels.append(self.gold[i][1]) + + scores = { + "precision": precision_score( + labels, predictions, zero_division=0, average="weighted" + ), + "recall": recall_score( + labels, predictions, zero_division=0, average="weighted" + ), + "f1": f1_score(labels, predictions, zero_division=0, average="weighted"), + "accuracy": accuracy_score(labels, predictions), + } + + if self.top_k > 1: + # Compute recall@k. + top_k_preds = [] + for i, x in enumerate(nearest_neighbors): + top_k_preds.append([pred["corpus_id"] for pred in x]) + top_k_recall = [ + self.gold[i][1] in top_k_pred + for i, top_k_pred in enumerate(top_k_preds) + ] + scores[f"recall_at_{self.top_k}"] = sum(top_k_recall) / len(top_k_recall) + return scores + + def _similarity_search( + self, + query_embeddings, + corpus_embeddings, + query_chunk_size=100, + corpus_chunk_size=500000, + top_k=1, + score_function=cos_sim, + ): + """This function performs a cosine similarity search between a list of query embeddings and a list of corpus embeddings. + It can be used for Information Retrieval / Semantic Search for corpora up to about 1 Million entries. + :param query_embeddings: A 2 dimensional tensor with the query embeddings. + :param corpus_embeddings: A 2 dimensional tensor with the corpus embeddings. + :param query_chunk_size: Process 100 queries simultaneously. Increasing that value increases the speed, but requires more memory. + :param corpus_chunk_size: Scans the corpus 50k entries at a time. Increasing that value increases the speed, but requires more memory. + :param top_k: Retrieve top k matching entries. + :param score_function: Function for computing scores. By default, cosine similarity. + :return: Returns a list with one entry for each query. Each entry is a list of dictionaries with the keys 'corpus_id' and 'score', sorted by decreasing cosine similarity scores. + """ + query_embeddings = torch.from_numpy(query_embeddings) + corpus_embeddings = torch.from_numpy(corpus_embeddings) + if len(query_embeddings.shape) == 1: + query_embeddings = query_embeddings.unsqueeze(0) + if len(corpus_embeddings.shape) == 1: + corpus_embeddings = corpus_embeddings.unsqueeze(0) + + # Check that corpus and queries are on the same device + if corpus_embeddings.device != query_embeddings.device: + query_embeddings = query_embeddings.to(corpus_embeddings.device) + + queries_result_list = [[] for _ in range(len(query_embeddings))] + + for query_start_idx in range(0, len(query_embeddings), query_chunk_size): + # Iterate over chunks of the corpus + for corpus_start_idx in range(0, len(corpus_embeddings), corpus_chunk_size): + # Compute cosine similarities + cos_scores = score_function( + query_embeddings[ + query_start_idx : query_start_idx + query_chunk_size + ], + corpus_embeddings[ + corpus_start_idx : corpus_start_idx + corpus_chunk_size + ], + ) + + # Get top-k scores + cos_scores_top_k_values, cos_scores_top_k_idx = torch.topk( + cos_scores, + min(top_k, len(cos_scores[0])), + dim=1, + largest=True, + sorted=False, + ) + cos_scores_top_k_values = cos_scores_top_k_values.cpu().tolist() + cos_scores_top_k_idx = cos_scores_top_k_idx.cpu().tolist() + + for query_itr in range(len(cos_scores)): + for sub_corpus_id, score in zip( + cos_scores_top_k_idx[query_itr], + cos_scores_top_k_values[query_itr], + ): + corpus_id = corpus_start_idx + sub_corpus_id + query_id = query_start_idx + query_itr + queries_result_list[query_id].append( + {"corpus_id": corpus_id, "score": score} + ) + + # Sort and strip to top_k results + for idx in range(len(queries_result_list)): + queries_result_list[idx] = sorted( + queries_result_list[idx], key=lambda x: x["score"], reverse=True + ) + queries_result_list[idx] = queries_result_list[idx][0:top_k] + + return queries_result_list + + +class EDSEvaluator(Evaluator): + """ + Evolutionary Distance Similarity Evaluator, analogous to Semantic Textual Similarity Evaluator. + Adapted from https://github.com/embeddings-benchmark/mteb/blob/main/mteb/evaluation/evaluators/STSEvaluator.py + """ + + def __init__(self, embeds1, embeds2, gold_scores, **kwargs): + super().__init__(**kwargs) + self.embeds1 = embeds1 + self.embeds2 = embeds2 + self.gold_scores = gold_scores + + def __call__(self): + embeddings1 = np.array(self.embeds1) + embeddings2 = np.array(self.embeds2) + logger.info("Evaluating...") + cosine_scores = paired_cosine_distances(embeddings1, embeddings2) + manhattan_distances = paired_manhattan_distances(embeddings1, embeddings2) + euclidean_distances = paired_euclidean_distances(embeddings1, embeddings2) + + cosine_pearson, _ = pearsonr(self.gold_scores, cosine_scores) + manhattan_pearson, _ = pearsonr(self.gold_scores, manhattan_distances) + euclidean_pearson, _ = pearsonr(self.gold_scores, euclidean_distances) + + top_corr = max( + cosine_pearson, + manhattan_pearson, + euclidean_pearson, + ) + return { + "cos_sim": cosine_pearson, + "manhattan": manhattan_pearson, + "euclidean": euclidean_pearson, + "top_corr": top_corr, + } + + +class RetrievalEvaluator(Evaluator): + """Adapted from + https://github.com/embeddings-benchmark/mteb/blob/main/mteb/evaluation/evaluators/RetrievalEvaluator.py + """ + + def __init__( + self, + corpus_embeds, + query_embeds, + corpus_ids, + query_ids, + qrels: Dict[str, Dict[str, int]], + k_values: List[int] = [5, 10, 50], + score_function: str = "cos_sim", + corpus_chunk_size: int = 50000, + **kwargs, + ): + super().__init__(**kwargs) + self.corpus_embeds = corpus_embeds + self.query_embeds = query_embeds + self.corpus_ids = corpus_ids + self.query_ids = query_ids + self.qrels = qrels + self.k_values = k_values + self.top_k = max(k_values) if "top_k" not in kwargs else kwargs["top_k"] + self.score_function = score_function + self.score_functions = { + "cos_sim": cos_sim, + "dot": dot_score, + } + self.corpus_chunk_size = corpus_chunk_size + + def __call__(self): + results = self.search( + self.corpus_embeds, + self.query_embeds, + self.corpus_ids, + self.query_ids, + self.top_k, + self.score_function, + ) + ndcg, _map, recall, precision, naucs = self.evaluate( + self.qrels, results, self.k_values + ) + mrr, naucs_mrr = self.evaluate_custom(self.qrels, results, self.k_values, "mrr") + scores = { + **{f"ndcg_at_{k.split('@')[1]}": v for (k, v) in ndcg.items()}, + **{f"map_at_{k.split('@')[1]}": v for (k, v) in _map.items()}, + **{f"recall_at_{k.split('@')[1]}": v for (k, v) in recall.items()}, + **{f"precision_at_{k.split('@')[1]}": v for (k, v) in precision.items()}, + **{f"mrr_at_{k.split('@')[1]}": v for (k, v) in mrr.items()}, + **{ + k.replace("@", "_at_").replace("_P", "_precision").lower(): v + for k, v in naucs.items() + }, + **{ + k.replace("@", "_at_").replace("_P", "_precision").lower(): v + for k, v in naucs_mrr.items() + }, + } + return scores + + def search( + self, + corpus_embeds, + query_embeds, + corpus_ids, + query_ids, + top_k: int, + score_function: str, + return_sorted: bool = False, + **kwargs, + ) -> dict[str, dict[str, float]]: + # Create embeddings for all queries using model.encode() + # Runs semantic search against the corpus embeddings + # Returns a ranked list with the corpus ids + if score_function not in self.score_functions: + raise ValueError( + f"score function: {score_function} must be either (cos_sim) for cosine similarity or (dot) for dot product" + ) + # make query embeds and corpus embeds torch tensors + query_embeds = torch.from_numpy(query_embeds) + corpus_embeds = torch.from_numpy(corpus_embeds) + itr = range(0, len(corpus_embeds), self.corpus_chunk_size) + results = defaultdict(dict) + # Keep only the top-k docs for each query + result_heaps = defaultdict(list) + for batch_num, corpus_start_idx in enumerate(itr): + logger.info("Searching Batch {}/{}...".format(batch_num + 1, len(itr))) + corpus_end_idx = min( + corpus_start_idx + self.corpus_chunk_size, len(corpus_ids) + ) + sub_corpus_embeds = corpus_embeds[corpus_start_idx:corpus_end_idx] + # Compute similarites using either cosine-similarity or dot product + cos_scores = self.score_functions[score_function]( + query_embeds, sub_corpus_embeds + ) + cos_scores[torch.isnan(cos_scores)] = -1 + + # Get top-k values + cos_scores_top_k_values, cos_scores_top_k_idx = torch.topk( + cos_scores, + min( + top_k + 1, + len(cos_scores[1]) if len(cos_scores) > 1 else len(cos_scores[-1]), + ), + dim=1, + largest=True, + sorted=return_sorted, + ) + cos_scores_top_k_values = cos_scores_top_k_values.cpu().tolist() + cos_scores_top_k_idx = cos_scores_top_k_idx.cpu().tolist() + + for query_itr in range(len(query_embeds)): + query_id = query_ids[query_itr] + for sub_corpus_id, score in zip( + cos_scores_top_k_idx[query_itr], cos_scores_top_k_values[query_itr] + ): + corpus_id = corpus_ids[corpus_start_idx + sub_corpus_id] + if corpus_id != query_id: + if len(result_heaps[query_id]) < top_k: + # Push item on the heap + heapq.heappush(result_heaps[query_id], (score, corpus_id)) + else: + # If item is larger than the smallest in the heap, push it on the heap then pop the smallest element + heapq.heappushpop( + result_heaps[query_id], (score, corpus_id) + ) + + for qid in result_heaps: + for score, corpus_id in result_heaps[qid]: + results[qid][corpus_id] = score + + return results + + @staticmethod + def evaluate( + qrels: dict[str, dict[str, int]], + results: dict[str, dict[str, float]], + k_values: List[int], + ignore_identical_ids: bool = True, + ) -> Tuple[Dict[str, float], dict[str, float], dict[str, float], dict[str, float]]: + if ignore_identical_ids: + logger.info( + "For evaluation, we ignore identical query and document ids (default), please explicitly set ``ignore_identical_ids=False`` to ignore this." + ) + popped = [] + for qid, rels in results.items(): + for pid in list(rels): + if qid == pid: + results[qid].pop(pid) + popped.append(pid) + + all_ndcgs, all_aps, all_recalls, all_precisions = {}, {}, {}, {} + + for k in k_values: + all_ndcgs[f"NDCG@{k}"] = [] + all_aps[f"MAP@{k}"] = [] + all_recalls[f"Recall@{k}"] = [] + all_precisions[f"P@{k}"] = [] + + map_string = "map_cut." + ",".join([str(k) for k in k_values]) + ndcg_string = "ndcg_cut." + ",".join([str(k) for k in k_values]) + recall_string = "recall." + ",".join([str(k) for k in k_values]) + precision_string = "P." + ",".join([str(k) for k in k_values]) + evaluator = pytrec_eval.RelevanceEvaluator( + qrels, {map_string, ndcg_string, recall_string, precision_string} + ) + scores = evaluator.evaluate(results) + + for query_id in scores.keys(): + for k in k_values: + all_ndcgs[f"NDCG@{k}"].append(scores[query_id]["ndcg_cut_" + str(k)]) + all_aps[f"MAP@{k}"].append(scores[query_id]["map_cut_" + str(k)]) + all_recalls[f"Recall@{k}"].append(scores[query_id]["recall_" + str(k)]) + all_precisions[f"P@{k}"].append(scores[query_id]["P_" + str(k)]) + ndcg, _map, recall, precision = ( + all_ndcgs.copy(), + all_aps.copy(), + all_recalls.copy(), + all_precisions.copy(), + ) + + for k in k_values: + ndcg[f"NDCG@{k}"] = round(sum(ndcg[f"NDCG@{k}"]) / len(scores), 5) + _map[f"MAP@{k}"] = round(sum(_map[f"MAP@{k}"]) / len(scores), 5) + recall[f"Recall@{k}"] = round(sum(recall[f"Recall@{k}"]) / len(scores), 5) + precision[f"P@{k}"] = round(sum(precision[f"P@{k}"]) / len(scores), 5) + naucs = RetrievalEvaluator.evaluate_abstention( + results, {**all_ndcgs, **all_aps, **all_recalls, **all_precisions} + ) + return ndcg, _map, recall, precision, naucs + + @staticmethod + def evaluate_abstention( + results: dict[str, dict[str, float]], + metric_scores: dict[str, list[float]], + ) -> Dict[str, float]: + """Computes normalized Area Under the Curve on a set of evaluated instances as presented in the paper https://arxiv.org/abs/2402.12997""" + all_sim_scores = [list(results[qid].values()) for qid in list(results.keys())] + all_conf_scores = [ + confidence_scores(sim_scores) for sim_scores in all_sim_scores + ] + conf_fcts = list(all_conf_scores[0].keys()) + all_conf_scores = { + fct: np.array([x[fct] for x in all_conf_scores]) for fct in conf_fcts + } + metric_scores = {k: np.array(v) for k, v in metric_scores.items()} + naucs = {} + + for metric_name, scores in metric_scores.items(): + for fct, conf_scores in all_conf_scores.items(): + naucs[f"nAUC_{metric_name}_{fct}"] = nAUC(conf_scores, scores) + + return naucs + + @staticmethod + def evaluate_custom( + qrels: dict[str, dict[str, int]], + results: dict[str, dict[str, float]], + k_values: List[int], + metric: str, + output_type: str = "all", + ) -> Tuple[Dict[str, float]]: + if metric.lower() in ["mrr", "mrr@k", "mrr_cut"]: + metric_scores = mrr(qrels, results, k_values, output_type) + + elif metric.lower() in ["recall_cap", "r_cap", "r_cap@k"]: + metric_scores = recall_cap(qrels, results, k_values, output_type) + + elif metric.lower() in ["hole", "hole@k"]: + metric_scores = hole(qrels, results, k_values, output_type) + + elif metric.lower() in [ + "acc", + "top_k_acc", + "accuracy", + "accuracy@k", + "top_k_accuracy", + ]: + metric_scores = top_k_accuracy(qrels, results, k_values, output_type) + + naucs = RetrievalEvaluator.evaluate_abstention(results, metric_scores) + metric_scores_avg = {k: sum(v) / len(v) for k, v in metric_scores.items()} + + return metric_scores_avg, naucs diff --git a/geb/geb.py b/geb/geb.py new file mode 100644 index 0000000..e6bf3df --- /dev/null +++ b/geb/geb.py @@ -0,0 +1,129 @@ +from itertools import chain +import logging +import os +import traceback +from typing import Any, List + +from rich.console import Console + +from .eval_utils import set_all_seeds +from .modality import Modality +from .models import BioSeqTransformer +from .tasks.tasks import Task + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + + +class GEB: + """GEB class to run the evaluation pipeline.""" + + def __init__(self, tasks: List[type[Task]], seed: int = 42): + self.tasks = tasks + set_all_seeds(seed) + + def print_selected_tasks(self): + """Print the selected tasks.""" + console = Console() + console.rule("[bold]Selected Tasks\n", style="grey15") + for task in self.tasks: + prefix = " - " + name = f"{task.metadata.display_name}" + category = f", [italic grey39]{task.metadata.type}[/]" + console.print(f"{prefix}{name}{category}") + console.print("\n") + + def run( + self, + model, # type encoder + output_folder: str = "results", + ): + """Run the evaluation pipeline on the selected tasks. + + Args: + model: Model to be used for evaluation + output_folder: Folder where the results will be saved. Default to 'results'. Where it will save the results in the format: + `{output_folder}/{model_name}/{model_revision}/{task_name}.json`. + + Returns: + A list of MTEBResults objects, one for each task evaluated. + """ + # Run selected tasks + self.print_selected_tasks() + results = [] + + for task in self.tasks: + logger.info( + f"\n\n********************** Evaluating {task.metadata.display_name} **********************" + ) + + try: + result = task().run(model) + except Exception as e: + logger.error(e) + logger.error(traceback.format_exc()) + logger.error(f"Error running task {task}") + continue + + results.append(result) + + save_path = get_output_folder(model.hf_name, task, output_folder) + with open(save_path, "w") as f_out: + f_out.write(result.model_dump_json(indent=2)) + return results + + +def get_model(model_name: str, **kwargs: Any) -> type[BioSeqTransformer]: + all_names = get_all_model_names() + for cls in BioSeqTransformer.__subclasses__(): + if model_name in cls.MODEL_NAMES: + return cls(model_name, **kwargs) + raise ValueError(f"Model {model_name} not found in {all_names}.") + + +def get_all_model_names() -> List[str]: + return list( + chain.from_iterable( + cls.MODEL_NAMES for cls in BioSeqTransformer.__subclasses__() + ) + ) + + +def get_all_task_names() -> List[str]: + return [task.metadata.id for task in get_all_tasks()] + + +def get_tasks_by_name(tasks: List[str]) -> List[type[Task]]: + return [_get_task(task) for task in tasks] + + +def get_tasks_by_modality(modality: Modality) -> List[type[Task]]: + return [task for task in get_all_tasks() if task.metadata.modality == modality] + + +def get_all_tasks() -> List[type[Task]]: + return Task.__subclasses__() + + +def _get_task(task_name: str) -> type[Task]: + logger.info(f"Getting task {task_name}") + for task in get_all_tasks(): + if task.metadata.id == task_name: + return task + + raise ValueError( + f"Task {task_name} not found, available tasks are: {[task.metadata.id for task in get_all_tasks()]}" + ) + + +def get_output_folder( + model_hf_name: str, task: type[Task], output_folder: str, create: bool = True +): + output_folder = os.path.join(output_folder, os.path.basename(model_hf_name)) + # create output folder if it does not exist + if create and not os.path.exists(output_folder): + os.makedirs(output_folder) + return os.path.join( + output_folder, + f"{task.metadata.id}.json", + ) diff --git a/geb/modality.py b/geb/modality.py new file mode 100644 index 0000000..146d1ad --- /dev/null +++ b/geb/modality.py @@ -0,0 +1,10 @@ +"""Defines the data modality enum.""" + +from enum import Enum + + +class Modality(Enum): + """Data modality, either DNA or protein sequence.""" + + PROTEIN = "protein" + DNA = "dna" diff --git a/geb/models.py b/geb/models.py new file mode 100644 index 0000000..1c46c81 --- /dev/null +++ b/geb/models.py @@ -0,0 +1,482 @@ +import logging +import re +from abc import ABC, abstractmethod +from functools import partial +from types import SimpleNamespace +from typing import Dict, List, Literal, Optional + +import numpy as np +import torch +import tqdm as tqdm +from datasets import Dataset +from torch import Tensor +from torch.nn import functional as F +from torch.utils.data import DataLoader +from transformers import ( + AutoConfig, + AutoModel, + AutoModelForCausalLM, + AutoModelForMaskedLM, + AutoTokenizer, + BatchEncoding, + DefaultDataCollator, + T5EncoderModel, + T5Tokenizer, +) +from transformers.modeling_outputs import BaseModelOutput + +from .modality import Modality +from .eval_utils import ForwardHook, pool + +logger = logging.getLogger(__name__) + + +class BioSeqTransformer(ABC): + """ + Abstract class to wrap models which map biological sequences (DNA/Prot) to embeddings. + Modelled after SentenceTransformer (https://github.com/UKPLab/sentence-transformers/blob/master/sentence_transformers/SentenceTransformer.py) + + Args: + model_name: Name or path to the pretrained model. + layers: List of model layers to probe. Can be integers or "mid" or "last". + devices: List of device ids for inference. If cuda is not available, will use cpu. + num_processes: Number of processes to use for data loading. + max_seq_length: Maximum sequence length of the input sequences. + l2_norm: If true, embeddings are L2-normalized before they are returned. + batch_size: Batch size for encoding. + pool_type: Pooling strategy to use. One of "mean", "max", "cls", "last". + """ + + def __init__( + self, + model_name: str, + layers: Optional[List[int] | Literal["mid"] | Literal["last"]] = None, + devices: List[int] = [0], + num_processes: int = 16, + max_seq_length: int = 1024, + l2_norm: bool = False, + batch_size: int = 128, + pool_type: str = "mean", + ): + super().__init__() + + self.id = self.__class__.__name__ + self.hf_name = model_name + self.encoder = self._load_model(model_name) + if not hasattr(self.encoder, "config"): + raise ValueError( + 'The model from `self._load_model()` must have a "config" attribute.' + ) + self.config = self.encoder.config + self.tokenizer = self._get_tokenizer(model_name) + self.num_param = sum(p.numel() for p in self.encoder.parameters()) + self.data_collator = DefaultDataCollator() + self.gpu_count = len(devices) + self.l2_norm = l2_norm + + self.device = torch.device( + f"cuda:{devices[0]}" if torch.cuda.is_available() else "cpu" + ) + self.num_processes = num_processes + self.max_seq_length = max_seq_length + self.batch_size = batch_size + self.pool_type = pool_type + + if self.gpu_count > 1: + self.encoder = torch.nn.DataParallel(self.encoder, device_ids=devices) + self.encoder.to(self.device) + self.encoder.eval() + + mid_layer = self.num_layers // 2 + last_layer = self.num_layers - 1 + mid_layer_label = f"mid ({mid_layer})" + last_layer_label = f"last ({self.num_layers - 1})" + + if layers is None: + logger.debug(f"Using default layers: {mid_layer_label}, {last_layer_label}") + self.layers = [mid_layer, last_layer] + self.layer_labels = [mid_layer_label, last_layer_label] + elif layers == "mid": + self.layers = [mid_layer] + self.layer_labels = [mid_layer_label] + elif layers == "last": + self.layers = [last_layer] + self.layer_labels = [last_layer_label] + else: + self.layers = layers + self.layer_labels = [str(layer) for layer in layers] + + def _encode_single_batch(self, batch_dict: Dict[str, Tensor]): + """Returns the output embedding for the given batch with shape [batch, num_layers, D].""" + outputs = self.encoder(**batch_dict, output_hidden_states=True) + embeds = [outputs.hidden_states[layer] for layer in self.layers] + embeds = [ + pool(layer_embeds, batch_dict["attention_mask"], self.pool_type) + for layer_embeds in embeds + ] + # Stack with shape [B, num_layers, D]. + embeds = torch.stack(embeds, dim=1) + return embeds + + def _load_model(self, model_name): + return AutoModel.from_pretrained(model_name, trust_remote_code=True) + + def _get_tokenizer(self, model_name): + return AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) + + def _tokenize_func( + self, tokenizer, examples: Dict[str, List], max_seq_length: int + ) -> BatchEncoding: + batch_dict = tokenizer( + examples["input_seqs"], + max_length=max_seq_length, + padding=True, + truncation=True, + ) + return batch_dict + + @property + def metadata(self) -> Dict: + return { + "hf_name": self.hf_name, + "revision": "...", # TODO: Fix + "num_layers": self.num_layers, + "num_params": self.num_param, + "embed_dim": self.embed_dim, + } + + @property + @abstractmethod + def num_layers(self) -> int: + pass + + @property + @abstractmethod + def embed_dim(self) -> int: + pass + + @property + @abstractmethod + def modality(self) -> Modality: + pass + + @torch.no_grad() + def encode(self, sequences, **kwargs) -> np.ndarray: + """Returns a list of embeddings for the given sequences. + Args: + sequences (`List[str]`): List of sequences to encode + Returns: + `np.ndarray`: Embeddings for the given sequences of shape [num_sequences, num_layers, embedding_dim]. + """ + dataset = Dataset.from_dict({"input_seqs": sequences}) + dataset.set_transform( + partial( + self._tokenize_func, self.tokenizer, max_seq_length=self.max_seq_length + ) + ) + data_loader = DataLoader( + dataset, + batch_size=self.batch_size * self.gpu_count, + shuffle=False, + drop_last=False, + num_workers=self.num_processes, + collate_fn=self.data_collator, + pin_memory=True, + ) + + if max(self.layers) >= self.num_layers: + raise ValueError( + f"Layer {max(self.layers)} is not available in the model. Choose a layer between 0 and {self.num_layers - 1}" + ) + + encoded_embeds = [] + for batch_dict in tqdm.tqdm( + data_loader, desc="encoding", mininterval=10, disable=len(sequences) < 128 + ): + batch_dict = {k: v.to(self.device) for k, v in batch_dict.items()} + + embeds = self._encode_single_batch(batch_dict) + + if self.l2_norm: + embeds = F.normalize(embeds, p=2, dim=-1) + encoded_embeds.append(embeds.cpu().numpy()) + + return np.concatenate(encoded_embeds, axis=0) + + +class ESM(BioSeqTransformer): + """ESM model from https://huggingface.co/docs/transformers/en/model_doc/esm""" + + MODEL_NAMES = [ + "facebook/esm2_t6_8M_UR50D", + "facebook/esm2_t12_35M_UR50D", + "facebook/esm2_t30_150M_UR50D", + "facebook/esm2_t33_650M_UR50D", + "facebook/esm2_t36_3B_UR50D", + "facebook/esm2_t48_15B_UR50D", + ] + + @property + def modality(self) -> Modality: + return Modality.PROTEIN + + @property + def num_layers(self) -> int: + return self.config.num_hidden_layers + + @property + def embed_dim(self) -> int: + return self.config.hidden_size + + +class ESM3(BioSeqTransformer): + """ESM3 model from https://github.com/evolutionaryscale/esm""" + + MODEL_NAMES = ["esm3_sm_open_v1"] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Register forward hooks to store embeddings per layer. + self.hooks = [ + ForwardHook(self.encoder.transformer.blocks[layer]) for layer in self.layers + ] + + @property + def modality(self) -> Modality: + return Modality.PROTEIN + + @property + def num_layers(self) -> int: + return self.config.num_hidden_layers + + @property + def embed_dim(self) -> int: + return self.config.hidden_size + + def _load_model(self, model_name): + try: + from esm.models.esm3 import ESM3 as ModelESM3 + except ImportError: + raise ImportError( + "ESM3 is not installed. Please install it with `pip install esm`." + ) + model = ModelESM3.from_pretrained("esm3_sm_open_v1") + model.config = SimpleNamespace( + num_hidden_layers=len(model.transformer.blocks), + hidden_size=model.transformer.blocks[0].ffn[-1].out_features, + ) + return model + + def _get_tokenizer(self, model_name): + try: + from esm.tokenization.sequence_tokenizer import EsmSequenceTokenizer + except ImportError: + raise ImportError( + "ESM3 is not installed. Please install it with `pip install esm`." + ) + return EsmSequenceTokenizer() + + def _encode_single_batch(self, batch_dict: Dict[str, Tensor]): + _ = self.encoder.forward(sequence_tokens=batch_dict["input_ids"]) + embeds = [hook.output for hook in self.hooks] + embeds = [ + pool(layer_embeds, batch_dict["attention_mask"], self.pool_type) + for layer_embeds in embeds + ] + # Stack with shape [B, num_layers, D]. + embeds = torch.stack(embeds, dim=1) + embeds = embeds.to(torch.float32) + return embeds + + +class ProtT5(BioSeqTransformer): + """ProtT5 model from https://github.com/agemagician/ProtTrans""" + + MODEL_NAMES = [ + "Rostlab/prot_t5_xl_uniref50", + "Rostlab/prot_t5_xl_bfd", + "Rostlab/prot_t5_xxl_uniref50", + "Rostlab/prot_t5_xxl_bfd", + ] + + @property + def modality(self) -> Modality: + return Modality.PROTEIN + + @property + def num_layers(self) -> int: + return self.config.num_layers + + @property + def embed_dim(self) -> int: + return self.config.d_model + + def _load_model(self, model_name): + return T5EncoderModel.from_pretrained(model_name) + + def _get_tokenizer(self, model_name): + return T5Tokenizer.from_pretrained(model_name, do_lower_case=False) + + def _tokenize_func( + self, tokenizer, examples: Dict[str, List], max_seq_length: int + ) -> BatchEncoding: + example_sequences = examples["input_seqs"] + # Add space between amino acids to make sure they are tokenized correctly. + example_sequences = [" ".join(sequence) for sequence in example_sequences] + example_sequences = [ + re.sub(r"[UZOB]", "X", sequence) for sequence in example_sequences + ] + batch_dict = tokenizer( + example_sequences, + max_length=max_seq_length, + padding=True, + truncation=True, + add_special_tokens=True, + ) + + return batch_dict + + +class ProGen(BioSeqTransformer): + """ProGen models from https://github.com/salesforce/progen.""" + + MODEL_NAMES = [ + "hugohrban/progen2-small", + "hugohrban/progen2-medium", + "hugohrban/progen2-base", + "hugohrban/progen2-large", + "hugohrban/progen2-xlarge", + ] + + @property + def modality(self) -> Modality: + return Modality.PROTEIN + + @property + def num_layers(self) -> int: + return self.config.n_layer + + @property + def embed_dim(self) -> int: + return self.config.embed_dim + + def _load_model(self, model_name): + return AutoModelForCausalLM.from_pretrained(model_name, trust_remote_code=True) + + def _get_tokenizer(self, model_name_or_path): + tokenizer = AutoTokenizer.from_pretrained( + model_name_or_path, trust_remote_code=True + ) + tokenizer.pad_token = "<|pad|>" + return tokenizer + + def _encode_single_batch(self, batch_dict: Dict[str, Tensor]): + """Returns the output embedding for the given batch with shape [batch, num_layers, D].""" + outputs: BaseModelOutput = self.encoder( + input_ids=batch_dict["input_ids"], + output_hidden_states=True, + use_cache=False, + ) + embeds = [outputs.hidden_states[layer] for layer in self.layers] + embeds = [ + pool(layer_embeds, batch_dict["attention_mask"], self.pool_type) + for layer_embeds in embeds + ] + # Stack with shape [B, num_layers, D]. + embeds = torch.stack(embeds, dim=1) + return embeds + + +class EvoModel(BioSeqTransformer): + """https://github.com/evo-design/evo.""" + + MODEL_NAMES = [ + "togethercomputer/evo-1-8k-base", + "togethercomputer/evo-1-131k-base", + ] + + @property + def modality(self) -> Modality: + return Modality.DNA + + @property + def num_layers(self) -> int: + return self.config.num_layers + + @property + def embed_dim(self) -> int: + return self.config.hidden_size + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + # Register forward hooks to store embeddings per layer. + self.hooks = [] + for layer in self.layers: + # For the last layer, get the output of `backbone.norm`, which directly precedes `backbone.unembed`. + # This is equivalent to the approach in https://github.com/evo-design/evo/issues/32. + if layer == self.num_layers - 1 or layer == -1: + self.hooks.append(ForwardHook(self.encoder.backbone.norm)) + else: + self.hooks.append(ForwardHook(self.encoder.backbone.blocks[layer])) + + def _load_model(self, model_name): + config = AutoConfig.from_pretrained( + model_name, trust_remote_code=True, revision="1.1_fix" + ) + model = AutoModelForCausalLM.from_pretrained( + model_name, config=config, trust_remote_code=True, revision="1.1_fix" + ) + return model + + def _get_tokenizer(self, model_name): + tokenizer = AutoTokenizer.from_pretrained( + model_name, revision="1.1_fix", trust_remote_code=True + ) + # Evo tokenizer is missing pad_token by default. + tokenizer.add_special_tokens({"pad_token": "N"}) + return tokenizer + + def _encode_single_batch(self, batch_dict: Dict[str, Tensor]): + _ = self.encoder(batch_dict["input_ids"], use_cache=False) + embeds = [hook.output for hook in self.hooks] + # The hook output for Evo middle layers is a tuple (embedding, inference_params=None). + embeds = [x[0] if isinstance(x, tuple) else x for x in embeds] + embeds = [ + pool(layer_embeds, batch_dict["attention_mask"], self.pool_type) + for layer_embeds in embeds + ] + # Stack with shape [B, num_layers, D]. + embeds = torch.stack(embeds, dim=1) + embeds = embeds.to(torch.float32) + return embeds + + +class NTModel(BioSeqTransformer): + """Nucleotide Transformer https://github.com/instadeepai/nucleotide-transformer""" + + MODEL_NAMES = [ + "InstaDeepAI/nucleotide-transformer-v2-50m-multi-species", + "InstaDeepAI/nucleotide-transformer-v2-100m-multi-species", + "InstaDeepAI/nucleotide-transformer-v2-250m-multi-species", + "InstaDeepAI/nucleotide-transformer-v2-500m-multi-species", + "InstaDeepAI/nucleotide-transformer-2.5b-multi-species", + ] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.max_seq_length = self.tokenizer.model_max_length + + @property + def modality(self) -> Modality: + return Modality.DNA + + @property + def num_layers(self) -> int: + return self.config.num_hidden_layers + + @property + def embed_dim(self) -> int: + return self.config.hidden_size + + def _load_model(self, model_name): + return AutoModelForMaskedLM.from_pretrained(model_name, trust_remote_code=True) diff --git a/geb/results.py b/geb/results.py new file mode 100644 index 0000000..afa378f --- /dev/null +++ b/geb/results.py @@ -0,0 +1,50 @@ +from typing import List +from pydantic import BaseModel + + +class Metric(BaseModel): + metric_id: str + display_name: str + display_value: float + description: str + + +class TaskResult(BaseModel): + task_id: str + display_name: str + description: str + metrics: List[Metric] + + +class TaskResults(BaseModel): + results_id: str + description: str + task_results: List[TaskResult] + + +# Example task results that conforms to above data specification +mock_task_results = { + "results_id": "result_123", + "description": "Overall results of the tasks", + "task_results": [ + { + "task_id": "task_1", + "display_name": "Task 1", + "description": "Description of Task 1", + "metrics": [ + { + "metric_id": "metric_1", + "display_name": "Metric 1", + "display_value": "Value 1", + "description": "Description of Metric 1", + }, + { + "metric_id": "metric_2", + "display_name": "Metric 2", + "display_value": "Value 2", + "description": "Description of Metric 2", + }, + ], + }, + ], +} diff --git a/geb/tasks/__init__.py b/geb/tasks/__init__.py new file mode 100644 index 0000000..29bc042 --- /dev/null +++ b/geb/tasks/__init__.py @@ -0,0 +1,13 @@ +# ruff: noqa: F403 + +from .tasks import Task +from .eds_tasks import * +from .pair_classification_tasks import * +from .retrieval_tasks import * +from .classification_tasks import * +from .clustering_tasks import * +from .bigene_mining_tasks import * + +__all__ = [ + "Task", +] diff --git a/geb/tasks/bigene_mining_tasks.py b/geb/tasks/bigene_mining_tasks.py new file mode 100644 index 0000000..1b7607e --- /dev/null +++ b/geb/tasks/bigene_mining_tasks.py @@ -0,0 +1,77 @@ +""" +Bigene mining tasks are analogous to bitext matching tasks, but for genes. +Cosine similarity is used to mine genes of related functions from different organisms. +""" + +import logging +from collections import defaultdict + +from geb.evaluators import BiGeneMiningEvaluator +from geb.modality import Modality +from geb.models import BioSeqTransformer +from geb.tasks.tasks import Dataset, Task, TaskMetadata, TaskResult + +logger = logging.getLogger(__name__) + + +def run_bigene_mining_tasks( + model: BioSeqTransformer, metadata: TaskMetadata, top_k: int = 1 +) -> TaskResult: + """Evaluate bigene mining task. Utilizes the BiGeneMiningEvaluator.""" + if len(metadata.datasets) != 1: + raise ValueError("BiGeneMining tasks require 1 dataset.") + ds = metadata.datasets[0].load()["train"] + layer_results = defaultdict(dict) + embeds1 = model.encode(ds["Seq1"]) + embeds2 = model.encode(ds["Seq2"]) + for i, layer in enumerate(model.layers): + evaluator = BiGeneMiningEvaluator(embeds1[:, i], embeds2[:, i], top_k=top_k) + layer_results["layers"][layer] = evaluator() + logger.info( + f"Layer: {layer}, {metadata.display_name} matching results: {layer_results['layers'][layer]}" + ) + return TaskResult.from_dict(metadata, layer_results, model.metadata) + + +class BacArchBiGeneMining(Task): + metadata = TaskMetadata( + id="bacarch_bigene", + display_name="BacArch BiGene", + description="Evaluate on BacArch bigene matching task between bacterial (E.coli K-12) proteins and archaeal (Sulfolobus acidocaldarius DSM 639) proteins.", + type="bigene_mining", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/bac_arch_bigene", + revision="main", + ) + ], + primary_metric_id="f1", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_bigene_mining_tasks(model, self.metadata) + + +class ModACParalogyBiGeneMining(Task): + # ModAC Paralogy matching with top_k=1 is too strict (most models have accuracy < 0.1%) + # Instead use recall@5 as the main metric. + TOP_K = 5 + + metadata = TaskMetadata( + id="modac_paralogy_bigene", + display_name="ModAC Paralogy BiGene", + description="Evaluate on paralogy bitext matching task between paralogous protein (ModA and ModC).", + type="bigene_mining", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/modac_paralogy_bigene", + revision="main", + ) + ], + primary_metric_id="recall_at_5", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_bigene_mining_tasks(model, self.metadata, top_k=self.TOP_K) diff --git a/geb/tasks/classification_tasks.py b/geb/tasks/classification_tasks.py new file mode 100644 index 0000000..99baac7 --- /dev/null +++ b/geb/tasks/classification_tasks.py @@ -0,0 +1,208 @@ +""" +Classification tasks take in biological sequence and functional labels. +Multi-class and/or multi-label classification tasks are supported. +""" + +import logging +from collections import defaultdict + +import datasets +import numpy as np + +from geb.eval_utils import merge_split_elem_embeds +from geb.evaluators import ( + MultiClassMultiOutputKNNClassificationEvaluator, + logRegClassificationEvaluator, +) +from geb.modality import Modality +from geb.models import BioSeqTransformer +from geb.tasks.tasks import Dataset, Task, TaskMetadata, TaskResult + +logger = logging.getLogger(__name__) + + +def split_sequences( + ds: datasets.DatasetDict, max_seq_length: int +) -> datasets.DatasetDict: + """Split sequences into chunks of max_seq_length using datasets.Dataset.map().""" + + def _split_sequence(examples, max_seq_length): + assert ( + len(examples["Sequence"]) == 1 + ), "split map function should use batch size of 1." + example = {k: v[0] for k, v in examples.items()} + seq = example["Sequence"] + # Split by chunks of max_seq_length. + seq_split = [ + seq[i : i + max_seq_length] for i in range(0, len(seq), max_seq_length) + ] + # Repeat other fields by the number of splits. + example = { + k: [v] * len(seq_split) for k, v in example.items() if k != "Sequence" + } + example["Sequence"] = seq_split + return example + + ds = ds.map( + _split_sequence, + batched=True, + batch_size=1, + fn_kwargs={"max_seq_length": max_seq_length}, + keep_in_memory=True, + load_from_cache_file=False, + ) + return ds + + +def run_classification_task( + model: BioSeqTransformer, metadata: TaskMetadata +) -> TaskResult: + """Evaluate on classification tasks using logistic regression classifier.""" + ds = metadata.datasets[0].load() + layer_results = defaultdict(dict) + train_embeds = model.encode(ds["train"]["Sequence"]) + test_embeds = model.encode(ds["test"]["Sequence"]) + for i, layer in enumerate(model.layers): + layer_results["layers"][layer] = logRegClassificationEvaluator( + train_embeds[:, i], + ds["train"]["Label"], + test_embeds[:, i], + ds["test"]["Label"], + )() + logger.info( + f"Layer: {layer}, {metadata.display_name} results: {layer_results['layers'][layer]}" + ) + return TaskResult.from_dict(metadata, layer_results, model.metadata) + + +class EnzymeCommissionClassification(Task): + metadata = TaskMetadata( + id="ec_classification", + display_name="EC Classification", + description="Evaluate on Enzyme Commission number classification task.", + type="classification", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/ec_classification", + revision="main", + ) + ], + primary_metric_id="f1", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_classification_task(model, self.metadata) + + +class EnzymeCommissionDNAClassification(Task): + metadata = TaskMetadata( + id="ec_dna_classification", + display_name="EC Classification", + description="Evaluate on Enzyme Commission number classification task using DNA sequences.", + type="classification", + modality=Modality.DNA, + datasets=[ + Dataset( + path="tattabio/ec_classification_dna", + revision="main", + ) + ], + primary_metric_id="f1", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_classification_task(model, self.metadata) + + +class ConvergentEnzymesClassification(Task): + metadata = TaskMetadata( + id="convergent_enzymes_classification", + display_name="Convergent Enzymes Classification", + description="Evaluate on convergent enzymes classification task, where convergent enzymes are proteins with the same EC number but without blastp hits against each other", + type="classification", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/convergent_enzymes", + revision="main", + ) + ], + primary_metric_id="f1", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_classification_task(model, self.metadata) + + +def run_mibig_task(model: BioSeqTransformer, metadata: TaskMetadata) -> TaskResult: + """ + Evaluate on MIBIG classification tasks. Multiclass, multi-label KNN classification is used for evaluation. + """ + ds = metadata.datasets[0].load() + if metadata.modality == Modality.DNA: + # MIBiG DNA sequences can be very long. Instead of truncating to max_seq_length, + # split into multiple sequences and mean pool the resulting embeddings. + ds = split_sequences(ds, model.max_seq_length) + + layer_results = defaultdict(dict) + train_embeds = model.encode(ds["train"]["Sequence"]) + test_embeds = model.encode(ds["test"]["Sequence"]) + + train_ids = ds["train"]["Entry"] + test_ids = ds["test"]["Entry"] + train_labels = ds["train"]["class"] + test_labels = ds["test"]["class"] + train_id_to_label = {id: label for id, label in zip(train_ids, train_labels)} + test_id_to_label = {id: label for id, label in zip(test_ids, test_labels)} + # Mean pool embeds with the same ID. + train_ids, train_embeds = merge_split_elem_embeds(train_ids, train_embeds) + test_ids, test_embeds = merge_split_elem_embeds(test_ids, test_embeds) + # Gather the labels after merging by unique ID. + train_labels = np.array([train_id_to_label[id] for id in train_ids]) + test_labels = np.array([test_id_to_label[id] for id in test_ids]) + + for i, layer in enumerate(model.layers): + evaluator = MultiClassMultiOutputKNNClassificationEvaluator( + train_embeds[:, i], train_labels, test_embeds[:, i], test_labels + ) + layer_results["layers"][layer] = evaluator() + logger.info( + f"Layer: {layer}, MIBiG classification results: {layer_results['layers'][layer]}" + ) + return TaskResult.from_dict(metadata, layer_results, model.metadata) + + +class MIBiGProteinClassification(Task): + metadata = TaskMetadata( + id="MIBIG_protein_classification", + display_name="MIBiG Classification", + description="Biosynthetic Gene cluster classification using protein sequences on MIBIG dataset.", + type="classification", + modality=Modality.PROTEIN, + datasets=[Dataset(path="tattabio/mibig_classification_prot", revision="main")], + primary_metric_id="f1", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_mibig_task(model, self.metadata) + + +class MIBiGDNAClassification(Task): + metadata = TaskMetadata( + id="MIBIG_dna_classification", + display_name="MIBiG Classification", + description="Biosynthetic Gene cluster classification using DNA sequences on MIBIG dataset.", + type="classification", + modality=Modality.DNA, + datasets=[ + Dataset( + path="tattabio/mibig_classification_dna", + revision="main", + ) + ], + primary_metric_id="f1", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_mibig_task(model, self.metadata) diff --git a/geb/tasks/clustering_tasks.py b/geb/tasks/clustering_tasks.py new file mode 100644 index 0000000..c12ddad --- /dev/null +++ b/geb/tasks/clustering_tasks.py @@ -0,0 +1,70 @@ +""" +Biological sequences are clustered and performance is determined by how well clustering matches assigned labels. +""" + +import logging +from collections import defaultdict + +from geb.evaluators import ClusteringEvaluator +from geb.modality import Modality +from geb.models import BioSeqTransformer +from geb.tasks.tasks import Dataset, Task, TaskMetadata, TaskResult + +logger = logging.getLogger(__name__) + + +def run_clustering_task(model: BioSeqTransformer, metadata: TaskMetadata) -> TaskResult: + """Evaluate clustering task. Utilizes the ClusteringEvaluator.""" + if len(metadata.datasets) != 1: + raise ValueError("Clustering tasks require 1 dataset.") + ds = metadata.datasets[0].load()["train"] + embeds = model.encode(ds["Sequence"]) + layer_results = defaultdict(dict) + for i, layer in enumerate(model.layers): + labels = ds["Label"] + evaluator = ClusteringEvaluator(embeds[:, i], labels) + layer_results["layers"][layer] = evaluator() + logger.info( + f"Layer: {layer}, {metadata.display_name} results: {layer_results['layers'][layer]}" + ) + return TaskResult.from_dict(metadata, layer_results, model.metadata) + + +class RNAclustering(Task): + metadata = TaskMetadata( + id="ecoli_rna_clustering", + display_name="E.coli RNA Clustering", + description="Evaluate on RNA clustering task for sRNA/tRNA/rRNA segments in E.coli K-12.", + type="clustering", + modality=Modality.DNA, + datasets=[ + Dataset( + path="tattabio/e_coli_rnas", + revision="main", + ) + ], + primary_metric_id="v_measure", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_clustering_task(model, self.metadata) + + +class MopBClustering(Task): + metadata = TaskMetadata( + id="mopb_clustering", + display_name="MopB Clustering", + description="Evaluate on MopB clustering task.", + type="clustering", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/mopb_clustering", + revision="main", + ) + ], + primary_metric_id="v_measure", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_clustering_task(model, self.metadata) diff --git a/geb/tasks/eds_tasks.py b/geb/tasks/eds_tasks.py new file mode 100644 index 0000000..849bed9 --- /dev/null +++ b/geb/tasks/eds_tasks.py @@ -0,0 +1,198 @@ +""" +Evolutionary Distance Similarity (EDS) tasks compare embedding distances to continuous evolutionary distances. +The label distances are typically derived from phylogenetic trees. +""" + +import logging +from collections import defaultdict + +import numpy as np +import pandas as pd + +from geb.evaluators import EDSEvaluator +from geb.modality import Modality +from geb.models import BioSeqTransformer +from geb.tasks.tasks import Dataset, Task, TaskMetadata, TaskResult + +logger = logging.getLogger(__name__) + + +def run_eds_task(model: BioSeqTransformer, metadata: TaskMetadata) -> TaskResult: + """Evaluate phylogeny distance correlation task. Utilizes the Evolutionary Distance Similarity (EDS) evaluator.""" + if len(metadata.datasets) != 2: + raise ValueError("Phylogeny tasks require 2 datasets: sequences and distances.") + + ds = metadata.datasets[0].load()["train"] + distance_df = metadata.datasets[1].load()["train"].to_pandas() + assert isinstance( + distance_df, pd.DataFrame + ), f"Expected DataFrame, got {type(distance_df)}" + + id_index_dict = {k: i for i, k in enumerate(ds["Entry"])} + distance_df["embeds1"] = None + distance_df["embeds2"] = None + test_embeds = model.encode(ds["Sequence"]) + layer_results = defaultdict(dict) + for i, layer in enumerate(model.layers): + for row_idx, row in distance_df.iterrows(): + id1 = row["ID1"] + id2 = row["ID2"] + embedding1 = test_embeds[id_index_dict[id1], i] + embedding2 = test_embeds[id_index_dict[id2], i] + distance_df.at[row_idx, "embeds1"] = embedding1 + distance_df.at[row_idx, "embeds2"] = embedding2 + embeds1 = np.array(distance_df["embeds1"].tolist()) + embeds2 = np.array(distance_df["embeds2"].tolist()) + dists = np.array(distance_df["distance"].tolist()) + evaluator = EDSEvaluator(embeds1, embeds2, dists) + layer_results["layers"][layer] = evaluator() + # log results + logger.info( + f"Layer: {layer}, {metadata.display_name} distance correlation results: {layer_results['layers'][layer]}" + ) + + return TaskResult.from_dict(metadata, layer_results, model.metadata) + + +class RpobBacPhylogeny(Task): + metadata = TaskMetadata( + id="rpob_bac_phylogeny", + display_name="RpoB Bacterial Phylogeny", + description="Evaluate on RpoB phylogeny distance correlation task for Bacterial sequences.", + type="eds", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/rpob_bac_phylogeny_sequences", + revision="main", + ), + Dataset( + path="tattabio/rpob_bac_phylogeny_distances", + revision="main", + ), + ], + primary_metric_id="top_corr", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_eds_task(model, self.metadata) + + +class RpobArchPhylogeny(Task): + metadata = TaskMetadata( + id="rpob_arch_phylogeny", + display_name="RpoB Archaeal Phylogeny", + description="Evaluate on RpoB phylogeny distance correlation task for Archaeal sequences.", + type="eds", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/rpob_arch_phylogeny_sequences", + revision="main", + ), + Dataset( + path="tattabio/rpob_arch_phylogeny_distances", + revision="main", + ), + ], + primary_metric_id="top_corr", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_eds_task(model, self.metadata) + + +class FeFePhylogeny(Task): + metadata = TaskMetadata( + id="fefe_phylogeny", + display_name="FeFeHydrogenase Phylogeny", + description="Evaluate on FeFeHydrogenase phylogeny distance correlation task.", + type="eds", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/fefe_phylogeny_sequences", + revision="main", + ), + Dataset( + path="tattabio/fefe_phylogeny_distances", + revision="main", + ), + ], + primary_metric_id="top_corr", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_eds_task(model, self.metadata) + + +class Bac16SPhylogeny(Task): + metadata = TaskMetadata( + id="bac_16S_phylogeny", + display_name="16S Bacterial Phylogeny", + description="Evaluate on 16S Bacterial phylogeny distance correlation task.", + type="eds", + modality=Modality.DNA, + datasets=[ + Dataset( + path="tattabio/bac_16S_sequences", + revision="main", + ), + Dataset( + path="tattabio/bac_16S_distances", + revision="main", + ), + ], + primary_metric_id="top_corr", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_eds_task(model, self.metadata) + + +class Arch16SPhylogeny(Task): + metadata = TaskMetadata( + id="arch_16S_phylogeny", + display_name="16S Archaeal Phylogeny", + description="Evaluate on 16S Archaeal phylogeny distance correlation task.", + type="eds", + modality=Modality.DNA, + datasets=[ + Dataset( + path="tattabio/arch_16S_sequences", + revision="main", + ), + Dataset( + path="tattabio/arch_16S_distances", + revision="main", + ), + ], + primary_metric_id="top_corr", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_eds_task(model, self.metadata) + + +class Euk18SPhylogeny(Task): + metadata = TaskMetadata( + id="euk_18S_phylogeny", + display_name="18S Eukaryotic Phylogeny", + description="Evaluate on 18S Eukaryotic phylogeny distance correlation task.", + type="eds", + modality=Modality.DNA, + datasets=[ + Dataset( + path="tattabio/euk_18S_sequences", + revision="main", + ), + Dataset( + path="tattabio/euk_18S_distances", + revision="main", + ), + ], + primary_metric_id="top_corr", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_eds_task(model, self.metadata) diff --git a/geb/tasks/pair_classification_tasks.py b/geb/tasks/pair_classification_tasks.py new file mode 100644 index 0000000..316b201 --- /dev/null +++ b/geb/tasks/pair_classification_tasks.py @@ -0,0 +1,96 @@ +""" +Pair classification tasks evaluating distances between functionally relevant gene pairs. +For instance, distance thresholds distinguish between co-transcribed and non-co-transcribed gene pairs. +""" + +import logging +from collections import defaultdict + +from geb.evaluators import PairClassificationEvaluator +from geb.modality import Modality +from geb.models import BioSeqTransformer +from geb.tasks.tasks import Dataset, Task, TaskMetadata, TaskResult + +from ..eval_utils import paired_dataset + +logger = logging.getLogger(__name__) + + +def run_pair_classification_task( + model: BioSeqTransformer, metadata: TaskMetadata +) -> TaskResult: + """Evaluate pair classification task. Utilizes the PairClassificationEvaluator.""" + if len(metadata.datasets) != 1: + raise ValueError("Pair classification tasks require 1 dataset.") + ds = metadata.datasets[0].load()["train"] + embeds = model.encode(ds["Sequence"]) + layer_results = defaultdict(dict) + for i, layer in enumerate(model.layers): + labels = ds["Label"] + embeds1, embeds2, labels = paired_dataset(labels, embeds[:, i]) + evaluator = PairClassificationEvaluator(embeds1, embeds2, labels) + layer_results["layers"][layer] = evaluator() + logger.info( + f"Layer: {layer}, {metadata.display_name} classification results: {layer_results['layers'][layer]}" + ) + return TaskResult.from_dict(metadata, layer_results, model.metadata) + + +class EcoliOperon(Task): + metadata = TaskMetadata( + id="ecoli_operonic_pair", + display_name="E.coli Operonic Pair", + description="Evaluate on E.coli K-12 operonic pair classification task.", + type="pair_classification", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/ecoli_operonic_pair", + revision="main", + ) + ], + primary_metric_id="top_ap", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_pair_classification_task(model, self.metadata) + + +class CyanoOperonPair(Task): + metadata = TaskMetadata( + id="cyano_operonic_pair", + display_name="Cyano Operonic Pair", + description="Evaluate on Cyano operonic pair classification task.", + type="pair_classification", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/cyano_operonic_pair", + revision="main", + ) + ], + primary_metric_id="top_ap", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_pair_classification_task(model, self.metadata) + + +class VibrioOperonPair(Task): + metadata = TaskMetadata( + id="vibrio_operonic_pair", + display_name="Vibrio Operonic Pair", + description="Evaluate on Vibrio operonic pair classification task.", + type="pair_classification", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/vibrio_operonic_pair", + revision="main", + ) + ], + primary_metric_id="top_ap", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_pair_classification_task(model, self.metadata) diff --git a/geb/tasks/retrieval_tasks.py b/geb/tasks/retrieval_tasks.py new file mode 100644 index 0000000..132754e --- /dev/null +++ b/geb/tasks/retrieval_tasks.py @@ -0,0 +1,98 @@ +""" +Retrieval tasks find functionally relevant genes in a corpus of genes based on a query gene. +Typically corpus is derived from a different phylogenetic group than the query genes. +""" + +import logging +from collections import defaultdict + +from geb.evaluators import RetrievalEvaluator +from geb.modality import Modality +from geb.models import BioSeqTransformer +from geb.tasks.tasks import Dataset, Task, TaskMetadata, TaskResult + +logger = logging.getLogger(__name__) + + +def run_retrieval_task(model: BioSeqTransformer, metadata: TaskMetadata) -> TaskResult: + """Evaluate retrieval task. Utilizes the Retrieval evaluator.""" + if len(metadata.datasets) != 2: + raise ValueError("Retrieval tasks require 3 datasets: corpus, query and qrels.") + corpus_ds = metadata.datasets[0].load()["train"] + query_ds = metadata.datasets[0].load()["test"] + qrels = metadata.datasets[1].load() + corpus_embeds = model.encode(corpus_ds["Sequence"]) + query_embeds = model.encode(query_ds["Sequence"]) + qrels_dict = defaultdict(dict) + + def qrels_dict_init(row): + qrels_dict[str(row["query_id"])][str(row["corpus_id"])] = int(row["fuzz_ratio"]) + + # Populate `qrels_dict` from the dataset. + # See https://github.com/cvangysel/pytrec_eval for qrels format. + qrels.map(qrels_dict_init) + qrels = qrels_dict + layer_results = defaultdict(dict) + for i, layer in enumerate(model.layers): + evaluator = RetrievalEvaluator( + corpus_embeds[:, i], + query_embeds[:, i], + corpus_ds["Entry"], + query_ds["Entry"], + qrels, + ) + layer_results["layers"][layer] = evaluator() + logger.info( + f"Layer: {layer}, Retrieval results: {layer_results['layers'][layer]}" + ) + return TaskResult.from_dict(metadata, layer_results, model.metadata) + + +class ArchRetrieval(Task): + metadata = TaskMetadata( + id="arch_retrieval", + display_name="Arch Retrieval", + description="Retrieves bacterial proteins with similar swissprot annotations to a query archaeal protein", + type="retrieval", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/arch_retrieval", + revision="main", + ), + Dataset( + path="tattabio/arch_retrieval_qrels", + description="Relevance between query and corpus proteins", + revision="main", + ), + ], + primary_metric_id="map_at_5", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_retrieval_task(model, self.metadata) + + +class EukRetrieval(Task): + metadata = TaskMetadata( + id="euk_retrieval", + display_name="Euk Retrieval", + description="Retrieves bacterial proteins with similar swissprot annotations to a query eukaryotic protein", + type="retrieval", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="tattabio/euk_retrieval", + revision="main", + ), + Dataset( + path="tattabio/euk_retrieval_qrels", + description="Relevance between query and corpus proteins", + revision="main", + ), + ], + primary_metric_id="map_at_5", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return run_retrieval_task(model, self.metadata) diff --git a/geb/tasks/tasks.py b/geb/tasks/tasks.py new file mode 100644 index 0000000..6f7dc76 --- /dev/null +++ b/geb/tasks/tasks.py @@ -0,0 +1,136 @@ +"""Task functions for evaluation. +# TODO: Add dataset revisions. +""" + +import logging +from abc import ABC, abstractmethod +from typing import Any, Dict, List, Literal, Optional + +import datasets +from pydantic import BaseModel, model_validator + +from ..modality import Modality +from ..models import BioSeqTransformer + +logging.basicConfig(level=logging.INFO) + +TaskType = Literal[ + "classification", + "pair_classification", + "clustering", + "eds", + "bigene_mining", + "retrieval", +] + + +class TaskMetric(BaseModel): + id: str + display_name: str + description: Optional[str] = None + value: float = 0.0 + + +class LayerResult(BaseModel): + layer_number: int + layer_display_name: str + metrics: List[TaskMetric] + + +class TaskResult(BaseModel): + task: "TaskMetadata" + # TODO: Convert model to ModelMetadata + model: Dict[str, Any] + results: List[LayerResult] + + @model_validator(mode="after") + def check_valid_primary_metric(self): + for result in self.results: + if all( + metric.id != self.task.primary_metric_id for metric in result.metrics + ): + raise ValueError( + f"Primary metric {self.task.primary_metric_id} not found in results.metrics" + ) + return self + + @staticmethod + def from_dict( + task_metadata: "TaskMetadata", + layer_results: Dict[str, Any], + model_metadata: Dict[str, Any], + ): + return TaskResult( + task=task_metadata, + model=model_metadata, + results=list( + LayerResult( + layer_number=int(layer), + layer_display_name=str(layer), + metrics=[ + TaskMetric(id=metric, display_name=metric, value=value) + for metric, value in metrics.items() + ], + ) + for layer, metrics in layer_results["layers"].items() + ), + ) + + +class Dataset(BaseModel): + path: str + revision: str + + def load(self) -> datasets.DatasetDict: + ds = datasets.load_dataset(self.path, revision=self.revision) + if not isinstance(ds, datasets.DatasetDict): + raise ValueError( + f"Dataset {self.path} is not a datasets.DatasetDict object." + ) + return ds + + +class TaskMetadata(BaseModel): + id: str + display_name: str + description: str + modality: Modality + type: TaskType + # List of datasets used by the task. + # Each dataset is a dict of all arguments to pass to `datasets.load_dataset()`. + datasets: List[Dataset] + primary_metric_id: str + + +class Task(ABC): + metadata: TaskMetadata + + @abstractmethod + def run( + self, model: BioSeqTransformer, layers: Optional[List[int]] = None + ) -> TaskResult: + pass + + +class noop(Task): + metadata = TaskMetadata( + id="noop", + display_name="NoOp Task", + description="This task is used for testing and does nothing.", + type="classification", + modality=Modality.PROTEIN, + datasets=[ + Dataset( + path="", + revision="main", + ) + ], + primary_metric_id="f1", + ) + + def run(self, model: BioSeqTransformer) -> TaskResult: + return TaskResult.from_dict( + self.metadata, + {"layers": {32: {"accuracy": 0.5, "f1": 0.5}}}, + model.metadata, + ) diff --git a/plot_benchmarks.py b/plot_benchmarks.py new file mode 100644 index 0000000..1d75ceb --- /dev/null +++ b/plot_benchmarks.py @@ -0,0 +1,152 @@ +""" +Given a directory of results, plot the benchmarks for each task as a bar chart and line chart. +""" + +import argparse +import os +from typing import Optional + +import matplotlib.pyplot as plt +import pandas as pd +import seaborn as sns + +from geb.geb import get_all_tasks, get_output_folder, get_tasks_by_name +from geb.tasks.tasks import TaskResult + +ALL_TASKS = [task.metadata.id for task in get_all_tasks()] + + +def plot_benchmarks( + results_dir, + task_ids: Optional[list[str]] = None, + output="benchmarks.png", + model_substring=None, +): + models = os.listdir(results_dir) + all_results = [] + tasks = get_all_tasks() if task_ids is None else get_tasks_by_name(task_ids) + for model_name in models: + if model_substring is not None and all( + substr not in model_name for substr in model_substring + ): + continue + + for task in tasks: + if task.metadata.display_name == "NoOp Task": + continue + filepath = get_output_folder(model_name, task, results_dir, create=False) + # if the file does not exist, skip + if not os.path.exists(filepath): + continue + + with open(filepath) as f: + task_result = TaskResult.model_validate_json(f.read()) + num_params = task_result.model["num_params"] + primary_metric_id = task_result.task.primary_metric_id + main_scores = [ + metric.value + for layer_result in task_result.results + for metric in layer_result.metrics + if metric.id == primary_metric_id + ] + best_score = max(main_scores) + all_results.append( + { + "task": task.metadata.display_name, + "model": model_name, + "num_params": num_params, + "score": best_score, + } + ) + + results_df = pd.DataFrame(all_results) + # order the models by ascending number of parameters + results_df["num_params"] = results_df["num_params"].astype(int) + results_df = results_df.sort_values(by="num_params") + # number of tasks + n_tasks = len(set(results_df["task"])) + + _, ax = plt.subplots(2, n_tasks, figsize=(5 * n_tasks, 10)) + + for i, task in enumerate(set(results_df["task"])): + if n_tasks > 1: + sns.barplot( + x="model", + y="score", + data=results_df[results_df["task"] == task], + ax=ax[0][i], + ) + ax[0][i].set_title(task) + # rotate the x axis labels + + for tick in ax[0][i].get_xticklabels(): + tick.set_rotation(90) + else: + sns.barplot( + x="model", + y="score", + data=results_df[results_df["task"] == task], + ax=ax[0], + ) + ax[0].set_title(task) + # rotate the x axis labels + for tick in ax[0].get_xticklabels(): + tick.set_rotation(90) + + # make a line graph with number of parameters on x axis for each task in the second row of figures + for i, task in enumerate(set(results_df["task"])): + if n_tasks > 1: + sns.lineplot( + x="num_params", + y="score", + data=results_df[results_df["task"] == task], + ax=ax[1][i], + ) + ax[1][i].set_title(task) + ax[1][i].set_xlabel("Number of parameters") + else: + sns.lineplot( + x="num_params", + y="score", + data=results_df[results_df["task"] == task], + ax=ax[1], + ) + ax[1].set_title(task) + ax[1].set_xlabel("Number of parameters") + + plt.tight_layout() + plt.savefig(output) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "-d", + "--results_dir", + type=str, + default="results", + help="Directory containing the results of the benchmarking", + ) + parser.add_argument( + "-t", + "--tasks", + type=lambda s: [item for item in s.split(",")], + default=None, + help=f"Comma separated list of tasks to plot. Choose from {ALL_TASKS} or do not specify to plot all tasks. ", + ) + parser.add_argument( + "-o", + "--output", + type=str, + default="benchmarks.png", + help="Output file for the plot", + ) + parser.add_argument( + "--model_substring", + type=lambda s: [item for item in s.split(",")], + default=None, + help="Comma separated list of model substrings. Only plot results for models containing this substring", + ) + args = parser.parse_args() + + plot_benchmarks(args.results_dir, args.tasks, args.output, args.model_substring) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..400d65f --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,113 @@ +[build-system] +requires = ["setuptools>=42", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "geb" +version = "0.0.1" +description = "Genomic Embedding Benchmark" +readme = "README.md" +license = { file = "LICENSE" } +keywords = ["scientific software", "genomic embeddings", "machine learning", "benchmark"] +classifiers = [ + "Development Status :: 2 - Pre-Alpha", + "Environment :: Console", + "Intended Audience :: Developers", + "Intended Audience :: Information Technology", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: Apache Software License", + "Operating System :: OS Independent", + "Programming Language :: Python", +] +dependencies = [ + "datasets>=2.20.0", + "matplotlib>=3.9.0", + "numpy>=2.0.0", + "pandas>=2.2.2", + "pydantic>=2.7.4", + "pytrec_eval>=0.5", + "rich>=13.7.1", + "scikit_learn>=1.5.0", + "scipy>=1.13.1", + "seaborn>=0.13.2", + "torch>=2.3.1", + "tqdm>=4.66.4", + "transformers>=4.41.2" +] + +[project.urls] +homepage = "https://github.com/TattaBio/GEB" +"Huggingface Organization" = "https://huggingface.co/tattabio" +"Source Code" = "https://github.com/TattaBio/GEB" + +[project.optional-dependencies] +dev = ["ruff>=0.0.254", "pytest", "pytest-xdist"] + +[tool.setuptools.packages.find] +exclude = ["tests", "results"] + +[tool.setuptools.package-data] +"*" = ["*.json"] + +[tool.ruff] +target-version = "py38" +exclude = [ + ".venv", + "build/" +] +line-length = 88 +indent-width = 4 + +[tool.semantic_release] +version_toml = ["pyproject.toml:project.version"] +build_command = "python -m pip install build; python -m build" +commit_message = "{version}\n\nAutomatically generated by python-semantic-release" +logging_use_named_masks = false +major_on_zero = true +allow_zero_version = true +no_git_verify = false +tag_format = "v{version}" + +[tool.semantic_release.branches.main] +match = "(main|master)" +prerelease_token = "rc" +prerelease = false + +[tool.semantic_release.changelog] +template_dir = "templates" +changelog_file = "CHANGELOG.md" +exclude_commit_patterns = [] + +[tool.semantic_release.changelog.environment] +block_start_string = "{%" +block_end_string = "%}" +variable_start_string = "{{" +variable_end_string = "}}" +comment_start_string = "{#" +comment_end_string = "#}" +trim_blocks = false +lstrip_blocks = false +newline_sequence = "\n" +keep_trailing_newline = false +extensions = [] +autoescape = true + +[tool.semantic_release.commit_author] +env = "GIT_COMMIT_AUTHOR" +default = "semantic-release " + +[tool.semantic_release.commit_parser_options] +allowed_tags = ["build", "chore", "ci", "docs", "feat", "fix", "perf", "style", "refactor", "test"] +minor_tags = ["feat"] +patch_tags = ["fix", "perf"] +default_bump_level = 0 + +[tool.semantic_release.remote] +name = "origin" +type = "github" +ignore_token_for_push = false +insecure = false + +[tool.semantic_release.publish] +dist_glob_patterns = ["dist/*"] +upload_to_vcs_release = true diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..6bf7651 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,13 @@ +datasets>=2.20.0 +matplotlib>=3.9.0 +numpy>=2.0.0 +pandas>=2.2.2 +pydantic>=2.7.4 +pytrec_eval>=0.5 +rich>=13.7.1 +scikit_learn>=1.5.0 +scipy>=1.13.1 +seaborn>=0.13.2 +torch>=2.3.1 +tqdm>=4.66.4 +transformers>=4.41.2 diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 0000000..5ff69db --- /dev/null +++ b/ruff.toml @@ -0,0 +1,8 @@ +exclude = [ + ".venv", + "build/", +] +# Same as Black. +line-length = 88 +indent-width = 4 + diff --git a/run_geb.py b/run_geb.py new file mode 100644 index 0000000..ffd7767 --- /dev/null +++ b/run_geb.py @@ -0,0 +1,135 @@ +""" +Main command to run genomic embedding benchmarks (GEB) on a model. +example command to run GEB: +python run_geb.py -m facebook/esm2_t6_8M_UR50D +""" + +import argparse +import logging +import os +import geb + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +ALL_TASK_NAMES = geb.get_all_task_names() +ALL_MODEL_NAMES = geb.get_all_model_names() + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument( + "-m", + "--model", + type=str, + default=None, + help=f"Model to evaluate. Choose from {ALL_MODEL_NAMES}", + ) + parser.add_argument( + "-t", + "--tasks", + type=lambda s: [item for item in s.split(",")], + default=None, + help=f"Comma separated tasks to evaluate on. Choose from {ALL_TASK_NAMES} or do not specify to evaluate on all tasks", + ) + parser.add_argument( + "-l", + "--layers", + type=str, + default=None, + help="Layer to evaluate. Comma separated list of integers or 'mid' and 'last'. Default is 'mid,last'", + ) + parser.add_argument( + "--devices", + type=str, + default="0", + help="Comma separated list of GPU device ids to use. Default is 0 (if GPUs are detected).", + ) + parser.add_argument( + "--output_folder", + type=str, + default=None, + help="Output directory for results. Will default to results/model_name if not set.", + ) + parser.add_argument( + "-v", "--verbosity", type=int, default=2, help="Verbosity level" + ) + parser.add_argument( + "-b", "--batch_size", type=int, default=64, help="Batch size for evaluation" + ) + parser.add_argument( + "--max_seq_len", + type=int, + default=1024, + help="Maximum sequence length for model, default is 1024.", + ) + parser.add_argument( + "--pool_type", + type=str, + default="mean", + help="Pooling type for model, choose from mean, max, cls, last. Default is mean.", + ) + + args = parser.parse_args() + + # set logging based on verbosity level + if args.verbosity == 0: + logging.getLogger("geb").setLevel(logging.CRITICAL) + elif args.verbosity == 1: + logging.getLogger("geb").setLevel(logging.WARNING) + elif args.verbosity == 2: + logging.getLogger("geb").setLevel(logging.INFO) + elif args.verbosity == 3: + logging.getLogger("geb").setLevel(logging.DEBUG) + + if args.model is None: + raise ValueError("Please specify a model using the -m or --model argument") + + # make sure that devices are comma separated list of integers + try: + devices = [int(device) for device in args.devices.split(",")] + except ValueError: + raise ValueError("Devices must be comma separated list of integers") + + layers = args.layers + if layers: + if layers not in ["mid", "last"]: + # Layers should be list of integers. + try: + layers = [int(layer) for layer in layers.split(",")] + except ValueError: + raise ValueError("Layers must be a list of integers.") + + model_name = args.model.split("/")[-1] + output_folder = args.output_folder + if output_folder is None: + output_folder = os.path.join("results", model_name) + # create output folder if it does not exist + if not os.path.exists(output_folder): + os.makedirs(output_folder) + logger.info(f"Results will be saved to {output_folder}") + + # Load the model by name. + model = geb.get_model( + model_name=args.model, + layers=layers, + devices=devices, + max_seq_length=args.max_seq_len, + batch_size=args.batch_size, + pool_type=args.pool_type, + ) + + all_tasks_for_modality = geb.get_tasks_by_modality(model.modality) + + if args.tasks: + task_list = geb.get_tasks_by_name(args.tasks) + if not all([task.metadata.modality == model.modality for task in task_list]): + raise ValueError(f"Tasks must be one of {all_tasks_for_modality}") + else: + task_list = all_tasks_for_modality + evaluation = geb.GEB(tasks=task_list) + _ = evaluation.run(model) + + +if __name__ == "__main__": + main()