Syncbuz120 commited on
Commit
a0a6f9a
·
1 Parent(s): e447f1a
Files changed (1) hide show
  1. model/generate.py +68 -20
model/generate.py CHANGED
@@ -82,33 +82,55 @@ def get_optimal_model_for_memory():
82
  available_memory = psutil.virtual_memory().available / (1024 * 1024) # MB
83
  logger.info(f"Available memory: {available_memory:.1f}MB")
84
 
85
- if available_memory < 300:
86
  return None # Use template fallback
87
- elif available_memory < 600:
88
  return "microsoft/DialoGPT-small"
89
  else:
90
  return "distilgpt2"
91
 
92
  def load_model_with_memory_optimization(model_name):
93
- """Load model with low memory settings."""
94
  try:
95
  logger.info(f"Loading {model_name} with memory optimizations...")
96
 
97
- tokenizer = AutoTokenizer.from_pretrained(model_name, padding_side='left', use_fast=True)
 
 
 
 
 
98
 
 
99
  if tokenizer.pad_token is None:
100
- tokenizer.pad_token = tokenizer.eos_token
 
 
 
101
 
 
102
  model = AutoModelForCausalLM.from_pretrained(
103
  model_name,
104
- torch_dtype=torch.float16,
105
- device_map="cpu",
106
- low_cpu_mem_usage=True,
107
- use_cache=False,
 
108
  )
109
 
 
 
 
 
110
  model.eval()
111
- model.gradient_checkpointing_enable()
 
 
 
 
 
 
 
112
  logger.info(f"✅ Model {model_name} loaded successfully")
113
  return tokenizer, model
114
 
@@ -168,6 +190,20 @@ def generate_authentication_tests(matches: List[str]) -> List[Dict]:
168
  ],
169
  "expected": "Login fails with appropriate error message 'Invalid credentials'",
170
  "postconditions": ["User remains on login page", "Account security maintained"],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  "test_data": "Valid username: [email protected], Invalid password: WrongPass123"
172
  },
