kmlyyll's picture
Update app.py
9ceca05 verified
Raw History Blame Contribute Delete
2.21 kB
"""
ZeroGPU Structure Prediction API
"""
import spaces
import gradio as gr
import torch
from transformers import EsmForProteinFolding, AutoTokenizer
print("Loading ESMFold model...")
MODEL_NAME = "facebook/esmfold_v1"
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = EsmForProteinFolding.from_pretrained(MODEL_NAME)
if torch.cuda.is_available():
model = model.cuda()
model.esm = model.esm.half()
print(f"Model loaded on GPU: {torch.cuda.get_device_name(0)}")
else:
print("Model loaded on CPU")
@spaces.GPU(duration=120)
def predict_structure(sequence: str) -> str:
sequence = sequence.strip().upper()
valid_aa = set("ACDEFGHIKLMNPQRSTVWY")
if not sequence:
return "Error: Empty sequence provided"
invalid_chars = set(sequence) - valid_aa
if invalid_chars:
return f"Error: Invalid amino acids found: {invalid_chars}"
if len(sequence) > 500:
return "Error: Sequence too long (max 500 residues)"
try:
inputs = tokenizer(sequence, return_tensors="pt", add_special_tokens=False)
if torch.cuda.is_available():
inputs = {k: v.cuda() for k, v in inputs.items()}
with torch.no_grad():
outputs = model(**inputs)
pdb_string = model.output_to_pdb(outputs)[0]
return pdb_string
except Exception as e:
return f"Error: {str(e)}"
with gr.Blocks(title="🧬 Antibody Structure API") as demo:
gr.Markdown("""
# 🧬 Antibody Structure Prediction API (ZeroGPU)
GPU-accelerated ESMFold structure prediction.
**API Usage:**
```python
from gradio_client import Client
client = Client("kmlyyll/antibody-structure-api")
pdb = client.predict(sequence, api_name="/predict")
```
""")
seq_input = gr.Textbox(label="Amino Acid Sequence", placeholder="Enter sequence...", lines=3)
predict_btn = gr.Button("Predict Structure", variant="primary")
pdb_output = gr.Textbox(label="PDB Output", lines=20)
predict_btn.click(fn=predict_structure, inputs=seq_input, outputs=pdb_output, api_name="predict")
if __name__ == "__main__":
demo.launch()