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- 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)")
|