lhallee commited on
Commit
91ec3df
·
verified ·
1 Parent(s): 996dc22

Update FastPLMs files

Browse files
Files changed (4) hide show
  1. README.md +54 -12
  2. fastplms/models.toml +8 -8
  3. fastplms_bundle.py +0 -0
  4. modeling_fastplms.py +10 -5
README.md CHANGED
@@ -14,15 +14,16 @@ This checkpoint contains the FastPLMs `ESMC` implementation.
14
 
15
  Accepted inputs are amino-acid sequences tokenized to residue IDs.
16
  Supported Transformers entry points are `AutoConfig`, `AutoModel`,
17
- `AutoModelForMaskedLM`.
 
18
 
19
  ## Capabilities
20
 
21
  | Feature | Status |
22
  | --- | --- |
23
- | Sequence classification | Unavailable: no advertised AutoClass |
24
- | Token classification | Unavailable: no advertised AutoClass |
25
- | PEFT fine-tuning | Supported pattern: attach LoRA to the pretrained model |
26
  | Embeddings | Supported: shared ordered embedding API |
27
  | Test-time training | Supported: low-rank masked-residue adaptation |
28
  | Attention variants | Special: SDPA fidelity path; alternate backends have explicit bands |
@@ -122,6 +123,45 @@ Set `output` and `format="safetensors"` or `"sqlite"` for transactional,
122
  bounded-memory storage. Resume checks input order, model state, tokenizer
123
  policy, backend, dtype, and pooling configuration before it appends data.
124
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
  ## PEFT fine-tuning
126
 
127
  Install the training dependencies. Then attach LoRA to the loaded checkpoint:
@@ -131,20 +171,22 @@ python -m pip install "datasets>=4.8,<5" "peft>=0.19,<0.20"
131
  ```
132
 
133
  ```python
134
- from peft import LoraConfig, get_peft_model
135
 
136
  peft_model = get_peft_model(
137
- model,
138
  LoraConfig(
 
139
  r=8,
140
  lora_alpha=16,
141
  target_modules="all-linear",
 
142
  ),
143
  )
144
  ```
145
 
146
- This checkpoint has no advertised classifier. Supply the task objective and
147
- preserve any new head through `modules_to_save`.
148
  All FastPLMs checkpoints follow the Transformers `PreTrainedModel` contract and
149
  can use PEFT. The ESM2-specific shipped CLI is an example, not a
150
  support boundary. Record the target modules, base revision, data identity, and
@@ -269,8 +311,8 @@ and
269
  ## Runtime contract
270
 
271
  - Public input: Amino-acid sequences tokenized to residue IDs
272
- - Advertised AutoClasses: `AutoConfig`, `AutoModel`, `AutoModelForMaskedLM`
273
- - AutoClass weight status: `AutoConfig` = `FastPLMs extension`, `AutoModel` = `pretrained`, `AutoModelForMaskedLM` = `pretrained`
274
  - Attention implementations: `eager`, `sdpa`, `flex_attention`, `flash_attention_2`, `flash_attention_3`
275
  - Precision policies: `default`, `fp8` (experimental)
276
  - BF16 execution: `static_parameters`
@@ -284,8 +326,8 @@ and
284
  ## Release record
285
 
286
  - FastPLMs weights: `Synthyra/ESMplusplus_large`
287
- - Runtime revision: recorded in the built artifact and published commit
288
- - Source-tree and runtime-bundle SHA-256: recorded in the source record
289
  - Official checkpoint: `biohub/ESMC-600M`
290
  - Artifact source: `fast`
291
  - State transform: `esmc_to_fastplms_v1`
 
14
 
15
  Accepted inputs are amino-acid sequences tokenized to residue IDs.
16
  Supported Transformers entry points are `AutoConfig`, `AutoModel`,
17
+ `AutoModelForMaskedLM`, `AutoModelForSequenceClassification`,
18
+ `AutoModelForTokenClassification`.
19
 
20
  ## Capabilities
21
 
22
  | Feature | Status |
23
  | --- | --- |
24
+ | Sequence classification | Supported: base weights with an untrained task head |
25
+ | Token classification | Supported: base weights with an untrained task head |
26
+ | PEFT fine-tuning | Supported pattern: preserve the separately trained `classifier` |
27
  | Embeddings | Supported: shared ordered embedding API |
28
  | Test-time training | Supported: low-rank masked-residue adaptation |
29
  | Attention variants | Special: SDPA fidelity path; alternate backends have explicit bands |
 
123
  bounded-memory storage. Resume checks input order, model state, tokenizer
124
  policy, backend, dtype, and pooling configuration before it appends data.
125
 
126
+ ## Downstream prediction
127
+
128
+ The sequence and token prediction AutoClasses use the checkpoint backbone and
129
+ create a new, untrained `classifier`. Sequence labels have shape `(b,)`.
130
+ Residue labels have shape `(b, l)` and use `-100` outside biological positions.
131
+
132
+ ```python
133
+ import torch
134
+ from transformers import AutoTokenizer
135
+ from transformers import (
136
+ AutoModelForSequenceClassification,
137
+ AutoModelForTokenClassification,
138
+ )
139
+
140
+ model_id = "Synthyra/ESMplusplus_large"
141
+ sequence_model = AutoModelForSequenceClassification.from_pretrained(
142
+ model_id, num_labels=2, trust_remote_code=True
143
+ ).eval()
144
+ token_model = AutoModelForTokenClassification.from_pretrained(
145
+ model_id, num_labels=3, trust_remote_code=True
146
+ ).eval()
147
+ tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
148
+ sequences = ["MSTNPKPQRKTKRNT", "MKTIIALSYIFCLVFA"]
149
+ batch = tokenizer(sequences, padding=True, return_tensors="pt")
150
+ biological = batch["attention_mask"].bool()
151
+ for special_id in tokenizer.all_special_ids:
152
+ biological &= batch["input_ids"].ne(special_id)
153
+
154
+ sequence_labels = torch.zeros(len(sequences), dtype=torch.long)
155
+ token_labels = torch.full_like(batch["input_ids"], -100)
156
+ token_labels[biological] = 0
157
+
158
+ with torch.inference_mode():
159
+ sequence_output = sequence_model(**batch, labels=sequence_labels)
160
+ token_output = token_model(**batch, labels=token_labels)
161
+ print(sequence_output.logits.shape) # (b, 2)
162
+ print(token_output.logits.shape) # (b, l, 3)
163
+ ```
164
+
165
  ## PEFT fine-tuning
166
 
167
  Install the training dependencies. Then attach LoRA to the loaded checkpoint:
 
171
  ```
