본문으로 건너뛰기

[faster-qwen3-tts] HF Space에 1000자 텍스트 제한 추가로 CUDA static cache overflow 방지

PR 링크: andimarafioti/faster-qwen3-tts#33 상태: Merged | 변경: +36 / -0

들어가며

faster-qwen3-tts는 CUDA graph 캡처를 위해 StaticCache(max_seq_len=2048)을 사용한다. 사용자가 이 제한을 초과하는 텍스트를 입력하면 KV cache 범위를 넘어서 index error나 잘못된 출력이 발생한다. HF Space 등 공개 데모에서 이를 방지해야 한다.

핵심 코드 분석

입력 제한 상수 정의

# ~3-4 chars/token for English, system/ref token 오버헤드를 고려하면
# ~1000자가 max_seq_len=2048의 안전 상한
MAX_TEXT_CHARS = 1000
# ~10 MB는 44.1kHz stereo 16-bit WAV 기준 약 1분
MAX_AUDIO_BYTES = 10 * 1024 * 1024

4개 엔드포인트에 검증 추가

Before:

async def generate_stream(text, ...):
    if not _active_model_name:
        raise HTTPException(status_code=400, detail="Model not loaded.")
    # 바로 생성 시작 - 입력 크기 무제한

After:

async def generate_stream(text, ...):
    if not _active_model_name:
        raise HTTPException(status_code=400, detail="Model not loaded.")
    if len(text) > MAX_TEXT_CHARS:
        raise HTTPException(
            status_code=400,
            detail=f"Text too long ({len(text)} chars). Maximum is {MAX_TEXT_CHARS}.",
        )
    # 오디오 파일 크기도 검증
    if len(content) > MAX_AUDIO_BYTES:
        raise HTTPException(status_code=400, detail=_AUDIO_TOO_LARGE_MSG.format(...))

streaming, non-streaming, transcribe 3개 엔드포인트 모두에 동일한 검증이 적용된다.

왜 이게 좋은가

  1. CUDA crash 방지: StaticCache 범위 초과 시 segfault 또는 corrupted output이 발생할 수 있다. 서버 레벨에서 차단이 필수다.
  2. 사용자 친화적 에러: "Text too long (1500 chars). Maximum is 1000 characters." 같은 명확한 메시지를 반환한다.
  3. DoS 방지: 거대한 오디오 파일이나 매우 긴 텍스트로 인한 서버 과부하를 막는다.

정리

CUDA graph의 static cache는 고정 크기라는 근본적 제약이 있다. 이를 서버 입력 검증으로 보호하는 것은 프로덕션 배포의 기본이며, 이 PR은 텍스트와 오디오 양쪽 모두를 커버하는 방어적 구현이다.

참고 자료


이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 코드 분석과 해석에서 오류가 있을 수 있으니, 정확한 내용은 원본 PR을 참고해주세요.

댓글

관련 포스트

PR Analysis 의 다른글