Files
2026-07-13 13:25:10 +08:00

59 lines
2.3 KiB
Python

"""Helpers shared by the Fun-ASR-Nano vLLM serving paths.
Kept dependency-free (standard library only) so it can be imported and unit
tested without a CUDA device or a vLLM installation.
"""
import logging
logger = logging.getLogger("funasr.fun_asr_nano.vllm")
# A repetition penalty of 1.0 is the identity value, i.e. "no penalty".
NEUTRAL_REPETITION_PENALTY = 1.0
# Warn only once per process so streaming/batch loops do not spam the log.
_warned_prompt_embeds = False
def resolve_repetition_penalty(repetition_penalty, *, prompt_embeds=True):
"""Return a repetition penalty that is safe for the requested vLLM mode.
Fun-ASR-Nano feeds vLLM precomputed audio/text *embeddings* with
``enable_prompt_embeds=True``. In that mode a request carries no prompt
token IDs. vLLM applies ``repetition_penalty`` by scattering over the
prompt's token IDs, so any value other than 1.0 indexes an empty token-id
tensor and aborts the engine with a CUDA
``scatter gather kernel index out of bounds`` assertion (issue #2948).
When ``prompt_embeds`` is True we therefore force the penalty back to the
neutral value and warn once. With ``prompt_embeds=False`` (regular
token-prompt decoding) the requested value is passed through unchanged.
Args:
repetition_penalty: Penalty requested by the caller. ``None`` is
treated as "unset" and maps to the neutral value.
prompt_embeds: Whether the request runs in vLLM prompt-embeds mode.
Returns:
A repetition penalty that will not crash the engine.
"""
global _warned_prompt_embeds
if repetition_penalty is None:
return NEUTRAL_REPETITION_PENALTY
if prompt_embeds and repetition_penalty != NEUTRAL_REPETITION_PENALTY:
if not _warned_prompt_embeds:
logger.warning(
"repetition_penalty=%s is not supported in vLLM prompt-embeds "
"mode (no prompt token IDs to penalize) and would trigger a CUDA "
"scatter index-out-of-bounds crash; using repetition_penalty=%s "
"instead. See https://github.com/modelscope/FunASR/issues/2948.",
repetition_penalty,
NEUTRAL_REPETITION_PENALTY,
)
_warned_prompt_embeds = True
return NEUTRAL_REPETITION_PENALTY
return repetition_penalty