172
 
173
  ```python
174
+ from peft import LoraConfig, TaskType, get_peft_model
175
 
176
  peft_model = get_peft_model(
177
+ sequence_model,
178
  LoraConfig(
179
+ task_type=TaskType.SEQ_CLS,
180
  r=8,
181
  lora_alpha=16,
182
  target_modules="all-linear",
183
+ modules_to_save=["classifier"],
184
  ),
185
  )
186
  ```
187
 
188
+ This checkpoint advertises a classification head. Save the separately trained
189
+ `classifier` with the adapter.
190
  All FastPLMs checkpoints follow the Transformers `PreTrainedModel` contract and
191
  can use PEFT. The ESM2-specific shipped CLI is an example, not a
192
  support boundary. Record the target modules, base revision, data identity, and
 
311
  ## Runtime contract
312
 
313
  - Public input: Amino-acid sequences tokenized to residue IDs
314
+ - Advertised AutoClasses: `AutoConfig`, `AutoModel`, `AutoModelForMaskedLM`, `AutoModelForSequenceClassification`, `AutoModelForTokenClassification`
315
+ - AutoClass weight status: `AutoConfig` = `FastPLMs extension`, `AutoModel` = `pretrained`, `AutoModelForMaskedLM` = `pretrained`, `AutoModelForSequenceClassification` = `base weights + untrained task head`, `AutoModelForTokenClassification` = `base weights + untrained task head`
316
  - Attention implementations: `eager`, `sdpa`, `flex_attention`, `flash_attention_2`, `flash_attention_3`
317
  - Precision policies: `default`, `fp8` (experimental)
318
  - BF16 execution: `static_parameters`
 
326
  ## Release record
327
 
328
  - FastPLMs weights: `Synthyra/ESMplusplus_large`
329
+ - Runtime revision: recorded separately in the built artifact and published commit
330
+ - Runtime source identities: recorded in `source-record.json`
331
  - Official checkpoint: `biohub/ESMC-600M`
332
  - Artifact source: `fast`
333
  - State transform: `esmc_to_fastplms_v1`
fastplms/models.toml CHANGED
@@ -199,7 +199,7 @@ representative = "esmc_small"
199
  documentation = "docs/models.md#esm-and-esmc"
