sufya12 commited on
Commit
acf4756
·
verified ·
1 Parent(s): 99d05b4

Delete app.py

Browse files
Files changed (1) hide show
  1. app.py +0 -142
app.py DELETED
@@ -1,142 +0,0 @@
1
- import os
2
- import torch
3
- import pandas as pd
4
- from torch.utils.data import Dataset, DataLoader
5
- from torch.optim import AdamW
6
- from transformers import MarianMTModel, MarianTokenizer
7
- from fastapi import FastAPI
8
- from pydantic import BaseModel
9
- import logging
10
-
11
- # ---------------- CONFIG ----------------
12
- logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
13
- logger = logging.getLogger(__name__)
14
-
15
- DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
16
- MODEL_NAME = "Helsinki-NLP/opus-mt-en-fr"
17
- FINETUNED_MODEL_PATH = "fine_tuned_model"
18
- CSV_FILE = "Data_1.csv" # Can also be a Hugging Face raw URL
19
-
20
- # ---------------- DATASET ----------------
21
- class TitleDataset(Dataset):
22
- def __init__(self, dataframe, tokenizer, max_length=128):
23
- self.data = dataframe.copy()
24
- self.tokenizer = tokenizer
25
- self.max_length = max_length
26
- self.data.columns = [c.strip().lower().replace(" ", "_") for c in self.data.columns]
27
-
28
- def __len__(self):
29
- return len(self.data)
30
-
31
- def __getitem__(self, idx):
32
- row = self.data.iloc[idx]
33
- text = f"Generate title from: Year: {row['year']} City: {row['city_name']} Description: {row['original_title']}"
34
- target = row['title']
35
-
36
- source = self.tokenizer(text, max_length=self.max_length, padding='max_length', truncation=True, return_tensors='pt')
37
- labels = self.tokenizer(target, max_length=self.max_length, padding='max_length', truncation=True, return_tensors='pt')['input_ids']
38
- labels[labels == self.tokenizer.pad_token_id] = -100
39
-
40
- return {
41
- "input_ids": source['input_ids'].squeeze(),
42
- "attention_mask": source['attention_mask'].squeeze(),
43
- "labels": labels.squeeze()
44
- }
45
-
46
- # ---------------- TRAIN FUNCTION ----------------
47
- def train_model(csv_file, epochs=2, batch_size=8, lr=5e-5):
48
- logger.info("Loading dataset...")
49
- df = pd.read_csv(csv_file)
50
- tokenizer = MarianTokenizer.from_pretrained(MODEL_NAME)
51
- model = MarianMTModel.from_pretrained(MODEL_NAME).to(DEVICE)
52
-
53
- dataset = TitleDataset(df, tokenizer)
54
- dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
55
- optimizer = AdamW(model.parameters(), lr=lr)
56
-
57
- logger.info("Starting fine-tuning...")
58
- model.train()
59
- for epoch in range(epochs):
60
- logger.info(f"Epoch {epoch+1}/{epochs}")
61
- for batch in dataloader:
62
- input_ids = batch['input_ids'].to(DEVICE)
63
- attention_mask = batch['attention_mask'].to(DEVICE)
64
- labels = batch['labels'].to(DEVICE)
65
-
66
- outputs = model(input_ids=input_ids, attention_mask=attention_mask, labels=labels)
67
- loss = outputs.loss
68
- loss.backward()
69
- optimizer.step()
70
- optimizer.zero_grad()
71
- logger.info(f"Epoch {epoch+1} finished. Loss: {loss.item():.4f}")
72
-
73
- if not os.path.exists(FINETUNED_MODEL_PATH):
74
- os.makedirs(FINETUNED_MODEL_PATH)
75
- model.save_pretrained(FINETUNED_MODEL_PATH)
76
- tokenizer.save_pretrained(FINETUNED_MODEL_PATH)
77
- logger.info(f"Fine-tuned model saved to {FINETUNED_MODEL_PATH}")
78
-
79
- # ---------------- LOAD OR TRAIN MODEL ----------------
80
- if os.path.exists(FINETUNED_MODEL_PATH):
81
- logger.info("Loading fine-tuned model...")
82
- tokenizer = MarianTokenizer.from_pretrained(FINETUNED_MODEL_PATH)
83
- model = MarianMTModel.from_pretrained(FINETUNED_MODEL_PATH).to(DEVICE)
84
- else:
85
- if os.path.exists(CSV_FILE):
86
- logger.info("Fine-tuned model not found. Training new model...")
87
- train_model(CSV_FILE)
88
- tokenizer = MarianTokenizer.from_pretrained(FINETUNED_MODEL_PATH)
89
- model = MarianMTModel.from_pretrained(FINETUNED_MODEL_PATH).to(DEVICE)
90
- else:
91
- logger.info("Fine-tuned model not found and CSV dataset missing. Using base pre-trained model...")
92
- tokenizer = MarianTokenizer.from_pretrained(MODEL_NAME)
93
- model = MarianMTModel.from_pretrained(MODEL_NAME).to(DEVICE)
94
-
95
- model.eval()
96
-
97
- # ---------------- FASTAPI ----------------
98
- app = FastAPI(title="French Title Generator API")
99
-
100
- class InputData(BaseModel):
101
- year: str
102
- city: str
103
- original_title: str
104
- max_length: int = 50
105
- temperature: float = 0.8
106
-
107
- @app.get("/")
108
- def home():
109
- return {"message": "French Title Generator API is running"}
110
-
111
- @app.post("/generate")
112
- def generate(data: InputData):
113
- try:
114
- input_text = f"Generate title from: Year: {data.year} City: {data.city} Description: {data.original_title}"
115
- inputs = tokenizer(input_text, return_tensors="pt", padding=True, truncation=True, max_length=128).to(DEVICE)
116
-
117
- with torch.no_grad():
118
- outputs = model.generate(
119
- inputs['input_ids'],
120
- attention_mask=inputs['attention_mask'],
121
- max_length=data.max_length,
122
- do_sample=True,
123
- temperature=data.temperature,
124
- num_beams=3,
125
- early_stopping=True
126
- )
127
-
128
- generated_title = tokenizer.decode(outputs[0], skip_special_tokens=True)
129
- for phrase in ["Le titre de", "Année:", "Ville:", "Description:", "[YEAR]", "[CITY]", "[DESC]", "[TITLE]"]:
130
- generated_title = generated_title.replace(phrase, "")
131
- generated_title = " ".join(generated_title.split()).strip()
132
-
133
- return {"generated_title": generated_title}
134
-
135
- except Exception as e:
136
- return {"error": str(e)}
137
-
138
- # ---------------- RUN ----------------
139
- if __name__ == "__main__":
140
- from waitress import serve
141
- logger.info("Starting API on port 5000...")
142
- serve(app, host="0.0.0.0", port=5000)