Fill-Mask
Transformers
Safetensors
ESMplusplus
custom_code
lhallee commited on
Commit
b7e37b1
·
verified ·
1 Parent(s): 2995994

Upload README.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. README.md +230 -230
README.md CHANGED
@@ -1,230 +1,230 @@
1
- ---
2
- library_name: transformers
3
- license: mit
4
- tags: []
5
- ---
6
-
7
- # NOTE
8
- The GitHub with the implementation and requirements.txt can be found [here](https://github.com/Synthyra/FastPLMs.git)
9
-
10
- # ESM++
11
- [ESM++](https://github.com/Synthyra/FastPLMs) is a faithful implementation of [ESMC](https://biohub.ai/esm/protein) ([license](https://github.com/Biohub/esm/blob/main/LICENSE.md)) that allows for batching and standard Hugging Face compatibility without requiring the ESM Python package.
12
- The small version corresponds to the 300 million parameter version of ESMC.
13
-
14
- This repository includes the Biohub ESM MIT license in `LICENSE`.
15
-
16
- ## Attention backends
17
-
18
- `sdpa` (PyTorch Scaled Dot Product Attention) is the default. The backend is set via `config.attn_backend` before loading.
19
-
20
- | Backend | Key | Notes |
21
- | :--- | :--- | :--- |
22
- | PyTorch SDPA | `"sdpa"` | Default. Exact numerics, stable on all hardware. |
23
- | Flash Attention | `"kernels_flash"` | Fastest on Ampere/Hopper GPUs. Requires `pip install kernels` (pre-built, no hours-long compilation). Outputs are not bitwise identical to SDPA due to online softmax reordering; differences are often small but not guaranteed to be inconsequential, so use `"sdpa"` if exact numerics matter. |
24
- | Flex Attention | `"flex"` | Skips padding tokens via block mask for faster variable-length batches. Near-exact numerics. First use compiles a Triton kernel (30-120 s). Best combined with `torch.compile`. |
25
- | Auto | `"auto"` | Picks the best available: `kernels_flash`, then `flex`, then `sdpa`. |
26
-
27
- ```python
28
- from transformers import AutoConfig, AutoModelForMaskedLM
29
-
30
- config = AutoConfig.from_pretrained('Synthyra/ESMplusplus_small', trust_remote_code=True)
31
- config.attn_backend = "flex" # or "kernels_flash", "sdpa", "auto"
32
- model = AutoModelForMaskedLM.from_pretrained('Synthyra/ESMplusplus_small', config=config, trust_remote_code=True)
33
- ```
34
-
35
- `torch.compile(model)` is heavily recommended for sustained throughput, especially with Flex Attention.
36
-
37
-
38
- ## Use with Hugging Face Transformers
39
- ```python
40
- from transformers import AutoModelForMaskedLM
41
- model = AutoModelForMaskedLM.from_pretrained('Synthyra/ESMplusplus_small', trust_remote_code=True)
42
- tokenizer = model.tokenizer
43
-
44
- sequences = ['MPRTEIN', 'MSEQWENCE']
45
- tokenized = tokenizer(sequences, padding=True, return_tensors='pt')
46
-
47
- # tokenized['labels'] = tokenized['input_ids'].clone() # correctly mask input_ids and set unmasked instances of labels to -100 for MLM training
48
-
49
- output = model(**tokenized) # get all hidden states with output_hidden_states=True
50
- print(output.logits.shape) # language modeling logits, (batch_size, seq_len, vocab_size), (2, 11, 64)
51
- print(output.last_hidden_state.shape) # last hidden state of the model, (batch_size, seq_len, hidden_size), (2, 11, 960)
52
- print(output.loss) # language modeling loss if you passed labels
53
- #print(output.hidden_states) # all hidden states if you passed output_hidden_states=True (in tuple)
54
- ```
55
-
56
- ESM++ also supports sequence and token level classification tasks like ESM2. Simply pass the number of labels during initialization.
57
-
58
- ```python
59
- from transformers import AutoModelForSequenceClassification, AutoModelForTokenClassification
60
-
61
- model = AutoModelForSequenceClassification.from_pretrained('Synthyra/ESMplusplus_small', num_labels=2, trust_remote_code=True)
62
- logits = model(**tokenized).logits
63
- print(logits.shape) # (batch_size, num_labels), (2, 2)
64
- ```
65
-
66
- ESM++ weights are fp32 by default. You can load them in fp16 or bf16 like this:
67
- ```python
68
- import torch
69
- model = AutoModelForMaskedLM.from_pretrained('Synthyra/ESMplusplus_small', trust_remote_code=True, dtype=torch.float16) # or torch.bfloat16
70
- ```
71
-
72
- ## Embed entire datasets with no new code
73
- To embed a list of protein sequences **fast**, just call embed_dataset. Sequences are sorted to reduce padding tokens, so the initial progress bar estimation is usually much longer than the actual time it will take.
74
-
75
- Example:
76
- ```python
77
- embedding_dict = model.embed_dataset(
78
- sequences=[
79
- 'MALWMRLLPLLALLALWGPDPAAA', ... # list of protein sequences
80
- ],
81
- batch_size=2, # adjust for your GPU memory
82
- max_len=512, # adjust for your needs
83
- full_embeddings=False, # if True, no pooling is performed
84
- embed_dtype=torch.float32, # cast to what dtype you want
85
- pooling_types=['mean', 'cls'], # more than one pooling type will be concatenated together
86
- num_workers=0, # if you have many cpu cores, we find that num_workers = 4 is fast for large datasets
87
- sql=False, # if True, embeddings will be stored in SQLite database
88
- sql_db_path='embeddings.db',
89
- save=True, # if True, embeddings will be saved as a .pth file
90
- save_path='embeddings.pth',
91
- )
92
- # embedding_dict is a dictionary mapping sequences to their embeddings as tensors for .pth or numpy arrays for sql
93
- ```
94
-
95
- ```
96
- model.embed_dataset()
97
- Args:
98
- sequences: List of protein sequences
99
- batch_size: Batch size for processing
100
- max_len: Maximum sequence length
101
- full_embeddings: Whether to return full residue-wise (True) embeddings or pooled (False)
102
- pooling_type: Type of pooling ('mean' or 'cls')
103
- num_workers: Number of workers for data loading, 0 for the main process
104
- sql: Whether to store embeddings in SQLite database - will be stored in float32
105
- sql_db_path: Path to SQLite database
106
-
107
- Returns:
108
- Dictionary mapping sequences to embeddings, or None if sql=True
109
-
110
- Note:
111
- - If sql=True, embeddings can only be stored in float32
112
- - sql is ideal if you need to stream a very large dataset for training in real-time
113
- - save=True is ideal if you can store the entire embedding dictionary in RAM
114
- - sql will be used if it is True and save is True or False
115
- - If your sql database or .pth file is already present, they will be scanned first for already embedded sequences
116
- - Sequences will be truncated to max_len and sorted by length in descending order for faster processing
117
- ```
118
-
119
- ## Fine-tuning with Hugging Face PEFT
120
- ```python
121
- model = AutoModelForSequenceClassification.from_pretrained('Synthyra/ESMplusplus_small', num_labels=2, trust_remote_code=True)
122
- # these modules handle ESM++ and ESM2 attention layers
123
- target_modules = ["layernorm_qkv.1", "out_proj", "query", "key", "value", "dense"]
124
-
125
- lora_config = LoraConfig(
126
- r=8, # choose lora parameters to your liking
127
- lora_alpha=16,
128
- lora_dropout=0.01,
129
- bias="none",
130
- target_modules=target_modules,
131
- )
132
-
133
- # Apply LoRA to the model
134
- model = get_peft_model(model, lora_config)
135
-
136
- # Unfreeze the classifier head
137
- for param in model.classifier.parameters():
138
- param.requires_grad = True
139
- ```
140
-
141
- For a more thorough example of fine-tuning, check out our example script [here](https://github.com/Synthyra/FastPLMs/blob/main/fine_tuning_example.py).
142
-
143
-
144
- ## Returning attention maps
145
- When `attn_backend="flex"`, Flex Attention with a pad-token block mask is used for attention calculations. Optimized attention paths do not return attention maps directly.
146
- ESM++ has the option to ```output_attentions```, which will calculate attention manually. This is much slower, so do not use unless you need the attention maps.
147
-
148
- ```python
149
- output = model(**tokenized, output_attentions=True)
150
- att = output.attentions
151
- len(att) # 30, one for each layer, size (batch_size, num_heads, seq_len, seq_len) each
152
- ```
153
-
154
- ## Comparison across floating-point precision and implementations
155
- We measured the difference of the last hidden states of the fp32 weights vs. fp16 or bf16. We find that the fp16 is closer to the fp32 outputs, so we recommend loading in fp16.
156
- Please note that the ESM package also loads ESMC in fp32 but casts to bf16 by default, which has its share of advantages and disadvantages in inference / training - so load whichever you like for half precision.
157
-
158
- Average MSE FP32 vs. FP16: 0.00000003
159
-
160
- Average MSE FP32 vs. BF16: 0.00000140
161
-
162
- We also measured the difference between the outputs of ESM++ vs. ESMC (both in bfloat16) on 1000 random sequences to ensure compliance with the ESM package.
163
-
164
- Average MSE of last hidden state: 7.74e-10
165
-
166
- You can load the weights from the ESM package instead of transformers by replacing .from_pretrained(...) to .from_pretrained_esm('esmc_300m')
167
-
168
- ## Model probes
169
- We employ linear probing techniques on various PLMs and standard datasets, similar our previous [paper](https://www.biorxiv.org/content/10.1101/2024.07.30.605924v1), to assess the intrinsic correlation between pooled hidden states and valuable properties. ESMC (and thus ESM++) perform very well.
170
-
171
- The plot below showcases performance normalized between the negative control (random vector embeddings) and the best performer. Classification task scores are averaged between MCC and F1 (or F1max for multilabel) and regression tasks are averaged between Spearman rho and R2.
172
- ![image/png](https://cdn-uploads.huggingface.co/production/uploads/62f2bd3bdb7cbd214b658c48/2zyUZeHyOgCR_twvPF2Wy.png)
173
-
174
- ## Inference speeds
175
- We look at various ESM models and their throughput on an H100. Adding efficient batching between ESMC and ESM++ significantly improves the throughput, although ESM++ is also faster than ESMC for batch size one. ESM++ small is even faster than ESM2-35M with long sequences!
176
- The most gains will be seen with PyTorch > 2.5 on linux machines.
177
- ![image/png](https://cdn-uploads.huggingface.co/production/uploads/62f2bd3bdb7cbd214b658c48/RfLRSchFivdsqJrWMh4bo.png)
178
-
179
- ### Citations
180
-
181
- ```bibtex
182
- @misc{FastPLMs,
183
- author={Hallee, Logan and Bichara, David and Gleghorn, Jason P.},
184
- title={FastPLMs: Fast, efficient, protein language model inference from Hugging Face AutoModel.},
185
- year={2024},
186
- url={https://huggingface.co/Synthyra/ESMplusplus_small},
187
- DOI={10.57967/hf/3726},
188
- publisher={Hugging Face}
189
- }
190
- ```
191
-
192
- ```bibtex
193
- @misc{candido2026language,
194
- title = {Language Modeling Materializes a World Model of Protein Biology},
195
- author = {Candido, Salvatore and Hayes, Thomas and Derry, Alexander and Rao, Roshan
196
- and Lin, Zeming and Verkuil, Robert and Wu, Bryan and Lee, Jin Sub
197
- and Bruguera, Elise S. and Keval, Jehan A. and Kopylov, Mykhailo
198
- and Pak, John E. and Wu, Wesley and Thomas, Neil and Mataraso, Samson
199
- and Hsu, Alvin and Trotman-Grant, Ashton C. and Fatras, Kilian
200
- and dos Santos Costa, Allan and Badkundri, Rohil and Ak{\i}n, Halil
201
- and Oktay, Deniz and Deaton, Jonathan and Montabana, Elizabeth
202
- and Sitwala, Hrishita and Yu, Yue and Wiggert, Marius
203
- and Carlin, Dylan Alexander and Goering, Anthony W. and Blazejewski, Tomasz
204
- and Sandora, McCullen and Hla, Michael and Jia, Tina Z.
205
- and Kloker, Leon H. and Sofroniew, Nicholas J. and Uehara, Masatoshi
206
- and Pannu, Jassi and Bachas, Sharrol and Liu, Daniel S.
207
- and Sercu, Tom and Rives, Alexander},
208
- year = {2026},
209
- url = {https://biohub.ai/papers/esm_protein.pdf},
210
- note = {Preprint}
211
- }
212
- ```
213
-
214
- ```bibtex
215
- @article{dong2024flexattention,
216
- title={Flex Attention: A Programming Model for Generating Optimized Attention Kernels},
217
- author={Dong, Juechu and Feng, Boyuan and Guessous, Driss and Liang, Yanbo and He, Horace},
218
- journal={arXiv preprint arXiv:2412.05496},
219
- year={2024}
220
- }
221
- ```
222
-
223
- ```bibtex
224
- @inproceedings{paszke2019pytorch,
225
- title={PyTorch: An Imperative Style, High-Performance Deep Learning Library},
226
- author={Paszke, Adam and Gross, Sam and Massa, Francisco and Lerer, Adam and Bradbury, James and Chanan, Gregory and Killeen, Trevor and Lin, Zeming and Gimelshein, Natalia and Antiga, Luca and Desmaison, Alban and K{\"o}pf, Andreas and Yang, Edward and DeVito, Zach and Raison, Martin and Tejani, Alykhan and Chilamkurthy, Sasank and Steiner, Benoit and Fang, Lu and Bai, Junjie and Chintala, Soumith},
227
- booktitle={Advances in Neural Information Processing Systems 32},
228
- year={2019}
229
- }
230
- ```
 
1
+ ---
2
+ library_name: transformers
3
+ license: mit
4
+ tags: []
5
+ ---
6
+
7
+ # NOTE
8
+ The GitHub with the implementation and requirements.txt can be found [here](https://github.com/Synthyra/FastPLMs.git)
9
+
10
+ # ESM++
11
+ [ESM++](https://github.com/Synthyra/FastPLMs) is a faithful implementation of [ESMC](https://biohub.ai/esm/protein) ([license](https://github.com/Biohub/esm/blob/main/LICENSE.md)) that allows for batching and standard Hugging Face compatibility without requiring the ESM Python package.
12
+ The small version corresponds to the 300 million parameter version of ESMC.
13
+
14
+ This repository includes the Biohub ESM MIT license in `LICENSE`.
15
+
16
+ ## Attention backends
17
+
18
+ `sdpa` (PyTorch Scaled Dot Product Attention) is the default. The backend is set via `config.attn_backend` before loading.
19
+
20
+ | Backend | Key | Notes |
21
+ | :--- | :--- | :--- |
22
+ | PyTorch SDPA | `"sdpa"` | Default. Exact numerics, stable on all hardware. |
23
+ | Flash Attention | `"kernels_flash"` | Fastest on Ampere/Hopper GPUs. Requires `pip install kernels` (pre-built, no hours-long compilation). Outputs are not bitwise identical to SDPA due to online softmax reordering; differences are often small but not guaranteed to be inconsequential, so use `"sdpa"` if exact numerics matter. |
24
+ | Flex Attention | `"flex"` | Skips padding tokens via block mask for faster variable-length batches. Near-exact numerics. First use compiles a Triton kernel (30-120 s). Best combined with `torch.compile`. |
25
+ | Auto | `"auto"` | Picks the best available: `kernels_flash`, then `flex`, then `sdpa`. |
26
+
27
+ ```python
28
+ from transformers import AutoConfig, AutoModelForMaskedLM
29
+
30
+ config = AutoConfig.from_pretrained('Synthyra/ESMplusplus_small', trust_remote_code=True)
31
+ config.attn_backend = "flex" # or "kernels_flash", "sdpa", "auto"
32
+ model = AutoModelForMaskedLM.from_pretrained('Synthyra/ESMplusplus_small', config=config, trust_remote_code=True)
33
+ ```
34
+
35
+ `torch.compile(model)` is heavily recommended for sustained throughput, especially with Flex Attention.
36
+
37
+
38
+ ## Use with Hugging Face Transformers
39
+ ```python
40
+ from transformers import AutoModelForMaskedLM
41
+ model = AutoModelForMaskedLM.from_pretrained('Synthyra/ESMplusplus_small', trust_remote_code=True)
42
+ tokenizer = model.tokenizer
43
+
44
+ sequences = ['MPRTEIN', 'MSEQWENCE']
45
+ tokenized = tokenizer(sequences, padding=True, return_tensors='pt')
46
+
47
+ # tokenized['labels'] = tokenized['input_ids'].clone() # correctly mask input_ids and set unmasked instances of labels to -100 for MLM training
48
+
49
+ output = model(**tokenized) # get all hidden states with output_hidden_states=True
50
+ print(output.logits.shape) # language modeling logits, (batch_size, seq_len, vocab_size), (2, 11, 64)
51
+ print(output.last_hidden_state.shape) # last hidden state of the model, (batch_size, seq_len, hidden_size), (2, 11, 960)
52
+ print(output.loss) # language modeling loss if you passed labels
53
+ #print(output.hidden_states) # all hidden states if you passed output_hidden_states=True (in tuple)
54
+ ```
55
+
56
+ ESM++ also supports sequence and token level classification tasks like ESM2. Simply pass the number of labels during initialization.
57
+
58
+ ```python
59
+ from transformers import AutoModelForSequenceClassification, AutoModelForTokenClassification
60
+
61
+ model = AutoModelForSequenceClassification.from_pretrained('Synthyra/ESMplusplus_small', num_labels=2, trust_remote_code=True)
62
+ logits = model(**tokenized).logits
63
+ print(logits.shape) # (batch_size, num_labels), (2, 2)
64
+ ```
65
+
66
+ ESM++ weights are fp32 by default. You can load them in fp16 or bf16 like this:
67
+ ```python
68
+ import torch
69
+ model = AutoModelForMaskedLM.from_pretrained('Synthyra/ESMplusplus_small', trust_remote_code=True, dtype=torch.float16) # or torch.bfloat16
70
+ ```
71
+
72
+ ## Embed entire datasets with no new code
73
+ To embed a list of protein sequences **fast**, just call embed_dataset. Sequences are sorted to reduce padding tokens, so the initial progress bar estimation is usually much longer than the actual time it will take.
74
+
75
+ Example:
76
+ ```python
77
+ embedding_dict = model.embed_dataset(
78
+ sequences=[
79
+ 'MALWMRLLPLLALLALWGPDPAAA', ... # list of protein sequences
80
+ ],
81
+ batch_size=2, # adjust for your GPU memory
82
+ max_len=512, # adjust for your needs
83
+ full_embeddings=False, # if True, no pooling is performed
84
+ embed_dtype=torch.float32, # cast to what dtype you want
85
+ pooling_types=['mean', 'cls'], # more than one pooling type will be concatenated together
86
+ num_workers=0, # if you have many cpu cores, we find that num_workers = 4 is fast for large datasets
87
+ sql=False, # if True, embeddings will be stored in SQLite database
88
+ sql_db_path='embeddings.db',
89
+ save=True, # if True, embeddings will be saved as a .pth file
90
+ save_path='embeddings.pth',
91
+ )
92
+ # embedding_dict is a dictionary mapping sequences to their embeddings as tensors for .pth or numpy arrays for sql
93
+ ```
94
+
95
+ ```
96
+ model.embed_dataset()
97
+ Args:
98
+ sequences: List of protein sequences
99
+ batch_size: Batch size for processing
100
+ max_len: Maximum sequence length
101
+ full_embeddings: Whether to return full residue-wise (True) embeddings or pooled (False)
102
+ pooling_type: Type of pooling ('mean' or 'cls')
103
+ num_workers: Number of workers for data loading, 0 for the main process
104
+ sql: Whether to store embeddings in SQLite database - will be stored in float32
105
+ sql_db_path: Path to SQLite database
106
+
107
+ Returns:
108
+ Dictionary mapping sequences to embeddings, or None if sql=True
109
+
110
+ Note:
111
+ - If sql=True, embeddings can only be stored in float32
112
+ - sql is ideal if you need to stream a very large dataset for training in real-time
113
+ - save=True is ideal if you can store the entire embedding dictionary in RAM
114
+ - sql will be used if it is True and save is True or False
115
+ - If your sql database or .pth file is already present, they will be scanned first for already embedded sequences
116
+ - Sequences will be truncated to max_len and sorted by length in descending order for faster processing
117
+ ```
118
+
119
+ ## Fine-tuning with Hugging Face PEFT
120
+ ```python
121
+ model = AutoModelForSequenceClassification.from_pretrained('Synthyra/ESMplusplus_small', num_labels=2, trust_remote_code=True)
122
+ # these modules handle ESM++ and ESM2 attention layers
123
+ target_modules = ["layernorm_qkv.1", "out_proj", "query", "key", "value", "dense"]
124
+
125
+ lora_config = LoraConfig(
126
+ r=8, # choose lora parameters to your liking
127
+ lora_alpha=16,
128
+ lora_dropout=0.01,
129
+ bias="none",
130
+ target_modules=target_modules,
131
+ )
132
+
133
+ # Apply LoRA to the model
134
+ model = get_peft_model(model, lora_config)
135
+
136
+ # Unfreeze the classifier head
137
+ for param in model.classifier.parameters():
138
+ param.requires_grad = True
139
+ ```
140
+
141
+ For a more thorough example of fine-tuning, check out our example script [here](https://github.com/Synthyra/FastPLMs/blob/main/fine_tuning_example.py).
142
+
143
+
144
+ ## Returning attention maps
145
+ When `attn_backend="flex"`, Flex Attention with a pad-token block mask is used for attention calculations. Optimized attention paths do not return attention maps directly.
146
+ ESM++ has the option to ```output_attentions```, which will calculate attention manually. This is much slower, so do not use unless you need the attention maps.
147
+
148
+ ```python
149
+ output = model(**tokenized, output_attentions=True)
150
+ att = output.attentions
151
+ len(att) # 30, one for each layer, size (batch_size, num_heads, seq_len, seq_len) each
152
+ ```
153
+
154
+ ## Comparison across floating-point precision and implementations
155
+ We measured the difference of the last hidden states of the fp32 weights vs. fp16 or bf16. We find that the fp16 is closer to the fp32 outputs, so we recommend loading in fp16.
156
+ Please note that the ESM package also loads ESMC in fp32 but casts to bf16 by default, which has its share of advantages and disadvantages in inference / training - so load whichever you like for half precision.
157
+
158
+ Average MSE FP32 vs. FP16: 0.00000003
159
+
160
+ Average MSE FP32 vs. BF16: 0.00000140
161
+
162
+ We also measured the difference between the outputs of ESM++ vs. ESMC (both in bfloat16) on 1000 random sequences to ensure compliance with the ESM package.
163
+
164
+ Average MSE of last hidden state: 7.74e-10
165
+
166
+ You can load the weights from the ESM package instead of transformers by replacing .from_pretrained(...) to .from_pretrained_esm('esmc_300m')
167
+
168
+ ## Model probes
169
+ We employ linear probing techniques on various PLMs and standard datasets, similar our previous [paper](https://www.biorxiv.org/content/10.1101/2024.07.30.605924v1), to assess the intrinsic correlation between pooled hidden states and valuable properties. ESMC (and thus ESM++) perform very well.
170
+
171
+ The plot below showcases performance normalized between the negative control (random vector embeddings) and the best performer. Classification task scores are averaged between MCC and F1 (or F1max for multilabel) and regression tasks are averaged between Spearman rho and R2.
172
+ ![image/png](https://cdn-uploads.huggingface.co/production/uploads/62f2bd3bdb7cbd214b658c48/2zyUZeHyOgCR_twvPF2Wy.png)
173
+
174
+ ## Inference speeds
175
+ We look at various ESM models and their throughput on an H100. Adding efficient batching between ESMC and ESM++ significantly improves the throughput, although ESM++ is also faster than ESMC for batch size one. ESM++ small is even faster than ESM2-35M with long sequences!
176
+ The most gains will be seen with PyTorch > 2.5 on linux machines.
177
+ ![image/png](https://cdn-uploads.huggingface.co/production/uploads/62f2bd3bdb7cbd214b658c48/RfLRSchFivdsqJrWMh4bo.png)
178
+
179
+ ### Citations
180
+
181
+ ```bibtex
182
+ @misc{FastPLMs,
183
+ author={Hallee, Logan and Bichara, David and Gleghorn, Jason P.},
184
+ title={FastPLMs: Fast, efficient, protein language model inference from Hugging Face AutoModel.},
185
+ year={2024},
186
+ url={https://huggingface.co/Synthyra/ESMplusplus_small},
187
+ DOI={10.57967/hf/3726},
188
+ publisher={Hugging Face}
189
+ }
190
+ ```
191
+
192
+ ```bibtex
193
+ @misc{candido2026language,
194
+ title = {Language Modeling Materializes a World Model of Protein Biology},
195
+ author = {Candido, Salvatore and Hayes, Thomas and Derry, Alexander and Rao, Roshan
196
+ and Lin, Zeming and Verkuil, Robert and Wu, Bryan and Lee, Jin Sub
197
+ and Bruguera, Elise S. and Keval, Jehan A. and Kopylov, Mykhailo
198
+ and Pak, John E. and Wu, Wesley and Thomas, Neil and Mataraso, Samson
199
+ and Hsu, Alvin and Trotman-Grant, Ashton C. and Fatras, Kilian
200
+ and dos Santos Costa, Allan and Badkundri, Rohil and Ak{\i}n, Halil
201
+ and Oktay, Deniz and Deaton, Jonathan and Montabana, Elizabeth
202
+ and Sitwala, Hrishita and Yu, Yue and Wiggert, Marius
203
+ and Carlin, Dylan Alexander and Goering, Anthony W. and Blazejewski, Tomasz
204
+ and Sandora, McCullen and Hla, Michael and Jia, Tina Z.
205
+ and Kloker, Leon H. and Sofroniew, Nicholas J. and Uehara, Masatoshi
206
+ and Pannu, Jassi and Bachas, Sharrol and Liu, Daniel S.
207
+ and Sercu, Tom and Rives, Alexander},
208
+ year = {2026},
209
+ url = {https://biohub.ai/papers/esm_protein.pdf},
210
+ note = {Preprint}
211
+ }
212
+ ```
213
+
214
+ ```bibtex
215
+ @article{dong2024flexattention,
216
+ title={Flex Attention: A Programming Model for Generating Optimized Attention Kernels},
217
+ author={Dong, Juechu and Feng, Boyuan and Guessous, Driss and Liang, Yanbo and He, Horace},
218
+ journal={arXiv preprint arXiv:2412.05496},
219
+ year={2024}
220
+ }
221
+ ```
222
+
223
+ ```bibtex
224
+ @inproceedings{paszke2019pytorch,
225
+ title={PyTorch: An Imperative Style, High-Performance Deep Learning Library},
226
+ author={Paszke, Adam and Gross, Sam and Massa, Francisco and Lerer, Adam and Bradbury, James and Chanan, Gregory and Killeen, Trevor and Lin, Zeming and Gimelshein, Natalia and Antiga, Luca and Desmaison, Alban and K{\"o}pf, Andreas and Yang, Edward and DeVito, Zach and Raison, Martin and Tejani, Alykhan and Chilamkurthy, Sasank and Steiner, Benoit and Fang, Lu and Bai, Junjie and Chintala, Soumith},
227
+ booktitle={Advances in Neural Information Processing Systems 32},
228
+ year={2019}
229
+ }
230
+ ```