200
  test_tiers = ["check", "compliance", "feature", "artifact", "benchmark"]
201
  runtime_paths = ["__init__.py", "registry.py", "runtime.py", "models.toml", "models/__init__.py", "attention", "embeddings", "models/esm_plusplus", "models/ttt.py"]
202
- auto_map = { AutoConfig = "fastplms.models.esm_plusplus.modeling_esm_plusplus.ESMplusplusConfig", AutoModel = "fastplms.models.esm_plusplus.modeling_esm_plusplus.ESMplusplusModel", AutoModelForMaskedLM = "fastplms.models.esm_plusplus.modeling_esm_plusplus.ESMplusplusForMaskedLM" }
203
 
204
  [families.esm3]
205
  architecture = "ESM3"
@@ -223,7 +223,7 @@ representative = "esm3_small"
223
  documentation = "docs/models.md#esm3"
224
  test_tiers = ["check", "compliance", "feature", "artifact", "benchmark"]
225
  runtime_paths = ["__init__.py", "registry.py", "runtime.py", "models.toml", "models/__init__.py", "attention", "embeddings", "models/esm3", "models/ttt.py"]
226
- auto_map = { AutoConfig = "fastplms.models.esm3.modeling_esm3.FastESM3Config", AutoModel = "fastplms.models.esm3.modeling_esm3.FastESM3Model" }
227
 
228
  [families.e1]
229
  architecture = "E1"
@@ -370,8 +370,8 @@ conversion_provenance = "Input: the pinned native Meta ESMFold checkpoint plus i
370
  representative = "esmfold"
371
  documentation = "docs/models.md#esmfold"
372
  test_tiers = ["check", "compliance", "structure", "feature", "artifact", "benchmark"]
373
- runtime_paths = ["__init__.py", "registry.py", "runtime.py", "models.toml", "models/__init__.py", "attention", "embeddings", "models/_esm_rotary.py", "models/esmfold"]
374
- auto_map = { AutoConfig = "fastplms.models.esmfold.modeling_fast_esmfold.FastEsmFoldConfig", AutoModel = "fastplms.models.esmfold.modeling_fast_esmfold.FastEsmForProteinFolding" }
375
 
376
  [families.esmfold2]
377
  architecture = "ESMFold2"
@@ -396,8 +396,8 @@ conversion_provenance = "Input: each pinned Biohub ESMFold2 checkpoint and its s
396
  representative = "esmfold2"
397
  documentation = "docs/esmfold2.md"
398
  test_tiers = ["check", "compliance", "structure", "feature", "artifact", "benchmark"]
399
- runtime_paths = ["__init__.py", "registry.py", "runtime.py", "models.toml", "models/__init__.py", "attention", "embeddings", "models/esmfold2", "models/esm_plusplus", "models/ttt.py"]
400
- auto_map = { AutoConfig = "fastplms.models.esmfold2.configuration_esmfold2.ESMFold2Config", AutoModel = "fastplms.models.esmfold2.modeling_esmfold2.ESMFold2Model" }
401
 
402
  [[models]]
403
  id = "esm2_8m"
@@ -1215,7 +1215,7 @@ official_files = [
1215
  "config.json=git-sha1:79ed0dc0f867b8f09bfa004d6f77397c2ab9b38d",
1216
  "model.safetensors=sha256:01358c317428d38535e3db513cab177336fc0f7fab0d84002e64b7741d5181b3",
1217
  ]
1218
- auto_map = { AutoConfig = "fastplms.models.esmfold2.configuration_esmfold2.ESMFold2Config", AutoModel = "fastplms.models.esmfold2.modeling_esmfold2_experimental.ESMFold2ExperimentalModel" }
1219
 
1220
  [[models]]
1221
  id = "esmfold2_experimental_fast_cutoff2025"
@@ -1236,4 +1236,4 @@ official_files = [
1236
  "config.json=git-sha1:0333d68ddb12ed2f066741dcb801142f466c0a2c",
1237
  "model.safetensors=sha256:4e903b740ad6ad704ec60881bfd593e0d6c874a630ffa0f0838276e0b665088f",
1238
  ]
1239
- auto_map = { AutoConfig = "fastplms.models.esmfold2.configuration_esmfold2.ESMFold2Config", AutoModel = "fastplms.models.esmfold2.modeling_esmfold2_experimental.ESMFold2ExperimentalModel" }
 
