kmlyyll's picture
Update app.py
9ceca05 verified
"""
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()