Model reference · open weights
ESMFold2-Fast is an open-weight embedding model from Synthyra. ESMFold2-Fast (FP32) weighs 378 MB; the smallest configuration that runs it is RTX 3060 12 GB.
For self-hosting, compare this build's requirements below with the GPU you plan to rent.
Summary of the Synthyra/ESMFold2-Fast model card, 2026-10-01
What it is
| Released by | Synthyra |
|---|---|
| Released | 2026-05-28 |
| Parameters | 189M |
| VRAM | 378 MB for the weights |
What it runs on
| Card | Runs | Memory |
|---|---|---|
| RTX 3060 12 GB | fits | 11.6 GB |
| RTX 4060 Ti 16 GB | fits | 15.4 GB |
| RTX 3090 24 GB | fits | 23.4 GB |
| RTX 4090 24 GB | fits | 23.4 GB |
| RTX 5090 32 GB | fits | 31.0 GB |
| L40S 48 GB | fits | 44.0 GB |
| A100 80 GB | fits | 78.2 GB |
| H100 80 GB | fits | 78.1 GB |
| RTX PRO 6000 Blackwell 96 GB | fits | 93.8 GB |
| DGX Spark (GB10) 128 GB unified | fits | 107 GB |
| H200 141 GB | fits | 138 GB |
| B200 180 GB | fits | 176 GB |
From the model card
Synthyra/ESMFold2-Fast packages the biohub/ESMFold2-Fast checkpoint with
the FastPLMs runtime for Hugging Face Transformers. It accepts raw amino-acid
sequences or typed molecular-complex specifications; low-level forward accepts
prepared feature tensors.
The repository uses the standard Transformers loading interface with
trust_remote_code=True. See Technical details for each registered class and
whether its weights come from the checkpoint.
The sequence- and token-classification classes reuse the pretrained backbone, but their task heads are newly initialized. Fine-tune those heads before interpreting their logits as predictions.
Install the direct dependencies published with this model:
python -m pip install -r \
"https://huggingface.co/Synthyra/ESMFold2-Fast/resolve/main/requirements.txt"
The FastPLMs implementation itself is embedded in the model repository.
Transformers loads it through trust_remote_code=True.
This model requires Python 3.11-3.14, PyTorch 2.13, and Transformers 5.13.
The artifact requirements include the structure dependencies.
The release contract requires a CUDA device. The current validated target is the exact NVIDIA GH200 on Linux aarch64. Linux x86-64, CPU-only, Windows, and macOS structure runs are not release evidence.
The Hub quick start needs network access for the first download. For an air-gapped run, build the manifest-pinned local artifact first and use the offline example.
from transformers import AutoModel
model_id = "Synthyra/ESMFold2-Fast"
model = AutoModel.from_pretrained(
model_id,
trust_remote_code=True,
attn_implementation="sdpa",
).eval()
For offline validation, replace model_id with the manifest-built
dist/hub/ESMFold2-Fast path. Pass local_files_only=True.
The quick start uses sdpa.
Available backends are eager, sdpa, flex_attention. Requesting an
unavailable backend raises instead of silently changing implementation.
output_attentions=True can use the documented one-call eager fallback to
materialize attention tensors. The configured backend does not change.
The sequence and token prediction AutoClasses use the checkpoint backbone and
create a new, untrained classifier. Sequence labels have shape (b,).
Residue labels have shape (b, l) and use -100 outside biological positions.
The folding trunk is skipped. The classifier uses the checkpoint's learned pLM
state mixture and projection, followed by one trainable transformer probe.
import torch
from transformers import (
AutoModelForSequenceClassification,
AutoModelForTokenClassification,
)
model_id = "Synthyra/ESMFold2-Fast"
sequence_model = AutoModelForSequenceClassification.from_pretrained(
model_id, num_labels=2, trust_remote_code=True
).eval()
token_model = AutoModelForTokenClassification.from_pretrained(
model_id, num_labels=3, trust_remote_code=True
).eval()
sequences = ["MSTNPKPQRKTKRNT", "MKTIIALSYIFCLVFA"]
batch = sequence_model.prepare_classifier_inputs(sequences)
biological = batch["attention_mask"].bool()
sequence_labels = torch.zeros(len(sequences), dtype=torch.long)
token_labels = torch.full_like(batch["input_ids"], -100)
token_labels[biological] = 0
with torch.inference_mode():
sequence_output = sequence_model(**batch, labels=sequence_labels)
token_output = token_model(**batch, labels=token_labels)
print(sequence_output.logits.shape) # (b, 2)
print(token_output.logits.shape) # (b, l, 3)
Install the training dependencies. Then attach LoRA to the loaded checkpoint:
python -m pip install "datasets>=4.8,=0.19,<0.20"
from peft import LoraConfig, TaskType, get_peft_model
peft_model = get_peft_model(
sequence_model,
LoraConfig(
task_type=TaskType.SEQ_CLS,
r=8,
lora_alpha=16,
target_modules="all-linear",
modules_to_save=["classifier"],
),
)
This checkpoint advertises a classification head. Save the separately trained
classifier with the adapter.
All FastPLMs checkpoints follow the Transformers PreTrainedModel contract and
can use PEFT. The ESM2-specific shipped CLI is an example, not a
support boundary. Record the target modules, base revision, data identity, and
trainable parameter scope.
This 24-block Fast checkpoint is optimized for single-sequence inference. It
was trained without MSA conditioning. It rejects ProteinInput.msa and low-level
MSA-derived features. Typed multichain and multimolecule inputs remain supported
when every protein chain uses msa=None. Use the full ESMFold2 checkpoint for
MSA-conditioned inference. This follows the official Biohub architecture
description in Appendix A.2.1.
The single-protein helper returns typed structure and confidence outputs:
result = model.fold_protein(
"MSTNPKPQRKTKRNT",
num_loops=1,
num_sampling_steps=200,
num_diffusion_samples=1,
seed=7,
)
pdb_text = model.result_to_pdb(result)
cif_text = model.result_to_cif(result)
print(result.ptm, result.plddt.mean().item())
No target structure is required. For complexes, construct the input from the types exposed by the loaded artifact:
types = model.input_types
complex_input = types.StructurePredictionInput(
sequences=[
types.ProteinInput(id="A", sequence="MSTNPKPQRKTKRNT"),
types.ProteinInput(id="B", sequence="MKTIIALSYIFCLVFA"),
types.DNAInput(id="C", sequence="ATGC"),
types.LigandInput(id="L", smiles="O"),
]
)
complex_result = model.fold(
complex_input,
num_loops=1,
num_sampling_steps=200,
seed=7,
)
print(complex_result.ptm, complex_result.plddt.mean().item())
The typed interface also supports RNA, modifications, and covalent
Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.