199
  documentation = "docs/models.md#esm-and-esmc"
200
  test_tiers = ["check", "compliance", "feature", "artifact", "benchmark"]
201
  runtime_paths = ["__init__.py", "registry.py", "runtime.py", "models.toml", "models/__init__.py", "attention", "embeddings", "models/esm_plusplus", "models/ttt.py"]
202
+ auto_map = { AutoConfig = "fastplms.models.esm_plusplus.modeling_esm_plusplus.ESMplusplusConfig", AutoModel = "fastplms.models.esm_plusplus.modeling_esm_plusplus.ESMplusplusModel", AutoModelForMaskedLM = "fastplms.models.esm_plusplus.modeling_esm_plusplus.ESMplusplusForMaskedLM", AutoModelForSequenceClassification = "fastplms.models.esm_plusplus.modeling_esm_plusplus.ESMplusplusForSequenceClassification", AutoModelForTokenClassification = "fastplms.models.esm_plusplus.modeling_esm_plusplus.ESMplusplusForTokenClassification" }
203
 
204
  [families.esm3]
205
  architecture = "ESM3"
 
223
  documentation = "docs/models.md#esm3"
224
  test_tiers = ["check", "compliance", "feature", "artifact", "benchmark"]
225
  runtime_paths = ["__init__.py", "registry.py", "runtime.py", "models.toml", "models/__init__.py", "attention", "embeddings", "models/esm3", "models/ttt.py"]
226
+ auto_map = { AutoConfig = "fastplms.models.esm3.modeling_esm3.FastESM3Config", AutoModel = "fastplms.models.esm3.modeling_esm3.FastESM3Model", AutoModelForSequenceClassification = "fastplms.models.esm3.modeling_esm3.FastESM3ForSequenceClassification", AutoModelForTokenClassification = "fastplms.models.esm3.modeling_esm3.FastESM3ForTokenClassification" }
227
 
228
  [families.e1]
229
  architecture = "E1"
 
370
  representative = "esmfold"
371
  documentation = "docs/models.md#esmfold"
372
  test_tiers = ["check", "compliance", "structure", "feature", "artifact", "benchmark"]
373
+ runtime_paths = ["__init__.py", "registry.py", "runtime.py", "models.toml", "models/__init__.py", "attention", "embeddings", "models/_esm_rotary.py", "models/classification_probe.py", "models/esmfold"]
374
+ auto_map = { AutoConfig = "fastplms.models.esmfold.modeling_fast_esmfold.FastEsmFoldConfig", AutoModel = "fastplms.models.esmfold.modeling_fast_esmfold.FastEsmForProteinFolding", AutoModelForSequenceClassification = "fastplms.models.esmfold.modeling_fast_esmfold.FastEsmForSequenceClassification", AutoModelForTokenClassification = "fastplms.models.esmfold.modeling_fast_esmfold.FastEsmForTokenClassification" }
375
 
376
  [families.esmfold2]
377
  architecture = "ESMFold2"
 
396
  representative = "esmfold2"
397
  documentation = "docs/esmfold2.md"
398
  test_tiers = ["check", "compliance", "structure", "feature", "artifact", "benchmark"]
399
+ runtime_paths = ["__init__.py", "registry.py", "runtime.py", "models.toml", "models/__init__.py", "attention", "embeddings", "models/classification_probe.py", "models/_esm_rotary.py", "models/esmfold2", "models/esm_plusplus", "models/ttt.py"]
400
+ auto_map = { AutoConfig = "fastplms.models.esmfold2.configuration_esmfold2.ESMFold2Config", AutoModel = "fastplms.models.esmfold2.modeling_esmfold2.ESMFold2Model", AutoModelForSequenceClassification = "fastplms.models.esmfold2.modeling_esmfold2_classification.ESMFold2ForSequenceClassification", AutoModelForTokenClassification = "fastplms.models.esmfold2.modeling_esmfold2_classification.ESMFold2ForTokenClassification" }
401
 
402
  [[models]]
403
  id = "esm2_8m"
 
1215
  "config.json=git-sha1:79ed0dc0f867b8f09bfa004d6f77397c2ab9b38d",
1216
  "model.safetensors=sha256:01358c317428d38535e3db513cab177336fc0f7fab0d84002e64b7741d5181b3",
1217
  ]
