Joash commited on
Commit
80d4148
·
1 Parent(s): 38c113b

Update app to properly utilize ZeroGPU with GPU optimizations

Browse files
Files changed (1) hide show
  1. app.py +52 -47
app.py CHANGED
@@ -28,7 +28,8 @@ class CodeReviewer:
28
  def __init__(self):
29
  self.model = None
30
  self.tokenizer = None
31
- self.device = "cpu"
 
32
  self.review_history: List[Review] = []
33
  self.metrics = {
34
  'total_reviews': 0,
@@ -41,19 +42,25 @@ class CodeReviewer:
41
  """Initialize the model and tokenizer."""
42
  try:
43
  if HF_TOKEN:
44
- login(token=HF_TOKEN)
45
 
46
  logger.info("Loading tokenizer...")
47
- self.tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
 
 
 
 
48
 
49
  logger.info("Loading model...")
 
50
  self.model = AutoModelForCausalLM.from_pretrained(
51
  MODEL_NAME,
52
- device_map={"": self.device},
53
- torch_dtype=torch.float32,
54
- low_cpu_mem_usage=True
 
55
  )
56
- logger.info("Model loaded successfully")
57
  except Exception as e:
58
  logger.error(f"Error initializing model: {e}")
59
  raise
@@ -83,7 +90,7 @@ Code:
83
  truncation=True,
84
  max_length=512,
85
  padding=True
86
- )
87
 
88
  with torch.no_grad():
