VedNav1 commited on
Commit
d240203
·
1 Parent(s): 4724d74

Fix LLM for ai assisstant

Browse files
Files changed (1) hide show
  1. models/llm.py +2 -77
models/llm.py CHANGED
@@ -13,16 +13,11 @@ from config import LLM_MODEL, DEVICE, MODELS_DIR, MAX_NEW_TOKENS, TEMPERATURE, T
13
 
14
  class LanguageModel:
15
  def __init__(self):
16
- <<<<<<< HEAD
17
- print(f"Loading language model: {LLM_MODEL}")
18
 
19
- # Quantization config for GPU (optional, only if you want smaller models)
20
  quantization_config = None
21
-
22
- # Only use quantization if on GPU
23
  if DEVICE == "cuda":
24
  try:
25
- # Try 8-bit quantization (recommended)
26
  quantization_config = BitsAndBytesConfig(
27
  load_in_8bit=True,
28
  llm_int8_threshold=6.0
@@ -32,34 +27,17 @@ class LanguageModel:
32
  print("8-bit quantization not available, using full precision")
33
 
34
  # Load tokenizer
35
- =======
36
- print(f"Loading local language model: {LLM_MODEL} on {DEVICE}...")
37
-
38
- quantization_config = None
39
- if DEVICE == "cuda":
40
- try:
41
- quantization_config = BitsAndBytesConfig(load_in_8bit=True, llm_int8_threshold=6.0)
42
- except:
43
- pass
44
-
45
- >>>>>>> a06ff7e70b83069b439c95563bab4f3822d242b1
46
  self.tokenizer = AutoTokenizer.from_pretrained(
47
  LLM_MODEL,
48
  cache_dir=str(MODELS_DIR),
49
  trust_remote_code=True
50
  )
51
 
52
- <<<<<<< HEAD
53
  # Set pad token if not set
54
  if self.tokenizer.pad_token is None:
55
  self.tokenizer.pad_token = self.tokenizer.eos_token
56
 
57
  # Load model
58
- =======
59
- if self.tokenizer.pad_token is None:
60
- self.tokenizer.pad_token = self.tokenizer.eos_token
61
-
62
- >>>>>>> a06ff7e70b83069b439c95563bab4f3822d242b1
63
  self.model = AutoModelForCausalLM.from_pretrained(
64
  LLM_MODEL,
65
  cache_dir=str(MODELS_DIR),
@@ -73,16 +51,11 @@ class LanguageModel:
73
  self.model = self.model.to(DEVICE)
74
 
75
  self.model.eval()
76
- <<<<<<< HEAD
77
- print(f"✓ Language model loaded on {DEVICE}")
78
- =======
79
- print(f"✓ Local Language model loaded successfully!")
80
- >>>>>>> a06ff7e70b83069b439c95563bab4f3822d242b1
81
 
82
  def generate(
83
  self,
84
  prompt: str,
85
- <<<<<<< HEAD
86
  max_new_tokens: int = 150,
87
  temperature: float = TEMPERATURE,
88
  top_p: float = TOP_P
@@ -97,31 +70,10 @@ class LanguageModel:
97
  max_length=768, # cap input; single-MCQ prompts are <512 tokens
98
  ).to(self.model.device)
99
 
100
- =======
101
- max_new_tokens: int = MAX_NEW_TOKENS,
102
- temperature: float = TEMPERATURE,
103
- top_p: float = TOP_P
104
- ) -> str:
105
- """Generate text locally"""
106
-
107
- # 👉 THE FIX: TinyLlama requires strict Chat Templates.
108
- # Without this, it loops infinitely and causes timeouts.
109
- is_chat = "chat" in LLM_MODEL.lower() or "instruct" in LLM_MODEL.lower()
110
- if is_chat:
111
- formatted_prompt = f"<|system|>\nYou are an expert educational AI that strictly follows instructions.</s>\n<|user|>\n{prompt}</s>\n<|assistant|>\n"
112
- else:
113
- formatted_prompt = prompt
114
-
115
- inputs = self.tokenizer(formatted_prompt, return_tensors="pt").to(self.model.device)
116
-
117
- print(f"🤖 Generating locally (up to {max_new_tokens} tokens). This may take 2-4 minutes on a free CPU Space...")
118
-
119
- >>>>>>> a06ff7e70b83069b439c95563bab4f3822d242b1
120
  with torch.no_grad():
121
  outputs = self.model.generate(
122
  **inputs,
123
  max_new_tokens=max_new_tokens,
124
- <<<<<<< HEAD
125
  max_length=None,
126
  do_sample=False, # greedy — ~3x faster than sampling
127
  pad_token_id=self.tokenizer.pad_token_id,
@@ -134,40 +86,13 @@ class LanguageModel:
134
  generated_ids = outputs[0][input_len:]
135
  generated_text = self.tokenizer.decode(generated_ids, skip_special_tokens=True)
136
  return generated_text.strip()
137
- =======
138
- temperature=temperature,
139
- top_p=top_p,
140
- do_sample=True,
141
- pad_token_id=self.tokenizer.pad_token_id,
142
- eos_token_id=self.tokenizer.eos_token_id
143
- )
144
-
145
- generated_text = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
146
-
147
- # Clean up the output to return ONLY the generated MCQs
148
- clean_input = self.tokenizer.decode(inputs['input_ids'][0], skip_special_tokens=True)
149
- if generated_text.startswith(clean_input):
150
- generated_text = generated_text[len(clean_input):].strip()
151
-
152
- if "<|assistant|>" in generated_text:
153
- generated_text = generated_text.split("<|assistant|>")[-1].strip()
154
-
155
- return generated_text
156
- >>>>>>> a06ff7e70b83069b439c95563bab4f3822d242b1
157
 
158
  # Singleton instance
159
  _llm_model = None
160
 
161
  def get_llm_model() -> LanguageModel:
162
- <<<<<<< HEAD
163
  """Get or create LLM instance"""
164
  global _llm_model
165
  if _llm_model is None:
166
  _llm_model = LanguageModel()
167
  return _llm_model
168
- =======
169
- global _llm_model
170
- if _llm_model is None:
171
- _llm_model = LanguageModel()
172
- return _llm_model
173
- >>>>>>> a06ff7e70b83069b439c95563bab4f3822d242b1
 
13
 
14
  class LanguageModel:
15
  def __init__(self):
16
+ print(f"Loading local language model: {LLM_MODEL} on {DEVICE}...")
 
17
 
 
18
  quantization_config = None
 
 
19
  if DEVICE == "cuda":
20
  try:
 
21
  quantization_config = BitsAndBytesConfig(
22
  load_in_8bit=True,
23
  llm_int8_threshold=6.0
 
27
  print("8-bit quantization not available, using full precision")
28
 
29
  # Load tokenizer
 
 
 
 
 
 
 
 
 
 
 
30
  self.tokenizer = AutoTokenizer.from_pretrained(
31
  LLM_MODEL,
32
  cache_dir=str(MODELS_DIR),
33
  trust_remote_code=True
34
  )
35
 
 
36
  # Set pad token if not set
37
  if self.tokenizer.pad_token is None:
38
  self.tokenizer.pad_token = self.tokenizer.eos_token
39
 
40
  # Load model
 
 
 
 
 
41
  self.model = AutoModelForCausalLM.from_pretrained(
42
  LLM_MODEL,
43
  cache_dir=str(MODELS_DIR),
 
51
  self.model = self.model.to(DEVICE)
52
 
53
  self.model.eval()
54
+ print(f"✓ Local Language model loaded successfully on {DEVICE}!")
 
 
 
 
55
 
56
  def generate(
57
  self,
58
  prompt: str,
 
59
  max_new_tokens: int = 150,
60
  temperature: float = TEMPERATURE,
61
  top_p: float = TOP_P
 
70
  max_length=768, # cap input; single-MCQ prompts are <512 tokens
71
  ).to(self.model.device)
72
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
73
  with torch.no_grad():
74
  outputs = self.model.generate(
75
  **inputs,
76
  max_new_tokens=max_new_tokens,
 
77
  max_length=None,
78
  do_sample=False, # greedy — ~3x faster than sampling
79
  pad_token_id=self.tokenizer.pad_token_id,
 
86
  generated_ids = outputs[0][input_len:]
87
  generated_text = self.tokenizer.decode(generated_ids, skip_special_tokens=True)
88
  return generated_text.strip()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
 
90
  # Singleton instance
91
  _llm_model = None
92
 
93
  def get_llm_model() -> LanguageModel:
 
94
  """Get or create LLM instance"""
95
  global _llm_model
96
  if _llm_model is None:
97
  _llm_model = LanguageModel()
98
  return _llm_model