tararad commited on
Commit
cb972c3
·
verified ·
1 Parent(s): 3a4d516

Update detector.py

Browse files
Files changed (1) hide show
  1. detector.py +26 -36
detector.py CHANGED
@@ -5,11 +5,10 @@ import os
5
  import spaces
6
 
7
  os.environ["TOKENIZERS_PARALLELISM"] = "false"
8
- torch.set_grad_enabled(False) # Disable gradients globally
9
 
10
  class CustomDetector:
11
- def __init__(self, model_name="tiiuae/falcon-rw-1b", max_length=256):
12
- self.device = "cuda" if torch.cuda.is_available() else "cpu" # Prefer GPU
13
  self.model_name = model_name
14
  self.max_length = max_length
15
  self.tokenizer = None
@@ -17,16 +16,13 @@ class CustomDetector:
17
 
18
  @spaces.GPU
19
  def load_model(self):
20
- """Load model and tokenizer on GPU."""
21
  try:
22
  if self.tokenizer is None:
23
  self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
24
  if self.model is None:
25
- self.model = AutoModelForCausalLM.from_pretrained(
26
- self.model_name,
27
- torch_dtype=torch.bfloat16, # Use bfloat16 for GPU efficiency
28
- device_map="cuda" # Auto-map to GPU
29
- )
30
  self.model.eval()
31
  if self.tokenizer.pad_token is None:
32
  self.tokenizer.pad_token = self.tokenizer.eos_token
@@ -34,43 +30,37 @@ class CustomDetector:
34
  raise RuntimeError(f"Failed to load model {self.model_name}: {str(e)}")
35
 
36
  @spaces.GPU
37
- def my_detector(self, texts: list[str], batch_size: int = 8) -> list[float]:
38
- """Compute perplexity-based scores for texts."""
39
  if self.model is None or self.tokenizer is None:
40
  self.load_model()
41
 
42
  try:
43
- all_scores = []
44
- for i in range(0, len(texts), batch_size):
45
- batch_texts = texts[i:i + batch_size]
46
  tokenized = self.tokenizer(
47
- batch_texts,
48
  truncation=True,
49
- padding="longest" if len(batch_texts) > 1 else False, # Dynamic padding
50
  max_length=self.max_length,
51
- return_tensors="pt"
52
  )
53
- input_ids = tokenized["input_ids"].to(self.device)
54
- attention_mask = tokenized["attention_mask"].to(self.device)
 
 
 
 
 
55
 
56
- with torch.inference_mode(): # Ensure no gradients
57
- outputs = self.model(input_ids, attention_mask=attention_mask)
58
- logits = outputs.logits[:, :-1, :]
59
- labels = input_ids[:, 1:]
60
 
61
- # Compute perplexity: mean negative log-likelihood
62
- log_probs = F.log_softmax(logits, dim=-1)
63
- neg_log_likelihood = F.cross_entropy(
64
- logits.view(-1, logits.size(-1)),
65
- labels.view(-1),
66
- reduction="none"
67
- ).view(labels.size())
68
- attention_mask = attention_mask[:, 1:]
69
- perplexity = (neg_log_likelihood * attention_mask).sum(dim=-1) / attention_mask.sum(dim=-1).clamp(min=1)
70
- all_scores.extend(perplexity.tolist())
71
 
72
- torch.cuda.synchronize() # Ensure GPU operations complete
73
 
74
- return all_scores
75
  except Exception as e:
76
- raise RuntimeError(f"Error computing score: {str(e)}")
 
5
  import spaces
6
 
7
  os.environ["TOKENIZERS_PARALLELISM"] = "false"
 
8
 
9
  class CustomDetector:
10
+ def __init__(self, model_name="tiiuae/falcon-rw-1b", max_length=512):
11
+ self.device = "cuda" if torch.cuda.is_available() else "cpu"
12
  self.model_name = model_name
13
  self.max_length = max_length
14
  self.tokenizer = None
 
16
 
17
  @spaces.GPU
18
  def load_model(self):
19
+ """Load model and tokenizer on GPU when called."""
20
  try:
21
  if self.tokenizer is None:
22
  self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
23
  if self.model is None:
24
+ self.model = AutoModelForCausalLM.from_pretrained(self.model_name, torch_dtype=torch.float16)
25
+ self.model.to(self.device)
 
 
 
26
  self.model.eval()
27
  if self.tokenizer.pad_token is None:
28
  self.tokenizer.pad_token = self.tokenizer.eos_token
 
30
  raise RuntimeError(f"Failed to load model {self.model_name}: {str(e)}")
31
 
32
  @spaces.GPU
33
+ def my_detector(self, texts: list[str]) -> list[float]:
 
34
  if self.model is None or self.tokenizer is None:
35
  self.load_model()
36
 
37
  try:
38
+ with torch.no_grad():
 
 
39
  tokenized = self.tokenizer(
40
+ texts,
41
  truncation=True,
42
+ padding=True,
43
  max_length=self.max_length,
44
+ return_tensors="pt",
45
  )
46
+ tokenized = {k: v.to(self.device) for k, v in tokenized.items()}
47
+ input_ids = tokenized["input_ids"]
48
+ attention_mask = tokenized["attention_mask"]
49
+
50
+ outputs = self.model(**tokenized)
51
+ logits = outputs.logits[:, :-1, :]
52
+ labels = tokenized["input_ids"][:, 1:]
53
 
54
+ log_probs = F.log_softmax(logits, dim=-1)
55
+ ll_per_token = log_probs.gather(2, labels.unsqueeze(-1)).squeeze(-1)
56
+ attention_mask = tokenized["attention_mask"][:, 1:]
57
+ ll_per_sample = (ll_per_token * attention_mask).sum(dim=-1) / attention_mask.sum(dim=1).clamp(min=1)
58
 
59
+ neg_entropy = (log_probs.exp() * log_probs)
60
+ entropy_per_sample = -(neg_entropy.sum(dim=-1) * attention_mask).sum(-1) / attention_mask.sum(dim=1).clamp(min=1)
 
 
 
 
 
 
 
 
61
 
62
+ scores = (abs(entropy_per_sample + ll_per_sample)).cpu().tolist()
63
 
64
+ return scores
65
  except Exception as e:
66
+ raise RuntimeError(f"Error computing score: {str(e)}")