From 21a919d79f47829c1c9b11d7e067af4499fdf063 Mon Sep 17 00:00:00 2001 From: Ceaser1717 Date: Tue, 21 Oct 2025 16:02:03 +0530 Subject: [PATCH] =?UTF-8?q?Fix:=20prevent=20infinite=20=E2=80=9CA5A5A5...?= =?UTF-8?q?=E2=80=9D=20repetition=20loop=20during=20text=20generation=20(I?= =?UTF-8?q?ssue=20#1008)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added a simple repetition detection inside the generate() loop to stop the model from endlessly producing patterns like “A5A5A5...”. - Imported `re` for regex pattern matching. - Stops generation if “A5” repeats 10+ times or the same token appears 10 times. - Prints a warning and exits safely instead of looping infinitely. Fixes: #1008 --- inference/generate.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/inference/generate.py b/inference/generate.py index 7e9bffe..bc2b55d 100644 --- a/inference/generate.py +++ b/inference/generate.py @@ -9,6 +9,7 @@ from transformers import AutoTokenizer from safetensors.torch import load_model from model import Transformer, ModelArgs +import re def sample(logits, temperature: float = 1.0): @@ -67,6 +68,24 @@ def generate( tokens[:, cur_pos] = next_token finished |= torch.logical_and(~prompt_mask[:, cur_pos], next_token == eos_id) prev_pos = cur_pos + # === FIX for DeepSeek-V3 Issue #1008 === + # Detect infinite repeating loops like "A5A5A5A5..." or same token repetition + + # Convert current generated tokens to string for pattern check + decoded_output = "".join([str(t) for t in tokens[0, :cur_pos].tolist()]) + + # (a) Detect if "A5" repeats 10 or more times continuously + if re.search(r"(A5){10,}", decoded_output): + print("[Warning] Detected excessive 'A5' repetition — stopping generation early.") + break + + # (b) Detect same token repeated multiple times (generic loop check) + if cur_pos > 10: + last_10 = tokens[0, cur_pos-10:cur_pos].tolist() + if len(set(last_10)) == 1: + print("[Warning] Detected same token repetition — stopping generation early.") + break + # === END FIX === if finished.all(): break completion_tokens = []