Joash commited on
Commit
d8e1d06
·
1 Parent(s): 1de1c4f

Add robust error handling and improve model loading

Browse files
Files changed (1) hide show
  1. app.py +91 -41
app.py CHANGED
@@ -7,6 +7,10 @@ import logging
7
  from datetime import datetime
8
  import json
9
  from typing import List, Dict
 
 
 
 
10
 
11
  # Configure logging
12
  logging.basicConfig(level=logging.INFO)
@@ -16,6 +20,10 @@ logger = logging.getLogger(__name__)
16
  HF_TOKEN = os.getenv("HUGGING_FACE_TOKEN")
17
  MODEL_NAME = os.getenv("MODEL_NAME", "google/gemma-2b-it")
18
 
 
 
 
 
19
  class Review:
20
  def __init__(self, code: str, language: str, suggestions: str):
21
  self.code = code
@@ -47,18 +55,36 @@ class CodeReviewer:
47
  self.tokenizer = AutoTokenizer.from_pretrained(
48
  MODEL_NAME,
49
  token=HF_TOKEN,
50
- trust_remote_code=True
 
51
  )
52
 
53
  logger.info("Loading model...")
54
- self.model = AutoModelForCausalLM.from_pretrained(
55
- MODEL_NAME,
56
- token=HF_TOKEN,
57
- device_map="auto",
58
- torch_dtype=torch.float16,
59
- trust_remote_code=True,
60
- low_cpu_mem_usage=True
61
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  logger.info(f"Model loaded successfully on {self.device}")
63
  except Exception as e:
64
  logger.error(f"Error initializing model: {e}")
@@ -83,27 +109,42 @@ Code:
83
  start_time = datetime.now()
84
  prompt = self.create_review_prompt(code, language)
85
 
86
- inputs = self.tokenizer(
87
- prompt,
88
- return_tensors="pt",
89
- truncation=True,
90
- max_length=512,
91
- padding=True
92
- ).to(self.device)
 
 
 
 
 
93
 
94
- with torch.no_grad():
95
- outputs = self.model.generate(
96
- **inputs,
97
- max_new_tokens=512,
98
- do_sample=True,
99
- temperature=0.7,
100
- top_p=0.95,
101
- num_beams=1,
102
- early_stopping=True
103
- )
 
 
 
 
 
104
 
105
- response = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
106
- suggestions = response[len(prompt):].strip()
 
 
 
 
 
107
 
108
  # Create review and update metrics
109
  end_time = datetime.now()
@@ -212,24 +253,33 @@ with gr.Blocks(theme=gr.themes.Soft()) as iface:
212
  try:
213
  return reviewer.review_code(code, language)
214
  except Exception as e:
 
215
  return f"Error: {str(e)}"
216
 
217
  def get_history_interface() -> str:
218
- history = reviewer.get_history()
219
- if not history:
220
- return "No reviews yet."
221
- result = ""
222
- for review in history:
223
- result += f"Time: {review['timestamp']}\n"
224
- result += f"Language: {review['language']}\n"
225
- result += f"Response Time: {review['response_time']}\n"
226
- result += "Code:\n```\n" + review['code'] + "\n```\n"
227
- result += "Suggestions:\n" + review['suggestions'] + "\n"
228
- result += "-" * 80 + "\n\n"
229
- return result
 
 
 
 
230
 
231
  def get_metrics_interface() -> Dict:
232
- return reviewer.get_metrics()
 
 
 
 
233
 
234
  submit_btn.click(
235
  review_code_interface,
 
7
  from datetime import datetime
8
  import json
9
  from typing import List, Dict
10
+ import warnings
11
+
12
+ # Filter CUDA warnings
13
+ warnings.filterwarnings('ignore', category=UserWarning, message='Can\'t initialize NVML')
14
 
15
  # Configure logging
16
  logging.basicConfig(level=logging.INFO)
 
20
  HF_TOKEN = os.getenv("HUGGING_FACE_TOKEN")
21
  MODEL_NAME = os.getenv("MODEL_NAME", "google/gemma-2b-it")
22
 
23
+ # Cache directory for model
24
+ CACHE_DIR = "/home/user/.cache/huggingface"
25
+ os.makedirs(CACHE_DIR, exist_ok=True)
26
+
27
  class Review:
28
  def __init__(self, code: str, language: str, suggestions: str):
29
  self.code = code
 
55
  self.tokenizer = AutoTokenizer.from_pretrained(
56
  MODEL_NAME,
57
  token=HF_TOKEN,
58
+ trust_remote_code=True,
59
+ cache_dir=CACHE_DIR
60
  )
61
 
62
  logger.info("Loading model...")
63
+ # Initialize model with specific configuration
64
+ model_kwargs = {
65
+ "device_map": "auto",
66
+ "torch_dtype": torch.float16,
67
+ "trust_remote_code": True,
68
+ "low_cpu_mem_usage": True,
69
+ "cache_dir": CACHE_DIR,
70
+ "token": HF_TOKEN
71
+ }
72
+
73
+ # Load model with error handling
74
+ try:
75
+ self.model = AutoModelForCausalLM.from_pretrained(
76
+ MODEL_NAME,
77
+ **model_kwargs
78
+ )
79
+ except Exception as model_error:
80
+ logger.error(f"Error loading model: {model_error}")
81
+ # Try loading with safetensors
82
+ model_kwargs["use_safetensors"] = True
83
+ self.model = AutoModelForCausalLM.from_pretrained(
84
+ MODEL_NAME,
85
+ **model_kwargs
86
+ )
87
+
88
  logger.info(f"Model loaded successfully on {self.device}")
89
  except Exception as e:
90
  logger.error(f"Error initializing model: {e}")
 
109
  start_time = datetime.now()
110
  prompt = self.create_review_prompt(code, language)
111
 
112
+ # Tokenize with error handling
113
+ try:
114
+ inputs = self.tokenizer(
115
+ prompt,
116
+ return_tensors="pt",
117
+ truncation=True,
118
+ max_length=512,
119
+ padding=True
120
+ ).to(self.device)
121
+ except Exception as token_error:
122
+ logger.error(f"Tokenization error: {token_error}")
123
+ return "Error: Failed to process input code. Please try again."
124
 
125
+ # Generate with error handling
126
+ try:
127
+ with torch.no_grad():
128
+ outputs = self.model.generate(
129
+ **inputs,
130
+ max_new_tokens=512,
131
+ do_sample=True,
132
+ temperature=0.7,
133
+ top_p=0.95,
134
+ num_beams=1,
135
+ early_stopping=True
136
+ )
137
+ except Exception as gen_error:
138
+ logger.error(f"Generation error: {gen_error}")
139
+ return "Error: Failed to generate review. Please try again."
140
 
141
+ # Decode with error handling
142
+ try:
143
+ response = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
144
+ suggestions = response[len(prompt):].strip()
145
+ except Exception as decode_error:
146
+ logger.error(f"Decoding error: {decode_error}")
147
+ return "Error: Failed to decode model output. Please try again."
148
 
149
  # Create review and update metrics
150
  end_time = datetime.now()
 
253
  try:
254
  return reviewer.review_code(code, language)
255
  except Exception as e:
256
+ logger.error(f"Interface error: {e}")
257
  return f"Error: {str(e)}"
258
 
259
  def get_history_interface() -> str:
260
+ try:
261
+ history = reviewer.get_history()
262
+ if not history:
263
+ return "No reviews yet."
264
+ result = ""
265
+ for review in history:
266
+ result += f"Time: {review['timestamp']}\n"
267
+ result += f"Language: {review['language']}\n"
268
+ result += f"Response Time: {review['response_time']}\n"
269
+ result += "Code:\n```\n" + review['code'] + "\n```\n"
270
+ result += "Suggestions:\n" + review['suggestions'] + "\n"
271
+ result += "-" * 80 + "\n\n"
272
+ return result
273
+ except Exception as e:
274
+ logger.error(f"History error: {e}")
275
+ return "Error retrieving history"
276
 
277
  def get_metrics_interface() -> Dict:
278
+ try:
279
+ return reviewer.get_metrics()
280
+ except Exception as e:
281
+ logger.error(f"Metrics error: {e}")
282
+ return {"error": str(e)}
283
 
284
  submit_btn.click(
285
  review_code_interface,