본문으로 건너뛰기

[faster-qwen3-tts] CUDA Graphs 기반 Qwen3-TTS 래퍼를 설치 가능한 Python 패키지로 구조화

PR 링크: andimarafioti/faster-qwen3-tts#2 상태: Merged | 변경: +830 / -303

들어가며

Qwen3-TTS는 강력한 오픈소스 TTS 모델이지만, Python 레벨의 오버헤드로 인해 실시간 성능을 달성하기 어렵습니다. 이 PR은 torch.cuda.CUDAGraph와 StaticCache를 활용하여 RTX 4090에서 RTF 4.56(실시간 대비 4.56배 빠름), Jetson Orin에서 RTF 1.38을 달성하는 최적화 코드를 pip install 가능한 Python 패키지(qwen3_tts_cuda_graphs)로 구조화한 작업입니다.

핵심 코드 분석

1. 패키지 구조 설계

프로젝트가 단일 스크립트 모음에서 설치 가능한 패키지로 전환되었습니다.

Before:

root/
├── fast_generate_v5.py
├── manual_cudagraph_predictor.py
├── manual_cudagraph_talker.py
└── (스크립트 직접 실행)

After:

root/
├── qwen3_tts_cuda_graphs/
│   ├── __init__.py          # Qwen3TTSCudaGraphs 노출
│   ├── model.py             # from_pretrained API
│   ├── predictor_graph.py   # Predictor CUDA Graph 래핑
│   ├── talker_graph.py      # Talker CUDA Graph 래핑
│   └── generate.py          # Non-streaming 생성
├── benchmarks/              # baseline, streaming, throughput, chunk_sweep
└── pyproject.toml

from qwen3_tts_cuda_graphs import Qwen3TTSCudaGraphs 한 줄로 임포트할 수 있게 되었습니다.

2. Wrapper API 설계 (model.py)

기존 qwen-tts 라이브러리의 인터페이스와 호환되면서도, 내부적으로 CUDA Graphs를 활용하는 래퍼를 제공합니다.

from qwen3_tts_cuda_graphs import Qwen3TTSCudaGraphs

model = Qwen3TTSCudaGraphs.from_pretrained(
    "Qwen/Qwen3-TTS-12Hz-0.6B-Base",
    device='cuda', dtype=torch.bfloat16,
    attn_implementation='eager', max_seq_len=2048,
)

# 스트리밍 생성 - 청크 단위로 오디오 반환
for audio_chunk, sr, timing in model.generate_voice_clone_streaming(
    text="Hello world", language="English",
    ref_audio="ref.wav", ref_text="Reference text",
):
    play(audio_chunk, sr)  # 첫 청크부터 바로 재생 가능

from_pretrained 내부에서 base 모델을 로드한 뒤, predictor와 talker 각각에 대해 PredictorGraph와 TalkerGraph로 CUDA Graph를 빌드합니다.

3. 벤치마크 결과

GPU Baseline RTF CUDA Graphs RTF TTFA 개선
Jetson Orin 0.175 1.38 2,572ms -> 216ms
RTX 4090 1.34 4.56 462ms -> 55ms
H100 0.59 3.47 1,049ms -> 100ms

RTF > 1.0은 실시간보다 빠름을 의미합니다. Jetson Orin에서 7.9배 속도 향상으로 실시간 문턱을 넘었습니다.

왜 이게 좋은가

CUDA Graphs는 커널 launch 오버헤드를 제거하여 작은 연산이 반복되는 autoregressive 생성에서 극적인 효과를 보입니다. 이 프로젝트의 핵심 기여는 transformers의 StaticCache를 활용하여 attention 레이어를 재구현하지 않고도 CUDA Graphs를 적용했다는 점입니다. 738줄의 순수 PyTorch 코드로 C++ 커스텀 커널 없이 5~10배 속도 향상을 달성한 것은, 프레임워크의 기존 기능을 잘 활용한 좋은 사례입니다.

정리

  • 스크립트 모음을 pip install -e . 가능한 Python 패키지로 구조화
  • CUDA Graphs + StaticCache 조합으로 커널 launch 오버헤드 제거
  • 스트리밍 API로 첫 오디오 청크까지의 지연시간(TTFA) 8배 이상 개선
  • Jetson Orin 같은 엣지 디바이스에서 실시간 TTS 가능하게 함

참고 자료

⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.

댓글

관련 포스트

PR Analysis 의 다른글