89
  outputs = self.model.generate(
@@ -108,6 +115,11 @@ Code:
108
  # Update metrics
109
  self.update_metrics(review)
110
 
 
 
 
 
 
111
  return suggestions
112
 
113
  except Exception as e:
@@ -148,43 +160,10 @@ Code:
148
  return {
149
  'Total Reviews': self.metrics['total_reviews'],
150
  'Average Response Time': f"{self.metrics['avg_response_time']:.2f}s",
151
- 'Reviews Today': self.metrics['reviews_today']
 
152
  }
153
 
154
- # Initialize the reviewer
155
- reviewer = CodeReviewer()
156
-
157
- def review_code_interface(code: str, language: str) -> str:
158
- """Gradio interface function for code review."""
159
- if not code.strip():
160
- return "Please enter some code to review."
161
-
162
- try:
163
- result = reviewer.review_code(code, language)
164
- return result
165
- except Exception as e:
166
- return f"Error: {str(e)}"
167
-
168
- def get_history_interface() -> str:
169
- """Format history for display."""
170
- history = reviewer.get_history()
171
- if not history:
172
- return "No reviews yet."
173
-
174
- result = ""
175
- for review in history:
176
- result += f"Time: {review['timestamp']}\n"
177
- result += f"Language: {review['language']}\n"
178
- result += f"Response Time: {review['response_time']}\n"
179
- result += "Code:\n```\n" + review['code'] + "\n```\n"
180
- result += "Suggestions:\n" + review['suggestions'] + "\n"
181
- result += "-" * 80 + "\n\n"
182
- return result
183
-
184
- def get_metrics_interface() -> Dict:
185
- """Get metrics for display."""
186
- return reviewer.get_metrics()
187
-
188
  # Create Gradio interface
189
  with gr.Blocks(theme=gr.themes.Soft()) as iface:
190
  gr.Markdown("# Code Review Assistant")
@@ -215,18 +194,44 @@ with gr.Blocks(theme=gr.themes.Soft()) as iface:
215
  refresh_history = gr.Button("Refresh History")
216
  history_output = gr.Textbox(
217
  label="Review History",
218
- lines=20,
219
- value=get_history_interface()
220
  )
221
 
222
  with gr.Tab("Metrics"):
223
  refresh_metrics = gr.Button("Refresh Metrics")
224
  metrics_output = gr.JSON(
225
- label="Performance Metrics",
226
- value=get_metrics_interface()
227
  )
228
 
 
 
 
229
  # Set up event handlers
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
230
  submit_btn.click(
231
  review_code_interface,
232
  inputs=[code_input, language_input],
 
28
  def __init__(self):
29
  self.model = None
30
  self.tokenizer = None
31
+ # Let ZeroGPU handle GPU allocation
32
+ self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
33
  self.review_history: List[Review] = []
34
  self.metrics = {
35
  'total_reviews': 0,
 
42
  """Initialize the model and tokenizer."""
43
  try:
44
  if HF_TOKEN:
45
+ login(token=HF_TOKEN, add_to_git_credential=False)
46
 
47
  logger.info("Loading tokenizer...")
48
+ self.tokenizer = AutoTokenizer.from_pretrained(
49
+ MODEL_NAME,
50
+ token=HF_TOKEN,
51
+ trust_remote_code=True
52
+ )
53
 
54
  logger.info("Loading model...")
55
+ # Let ZeroGPU handle device mapping
56
  self.model = AutoModelForCausalLM.from_pretrained(
57
  MODEL_NAME,
58
+ token=HF_TOKEN,
59
+ device_map="auto",
60
+ torch_dtype=torch.float16, # Use fp16 for GPU
61
+ trust_remote_code=True
62
  )
63
+ logger.info(f"Model loaded successfully on {self.device}")
64
  except Exception as e:
65
  logger.error(f"Error initializing model: {e}")
66
  raise
 
90
  truncation=True,
91
  max_length=512,
92
  padding=True
93
+ ).to(self.device) # Move inputs to GPU
94
 
95
  with torch.no_grad():
96
  outputs = self.model.generate(
 
115
  # Update metrics
116
  self.update_metrics(review)
117
 
118
+ # Clear GPU memory
119
+ if torch.cuda.is_available():
120
+ del inputs, outputs
121
+ torch.cuda.empty_cache()
122
+
123
  return suggestions
124
 
125
  except Exception as e:
 
160
  return {
161
  'Total Reviews': self.metrics['total_reviews'],
162
  'Average Response Time': f"{self.metrics['avg_response_time']:.2f}s",
163
+ 'Reviews Today': self.metrics['reviews_today'],
164
+ 'Device': str(self.device)
165
  }
166
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
  # Create Gradio interface
168
  with gr.Blocks(theme=gr.themes.Soft()) as iface:
169
  gr.Markdown("# Code Review Assistant")
 
194
  refresh_history = gr.Button("Refresh History")
195
  history_output = gr.Textbox(
196
  label="Review History",
197
+ lines=20
 
198
  )
199
 
200
  with gr.Tab("Metrics"):
201
  refresh_metrics = gr.Button("Refresh Metrics")
202
  metrics_output = gr.JSON(
203
+ label="Performance Metrics"
 
204
  )
205
 
206
+ # Initialize reviewer
207
+ reviewer = CodeReviewer()
208
+
209
  # Set up event handlers
210
+ def review_code_interface(code: str, language: str) -> str:
211
+ if not code.strip():
212
+ return "Please enter some code to review."
213
+ try:
214
+ return reviewer.review_code(code, language)
215
+ except Exception as e:
216
+ return f"Error: {str(e)}"
217
+
218
+ def get_history_interface() -> str:
219
+ history = reviewer.get_history()
220
+ if not history:
221
+ return "No reviews yet."
222
+ result = ""
223
+ for review in history:
224
+ result += f"Time: {review['timestamp']}\n"
225
+ result += f"Language: {review['language']}\n"
226
+ result += f"Response Time: {review['response_time']}\n"
227
+ result += "Code:\n```\n" + review['code'] + "\n```\n"
228
+ result += "Suggestions:\n" + review['suggestions'] + "\n"
229
+ result += "-" * 80 + "\n\n"
230
+ return result
231
+
232
+ def get_metrics_interface() -> Dict:
233
+ return reviewer.get_metrics()
234
+
235
  submit_btn.click(
236
  review_code_interface,
237
  inputs=[code_input, language_input],