TaruniSwathi commited on
Commit
4d72b78
·
verified ·
1 Parent(s): d7f1f33

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +62 -79
app.py CHANGED
@@ -1,42 +1,27 @@
1
- import os
2
  import re
3
- import threading
4
 
5
  import gradio as gr
6
- from huggingface_hub import hf_hub_download
7
- from llama_cpp import Llama
 
8
 
9
 
10
- MODEL_REPO = "TaruniSwathi/Qwen2.5-Coder-1.5B-Java-CSharp-GGUF"
11
- MODEL_FILE = "Qwen2.5-Coder-1.5B-Java-CSharp_V2.Q4_K_M.gguf"
12
 
13
- STAGE1_RESPONSE_MARKER = "### Response:\n\n"
14
- STAGE2_RESPONSE_MARKER = "### Response\n"
15
 
16
- # Prevent two users from running CPU inference simultaneously.
17
- generation_lock = threading.Lock()
18
 
19
-
20
- print("Downloading GGUF model...")
21
-
22
- model_path = hf_hub_download(
23
- repo_id=MODEL_REPO,
24
- filename=MODEL_FILE,
25
- )
26
-
27
- print("Loading GGUF model...")
28
-
29
- llm = Llama(
30
- model_path=model_path,
31
- n_ctx=2048,
32
- n_threads=max(1, os.cpu_count() or 2),
33
- n_threads_batch=max(1, os.cpu_count() or 2),
34
- n_batch=64,
35
- n_gpu_layers=0,
36
- use_mmap=True,
37
- verbose=False,
38
  )
39
 
 
40
  print("Model loaded successfully.")
41
 
42
 
@@ -49,29 +34,29 @@ def add_java_hint(instruction: str) -> str:
49
  return f"{instruction} Write the solution in Java."
50
 
51
 
52
- def build_nl_to_java_prompt(instruction: str) -> str:
53
- return (
54
- "### Instruction:\n\n"
55
- f"{add_java_hint(instruction)}\n\n"
56
- "### Response:\n\n"
57
- )
58
 
 
 
 
 
 
 
59
 
60
- def build_java_to_csharp_prompt(java_code: str) -> str:
61
  return (
62
  "### Instruction\n"
63
  "Translate the following Java code into equivalent C#. "
64
  "Write the solution in C#.\n\n"
65
  "### Java\n"
66
- f"{java_code.strip()}\n\n"
67
  "### Response\n"
68
  )
69
 
70
 
71
- def clean_generated_code(text: str) -> str:
72
  text = text.strip()
73
 
