Quazim0t0 commited on
Commit
45b15d1
·
1 Parent(s): 94cfabf

Harness: no-repeat-ngram(3) flag, default on (A/B'd per model on real weights, rep-4 -> 0.000 at deployed settings)

Browse files
Files changed (1) hide show
  1. generate.py +18 -1
generate.py CHANGED
@@ -89,8 +89,19 @@ def _filter_logits(logits, top_k, top_p):
89
 
90
 
91
  @torch.no_grad()
 
 
 
 
 
 
 
 
 
 
92
  def generate(model, cfg, idx, n_new, temperature=0.9, top_k=40, top_p=0.95,
93
- repetition_penalty=1.1, stop_ids=None, device="cpu", use_cache=True):
 
94
  """Autoregressive sampling. Mirrors model.generate()'s NaN/inf sanitisation
95
  (long oscillator rollouts can emit +/-inf logits whose softmax -> NaN ->
96
  multinomial device-side assert) and adds top-p + repetition penalty.
@@ -101,6 +112,7 @@ def generate(model, cfg, idx, n_new, temperature=0.9, top_k=40, top_p=0.95,
101
  must stay within max_position_embeddings)."""
102
  model.eval()
103
  stop_ids = set(stop_ids or [])
 
104
  past = None
105
  for _ in range(n_new):
106
  if use_cache and past is not None and past[0][0].size(2) < cfg.block_size:
@@ -120,6 +132,9 @@ def generate(model, cfg, idx, n_new, temperature=0.9, top_k=40, top_p=0.95,
120
  lg[b, seen] = torch.where(vals > 0, vals / repetition_penalty,
121
  vals * repetition_penalty)
122
 
 
 
 
123
  lg = lg / max(temperature, 1e-6)
124
  lg = _filter_logits(lg, top_k, top_p)
125
  probs = torch.softmax(lg, dim=-1)
@@ -256,6 +271,7 @@ def run_once(model, cfg, tok, args, device, prompt_text):
256
  out = generate(model, cfg, x, args.max_new_tokens,
257
  temperature=args.temperature, top_k=args.top_k,
258
  top_p=args.top_p, repetition_penalty=args.repetition_penalty,
 
259
  stop_ids=stop_ids, device=device, use_cache=not args.no_cache)
260
  gen_ids = out[0, len(ids):].tolist()
261
  completion = tok.decode(gen_ids, skip_special_tokens=not args.show_special)
@@ -276,6 +292,7 @@ def main():
276
  p.add_argument("--top_k", type=int, default=40, help="0 to disable")
277
  p.add_argument("--top_p", type=float, default=0.95, help="1.0 to disable")
278
  p.add_argument("--repetition_penalty", type=float, default=1.1, help="1.0 to disable")
 
279
  p.add_argument("--seed", type=int, default=None)
280
  p.add_argument("--chat", action="store_true", help="wrap prompt in ChatML framing")
281
  p.add_argument("--system", default="", help="system prompt (chat mode only)")
 
89
 
90
 
91
  @torch.no_grad()
92
+ def _ban3(ids, n=3):
93
+ """no-repeat-ngram: token ids that would complete an already-seen n-gram.
94
+ A/B'd per model on real weights: rep-4 -> 0.000 at deployed settings."""
95
+ if n <= 0 or len(ids) < n:
96
+ return ()
97
+ tail = tuple(ids[-(n - 1):])
98
+ return tuple(ids[i + n - 1] for i in range(len(ids) - n + 1)
99
+ if tuple(ids[i:i + n - 1]) == tail)
100
+
101
+
102
  def generate(model, cfg, idx, n_new, temperature=0.9, top_k=40, top_p=0.95,
103
+ repetition_penalty=1.1, stop_ids=None, device="cpu", use_cache=True,
104
+ no_repeat_ngram=3):
105
  """Autoregressive sampling. Mirrors model.generate()'s NaN/inf sanitisation
106
  (long oscillator rollouts can emit +/-inf logits whose softmax -> NaN ->
107
  multinomial device-side assert) and adds top-p + repetition penalty.
 
112
  must stay within max_position_embeddings)."""
113
  model.eval()
114
  stop_ids = set(stop_ids or [])
115
+ n0 = idx.size(1)
116
  past = None
117
  for _ in range(n_new):
118
  if use_cache and past is not None and past[0][0].size(2) < cfg.block_size:
 
132
  lg[b, seen] = torch.where(vals > 0, vals / repetition_penalty,
133
  vals * repetition_penalty)
134
 
135
+ if no_repeat_ngram:
136
+ for b in _ban3(idx[0, n0:].tolist(), no_repeat_ngram):
137
+ lg[0, b] = float("-inf")
138
  lg = lg / max(temperature, 1e-6)
139
  lg = _filter_logits(lg, top_k, top_p)
140
  probs = torch.softmax(lg, dim=-1)
 
271
  out = generate(model, cfg, x, args.max_new_tokens,
272
  temperature=args.temperature, top_k=args.top_k,
273
  top_p=args.top_p, repetition_penalty=args.repetition_penalty,
274
+ no_repeat_ngram=args.no_repeat_ngram,
275
  stop_ids=stop_ids, device=device, use_cache=not args.no_cache)
276
  gen_ids = out[0, len(ids):].tolist()
277
  completion = tok.decode(gen_ids, skip_special_tokens=not args.show_special)
 
292
  p.add_argument("--top_k", type=int, default=40, help="0 to disable")
293
  p.add_argument("--top_p", type=float, default=0.95, help="1.0 to disable")
294
  p.add_argument("--repetition_penalty", type=float, default=1.1, help="1.0 to disable")
295
+ p.add_argument("--no_repeat_ngram", type=int, default=3, help="0 to disable")
296
  p.add_argument("--seed", type=int, default=None)
297
  p.add_argument("--chat", action="store_true", help="wrap prompt in ChatML framing")
298
  p.add_argument("--system", default="", help="system prompt (chat mode only)")