1218
+ auto_map = { AutoConfig = "fastplms.models.esmfold2.configuration_esmfold2.ESMFold2Config", AutoModel = "fastplms.models.esmfold2.modeling_esmfold2_experimental.ESMFold2ExperimentalModel", AutoModelForSequenceClassification = "fastplms.models.esmfold2.modeling_esmfold2_classification.ESMFold2ExperimentalForSequenceClassification", AutoModelForTokenClassification = "fastplms.models.esmfold2.modeling_esmfold2_classification.ESMFold2ExperimentalForTokenClassification" }
1219
 
1220
  [[models]]
1221
  id = "esmfold2_experimental_fast_cutoff2025"
 
1236
  "config.json=git-sha1:0333d68ddb12ed2f066741dcb801142f466c0a2c",
1237
  "model.safetensors=sha256:4e903b740ad6ad704ec60881bfd593e0d6c874a630ffa0f0838276e0b665088f",
1238
  ]
1239
+ auto_map = { AutoConfig = "fastplms.models.esmfold2.configuration_esmfold2.ESMFold2Config", AutoModel = "fastplms.models.esmfold2.modeling_esmfold2_experimental.ESMFold2ExperimentalModel", AutoModelForSequenceClassification = "fastplms.models.esmfold2.modeling_esmfold2_classification.ESMFold2ExperimentalForSequenceClassification", AutoModelForTokenClassification = "fastplms.models.esmfold2.modeling_esmfold2_classification.ESMFold2ExperimentalForTokenClassification" }
fastplms_bundle.py CHANGED
The diff for this file is too large to render. See raw diff
 
modeling_fastplms.py CHANGED
@@ -8,11 +8,12 @@ import sys
8
  import tempfile
9
  from io import BytesIO
10
  from pathlib import Path
 
11
  from zipfile import ZIP_DEFLATED, ZipFile
12
 
13
  from .fastplms_bundle import RUNTIME_DATA, RUNTIME_HASH
14
 
15
- if RUNTIME_HASH != "23133ece4b4c336a3e782b316afd5bcf7367b522de2827cb6153885c1ffe1e70":
16
  raise RuntimeError("FastPLMs runtime identity differs from the bridge.")
17
 
18
  _RUNTIME_TEMPORARIES = []
@@ -179,10 +180,14 @@ def _install_runtime():
179
  return package
180
 
181
  _install_runtime()
182
- _module_181 = _import_without_bytecode("fastplms.models.esm_plusplus.modeling_esm_plusplus")
183
- ESMplusplusConfig = _module_181.ESMplusplusConfig
184
  ESMplusplusConfig.__module__ = __name__
185
- ESMplusplusForMaskedLM = _module_181.ESMplusplusForMaskedLM
186
  ESMplusplusForMaskedLM.__module__ = __name__
187
- ESMplusplusModel = _module_181.ESMplusplusModel
 
 
 
 
188
  ESMplusplusModel.__module__ = __name__
 
8
  import tempfile
9
  from io import BytesIO
10
  from pathlib import Path
11
+ from typing import ClassVar
12
  from zipfile import ZIP_DEFLATED, ZipFile
13
 
14
  from .fastplms_bundle import RUNTIME_DATA, RUNTIME_HASH
15
 
16
+ if RUNTIME_HASH != "65b4cb38129822c36a448e295f77702ee64ca00fcfb9265b8c60f1c3ef169097":
17
  raise RuntimeError("FastPLMs runtime identity differs from the bridge.")
18
 
19
  _RUNTIME_TEMPORARIES = []
 
180
  return package
181
 
182
  _install_runtime()
183
+ _module_182 = _import_without_bytecode("fastplms.models.esm_plusplus.modeling_esm_plusplus")
184
+ ESMplusplusConfig = _module_182.ESMplusplusConfig
185
  ESMplusplusConfig.__module__ = __name__
186
+ ESMplusplusForMaskedLM = _module_182.ESMplusplusForMaskedLM
187
  ESMplusplusForMaskedLM.__module__ = __name__
188
+ ESMplusplusForSequenceClassification = _module_182.ESMplusplusForSequenceClassification
189
+ ESMplusplusForSequenceClassification.__module__ = __name__
190
+ ESMplusplusForTokenClassification = _module_182.ESMplusplusForTokenClassification
191
+ ESMplusplusForTokenClassification.__module__ = __name__
192
+ ESMplusplusModel = _module_182.ESMplusplusModel
193
  ESMplusplusModel.__module__ = __name__