--- license: mit --- # ESM-2 QLoRA for Binding Sites Prediction In this model we added in more QLoRA adapter layers, modifying all of the weight matrices with QLoRA. The differences between the train and test metrics, again, are smaller for this model than for the model with fewer adapter layers (only using query, key, and value matrices). So, we see that adapting more of the weight matrices in this larger ESM-2 model decreases overfitting and serves as a better regularizer. For comparison, see [this model](https://huggingface.co/AmelieSchreiber/esm2_t12_35M_qlora_binding_sites_v0) which only has QLoRA adapters on the query, key, and value matrices. This model was trained on [this dataset](https://huggingface.co/datasets/AmelieSchreiber/1111K_binding_sites). Note, this dataset is too small for this model, so overfitting is expected, but overfitting is clearly reduced by including more adapter layers in the QLoRA. ## Testing for Overfitting ```python Train metrics: {'eval_loss': 0.17861589789390564, 'eval_accuracy': 0.9336392007583741, 'eval_precision': 0.24007189695313816, 'eval_recall': 0.9234520216135872, 'eval_f1': 0.38107489676203077, 'eval_auc': 0.9286608447868842, 'eval_mcc': 0.4519203165484902} Test metrics: {'eval_loss': 0.2265990674495697, 'eval_accuracy': 0.913988661430497, 'eval_precision': 0.1725452162312655, 'eval_recall': 0.8272126203209694, 'eval_f1': 0.28553230637278637, 'eval_auc': 0.8715212375759034, 'eval_mcc': 0.3539008454498742 ``` To use this model, run the following: ``` !pip install transformers -q !pip install peft -q ``` Then run: ```python from transformers import AutoModelForTokenClassification, AutoTokenizer from peft import PeftModel import torch # Path to the saved LoRA model model_path = "AmelieSchreiber/esm2_t12_35M_qlora_binding_sites_v1" # ESM2 base model base_model_path = "facebook/esm2_t12_35M_UR50D" # Load the model base_model = AutoModelForTokenClassification.from_pretrained(base_model_path) loaded_model = PeftModel.from_pretrained(base_model, model_path) # Ensure the model is in evaluation mode loaded_model.eval() # Load the tokenizer loaded_tokenizer = AutoTokenizer.from_pretrained(base_model_path) # Protein sequence for inference protein_sequence = "MAVPETRPNHTIYINNLNEKIKKDELKKSLHAIFSRFGQILDILVSRSLKMRGQAFVIFKEVSSATNALRSMQGFPFYDKPMRIQYAKTDSDIIAKMKGT" # Replace with your actual sequence # Tokenize the sequence inputs = loaded_tokenizer(protein_sequence, return_tensors="pt", truncation=True, max_length=1024, padding='max_length') # Run the model with torch.no_grad(): logits = loaded_model(**inputs).logits # Get predictions tokens = loaded_tokenizer.convert_ids_to_tokens(inputs["input_ids"][0]) # Convert input ids back to tokens predictions = torch.argmax(logits, dim=2) # Define labels id2label = { 0: "No binding site", 1: "Binding site" } # Print the predicted labels for each token for token, prediction in zip(tokens, predictions[0].numpy()): if token not in ['', '', '']: print((token, id2label[prediction])) ```