74
- # Remove Markdown code fences if the model adds them.
75
  fenced = re.search(
76
  r"```(?:java|csharp|cs|c#)?\s*(.*?)```",
77
  text,
@@ -99,54 +84,56 @@ def clean_generated_code(text: str) -> str:
99
  return text
100
 
101
 
102
- def run_generation(prompt: str, max_tokens: int) -> str:
103
- with generation_lock:
104
- response = llm(
105
- prompt=prompt,
106
- max_tokens=max_tokens,
107
- temperature=0.0,
108
- top_p=1.0,
109
- repeat_penalty=1.0,
110
- echo=False,
111
- stop=[
112
- "</s>",
113
- "<|endoftext|>",
114
- "<|im_end|>",
115
- "### Instruction:",
116
- "### Instruction\n",
117
- ],
118
- )
119
-
120
- return response["choices"][0]["text"]
121
-
122
-
123
  def generate_code(task: str, user_input: str) -> str:
124
  if not user_input or not user_input.strip():
125
  return "Please enter a requirement or Java code."
126
 
127
- try:
128
- if task == "Natural Language → Java":
129
- prompt = build_nl_to_java_prompt(user_input)
130
- generated = run_generation(prompt, max_tokens=300)
131
- language = "java"
132
 
133
- else:
134
- prompt = build_java_to_csharp_prompt(user_input)
135
- generated = run_generation(prompt, max_tokens=400)
136
- language = "csharp"
137
 
138
- code = clean_generated_code(generated)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
 
140
  if not code:
141
  return "The model returned an empty response. Please try again."
142
 
 
 
143
  return f"```{language}\n{code}\n```"
144
 
145
  except Exception as error:
146
- return (
147
- "Generation failed.\n\n"
148
- f"Error: {type(error).__name__}: {error}"
149
- )
 
150
 
151
 
152
  def update_input(task: str):
@@ -258,8 +245,4 @@ if __name__ == "__main__":
258
  demo.queue(
259
  default_concurrency_limit=1,
260
  max_size=10,
261
- ).launch(
262
- server_name="0.0.0.0",
263
- server_port=7860,
264
- show_error=True,
265
- )
 
 
1
  import re
 
2
 
3
  import gradio as gr
4
+ import spaces
5
+ import torch
6
+ from transformers import AutoModelForCausalLM, AutoTokenizer
7
 
8
 
9
+ MODEL_ID = "shibsankardhara2/Qwen2.5-Coder-1.5B-Java-CSharp_V2"
 
10
 
11
+ print("Loading tokenizer...")
12
+ tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
13
 
14
+ if tokenizer.pad_token_id is None:
15
+ tokenizer.pad_token_id = tokenizer.eos_token_id
16
 
17
+ print("Loading model on CPU...")
18
+ model = AutoModelForCausalLM.from_pretrained(
19
+ MODEL_ID,
20
+ torch_dtype=torch.float16,
21
+ low_cpu_mem_usage=True,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  )
23
 
24
+ model.eval()
25
  print("Model loaded successfully.")
26
 
27
 
 
34
  return f"{instruction} Write the solution in Java."
35
 
36
 
37
+ def build_prompt(task: str, user_input: str) -> str:
38
+ user_input = user_input.strip()
 
 
 
 
39
 
40
+ if task == "Natural Language → Java":
41
+ return (
42
+ "### Instruction:\n\n"
43
+ f"{add_java_hint(user_input)}\n\n"
44
+ "### Response:\n\n"
45
+ )
46
 
 
47
  return (
48
  "### Instruction\n"
49
  "Translate the following Java code into equivalent C#. "
50
  "Write the solution in C#.\n\n"
51
  "### Java\n"
52
+ f"{user_input}\n\n"
53
  "### Response\n"
54
  )
55
 
56
 
57
+ def clean_output(text: str) -> str:
58
  text = text.strip()
59
 
 
60
  fenced = re.search(
61
  r"```(?:java|csharp|cs|c#)?\s*(.*?)```",
62
  text,
 
84
  return text
85
 
86
 
87
+ @spaces.GPU(duration=120)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  def generate_code(task: str, user_input: str) -> str:
89
  if not user_input or not user_input.strip():
90
  return "Please enter a requirement or Java code."
91
 
92
+ prompt = build_prompt(task, user_input)
 
 
 
 
93
 
94
+ max_new_tokens = 300 if task == "Natural Language → Java" else 400
 
 
 
95
 
96
+ try:
97
+ model.to("cuda")
98
+
99
+ inputs = tokenizer(
100
+ prompt,
101
+ return_tensors="pt",
102
+ truncation=True,
103
+ max_length=2048,
104
+ ).to("cuda")
105
+
106
+ with torch.inference_mode():
107
+ outputs = model.generate(
108
+ **inputs,
109
+ max_new_tokens=max_new_tokens,
110
+ do_sample=False,
111
+ pad_token_id=tokenizer.eos_token_id,
112
+ eos_token_id=tokenizer.eos_token_id,
113
+ )
114
+
115
+ generated_tokens = outputs[0][inputs["input_ids"].shape[1]:]
116
+
117
+ generated_text = tokenizer.decode(
118
+ generated_tokens,
119
+ skip_special_tokens=True,
120
+ )
121
+
122
+ code = clean_output(generated_text)
123
 
124
  if not code:
125
  return "The model returned an empty response. Please try again."
126
 
127
+ language = "java" if task == "Natural Language → Java" else "csharp"
128
+
129
  return f"```{language}\n{code}\n```"
130
 
131
  except Exception as error:
132
+ return f"Generation failed: {type(error).__name__}: {error}"
133
+
134
+ finally:
135
+ model.to("cpu")
136
+ torch.cuda.empty_cache()
137
 
138
 
139
  def update_input(task: str):
 
245
  demo.queue(
246
  default_concurrency_limit=1,
247
  max_size=10,
248
+ ).launch()