173
  {
@@ -559,7 +595,7 @@ def parse_generated_test_cases(generated_text: str) -> List[Dict]:
559
  return test_cases
560
 
561
  def generate_with_ai_model(srs_text: str, tokenizer, model) -> List[Dict]:
562
- """Generate test cases using AI model"""
563
  max_input_length = 300
564
  if len(srs_text) > max_input_length:
565
  srs_text = srs_text[:max_input_length]
@@ -571,27 +607,40 @@ Test Cases:
571
  1."""
572
 
573
  try:
574
- inputs = tokenizer.encode(
 
575
  prompt,
576
  return_tensors="pt",
577
  max_length=200,
578
- truncation=True
 
 
579
  )
580
 
 
 
 
 
581
  with torch.no_grad():
582
  outputs = model.generate(
583
- inputs,
 
584
  max_new_tokens=150,
585
  num_return_sequences=1,
586
  temperature=0.7,
587
  do_sample=True,
588
- pad_token_id=tokenizer.eos_token_id,
589
- use_cache=False,
 
590
  )
591
 
592
  generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
593
- del inputs, outputs
594
- torch.cuda.empty_cache() if torch.cuda.is_available() else None
 
 
 
 
595
  return parse_generated_test_cases(generated_text)
596
 
597
  except Exception as e:
@@ -680,5 +729,4 @@ def get_algorithm_reason(model_name: str) -> str:
680
  "Uses comprehensive pattern matching, requirement analysis, and structured test case templates for robust test coverage.")
681
  else:
682
  return ("Model selected based on optimal tradeoff between memory usage, language generation capability, "
683
- "and test case quality requirements.")
684
-
 
82
  available_memory = psutil.virtual_memory().available / (1024 * 1024) # MB
83
  logger.info(f"Available memory: {available_memory:.1f}MB")
84
 
85
+ if available_memory < 500:
86
  return None # Use template fallback
87
+ elif available_memory < 1000:
88
  return "microsoft/DialoGPT-small"
89
  else:
90
  return "distilgpt2"
91
 
92
  def load_model_with_memory_optimization(model_name):
93
+ """Load model with low memory settings - FIXED VERSION."""
94
  try:
95
  logger.info(f"Loading {model_name} with memory optimizations...")
96
 
97
+ # Load tokenizer first
98
+ tokenizer = AutoTokenizer.from_pretrained(
99
+ model_name,
100
+ padding_side='left',
101
+ use_fast=True
102
+ )
103
 
104
+ # Fix tokenizer pad token issue
105
  if tokenizer.pad_token is None:
106
+ if tokenizer.eos_token is not None:
107
+ tokenizer.pad_token = tokenizer.eos_token
108
+ else:
109
+ tokenizer.add_special_tokens({'pad_token': '[PAD]'})
110
 
111
+ # Load model with corrected parameters
112
  model = AutoModelForCausalLM.from_pretrained(
113
  model_name,
114
+ torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
115
+ device_map=None, # Don't use device_map with low_cpu_mem_usage
116
+ low_cpu_mem_usage=False, # Disable to avoid meta tensor issues
117
+ use_cache=True, # Enable cache for better performance
118
+ trust_remote_code=True
119
  )
120
 
121
+ # Move to CPU explicitly if needed
122
+ if torch.cuda.is_available():
123
+ model = model.to('cpu')
124
+
125
  model.eval()
126
+
127
+ # Only enable gradient checkpointing if model supports it
128
+ if hasattr(model, 'gradient_checkpointing_enable'):
129
+ try:
130
+ model.gradient_checkpointing_enable()
131
+ except Exception as e:
132
+ logger.warning(f"Could not enable gradient checkpointing: {e}")
133
+
134
  logger.info(f"✅ Model {model_name} loaded successfully")
135
  return tokenizer, model
136
 
 
190
  ],
191
  "expected": "Login fails with appropriate error message 'Invalid credentials'",
192
  "postconditions": ["User remains on login page", "Account security maintained"],
193
+ "test_data": "Invalid username: [email protected], Valid password: Test@123"
194
+ },
195
+ {
196
+ "title": "Invalid Password Login",
197
+ "description": "Verify that login fails with invalid password",
198
+ "preconditions": ["Application is accessible"],
199
+ "steps": [
200
+ "Navigate to login page",
201
+ "Enter valid username",
202
+ "Enter invalid password",
203
+ "Click login button"
204
+ ],
205
+ "expected": "Login fails with appropriate error message 'Invalid credentials'",
206
+ "postconditions": ["User remains on login page", "Account security maintained"],
207
  "test_data": "Valid username: [email protected], Invalid password: WrongPass123"
208
  },
209
  {
 
595
  return test_cases
596
 
597
  def generate_with_ai_model(srs_text: str, tokenizer, model) -> List[Dict]:
598
+ """Generate test cases using AI model - FIXED VERSION"""
599
  max_input_length = 300
600
  if len(srs_text) > max_input_length:
601
  srs_text = srs_text[:max_input_length]
 
607
  1."""
608
 
609
  try:
610
+ # Encode with proper attention mask
611
+ inputs = tokenizer(
612
  prompt,
613
  return_tensors="pt",
614
  max_length=200,
615
+ truncation=True,
616
+ padding=True,
617
+ return_attention_mask=True
618
  )
619
 
620
+ # Extract input_ids and attention_mask
621
+ input_ids = inputs['input_ids']
622
+ attention_mask = inputs['attention_mask']
623
+
624
  with torch.no_grad():
625
  outputs = model.generate(
626
+ input_ids,
627
+ attention_mask=attention_mask, # Provide attention mask
628
  max_new_tokens=150,
629
  num_return_sequences=1,
630
  temperature=0.7,
631
  do_sample=True,
632
+ pad_token_id=tokenizer.pad_token_id,
633
+ eos_token_id=tokenizer.eos_token_id,
634
+ use_cache=True,
635
  )
636
 
637
  generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
638
+
639
+ # Clean up tensors
640
+ del inputs, input_ids, attention_mask, outputs
641
+ if torch.cuda.is_available():
642
+ torch.cuda.empty_cache()
643
+
644
  return parse_generated_test_cases(generated_text)
645
 
646
  except Exception as e:
 
729
  "Uses comprehensive pattern matching, requirement analysis, and structured test case templates for robust test coverage.")
730
  else:
731
  return ("Model selected based on optimal tradeoff between memory usage, language generation capability, "
732
+ "and test case quality requirements.")