Skip to content

Commit b8d736e

Browse files
committed
fix: remove repetition_penalty from vLLM services (fixes #2950 CUDA assert)
- repetition_penalty is incompatible with enable_prompt_embeds=True in vLLM - Removed from both serve_realtime_ws.py and serve_vllm.py - Added truncate_repetition() post-processing to serve_vllm.py as alternative - serve_realtime_ws.py already has detect_and_fix_hallucination() for this Root cause: vLLM's repetition penalty implementation does scatter on prompt token IDs, but prompt_embeds mode has no token IDs, causing index OOB.
1 parent 679f40c commit b8d736e

2 files changed

Lines changed: 16 additions & 3 deletions

File tree

examples/industrial_data_pretraining/fun_asr_nano/serve_realtime_ws.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,6 @@ def decode(self, is_final=False):
318318
hotwords=self.asr_kwargs.get("hotwords"),
319319
language=self.asr_kwargs.get("language"),
320320
max_new_tokens=200,
321-
repetition_penalty=1.3,
322321
)
323322
text = results[0]["text"] if results else ""
324323
text = _clean_asr_text(text)
@@ -359,7 +358,6 @@ def _decode_segment(self, seg):
359358
hotwords=self.asr_kwargs.get("hotwords"),
360359
language=self.asr_kwargs.get("language"),
361360
max_new_tokens=512,
362-
repetition_penalty=1.3,
363361
)
364362
text = results[0]["text"] if results else ""
365363
text = _clean_asr_text(text)

examples/industrial_data_pretraining/fun_asr_nano/serve_vllm.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,20 @@
3232
logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(levelname)s] %(message)s')
3333
logger = logging.getLogger(__name__)
3434

35+
def truncate_repetition(text, min_repeat_len=3, max_repeats=3):
36+
"""Detect and truncate repetitive patterns in ASR output."""
37+
if not text or len(text) < 20:
38+
return text
39+
n = len(text)
40+
for length in range(min_repeat_len, min(n // max_repeats, 30)):
41+
for start in range(n - length * max_repeats):
42+
chunk = text[start:start + length]
43+
if text[start:start + length * max_repeats] == chunk * max_repeats:
44+
return text[:start + length]
45+
return text
46+
47+
48+
3549
try:
3650
from fastapi import FastAPI, File, UploadFile, Form, WebSocket, WebSocketDisconnect
3751
from fastapi.responses import JSONResponse
@@ -107,7 +121,7 @@ def process_audio(audio_data, sr=16000, language=None, hotwords=None,
107121
return {"text": "", "segments": [], "duration": len(audio_data) / sr}
108122

109123
# vLLM batch ASR
110-
gen_kwargs = {"max_new_tokens": 500, "repetition_penalty": 1.3}
124+
gen_kwargs = {"max_new_tokens": 500}
111125
if language:
112126
gen_kwargs["language"] = language
113127
if hotwords:
@@ -120,6 +134,7 @@ def process_audio(audio_data, sr=16000, language=None, hotwords=None,
120134
full_text_parts = []
121135

122136
for i, (r, (start_ms, end_ms)) in enumerate(zip(results, seg_times)):
137+
r["text"] = truncate_repetition(r["text"])
123138
seg_info = {
124139
"text": r["text"],
125140
"start": start_ms / 1000,

0 commit comments

Comments
 (0)