vLLM-Omni TTS 추론 엔지니어링

vLLM-Omni TTS 추론 엔지니어링

TL;DR

vLLM-Omni는 Talker와 Code2Wav 단계의 단계별 병목 현상을 해결하여 여러 모델의 TTS 추론을 최적화하여 Qwen3-TTS의 높은 동시성에서 오디오 처리량을 최대 172% 향상시키고 엔드투엔드 지연 시간을 거의 절반으로 줄였습니다.

TTS 추론이 전통적인 LLM 추론과 어떻게 다른가

TTS 추론은 자기회귀 모델을 사용하지만, 텍스트 전용 LLM과 달리 다단계 파이프라인(Talker와 Code2Wav)과 스트리밍 오디오 출력의 엄격한 지연 예산으로 인해 다른 서비스 병목 현상에 직면합니다. 여기서 청크 크기는 첫 패킷 지연 시간과 교차 청크 오디오 품질 모두에 영향을 미칩니다.

최적화 개요

vLLM-Omni는 각 TTS 모델의 파이프라인 구조, 디코드 상태, 배치 형태, 수치적 제약 조건에 따라 최적화를 선택하며, 단계 분리, 배치 전처리, torch.compile, GPU 상주 상태와 같은 기법은 특정 아키텍처에만 유리하므로 고정된 레시피를 적용하지 않습니다.

Qwen3-TTS: 전체 최적화 경로

Qwen3-TTS에 대해 커넥터 청크를 Code2Wav 디코드 윈도우에서 분리하고, Stage 0 전처리를 배치하며, 핫패스 오버헤드를 정리하고, 수치 정밀도를 fp32로 맞추어 H20 × 2에서 c=64일 때 오디오 처리량을 61.5% 향상시키고 P99 엔드투엔드 지연 시간을 거의 절반으로 줄였습니다.

1. 스트리밍: 커넥터 청크를 Code2Wav 디코드 윈도우에서 분리

커넥터 스트리밍 청크 크기(codec_chunk_frames)를 Code2Wav의 내부 디코드 윈도우(decode_chunk_framesdecode_left_context_frames)에서 분리하면 독립적인 튜닝이 가능합니다: 작은 커넥터 청크는 첫 패킷 지연 시간을 줄이고, Code2Wav는 300프레임 디코드 윈도우와 25프레임의 왼쪽 컨텍스트를 유지하여 교차 청크 오디오 연속성을 보장합니다.

2. 처리량: Stage 0 디코드 전처리

Talker 디코드 전처리(스피커 임베딩 준비, trailing_text 유지, 입력 임베딩 구성)를 배치하면 디코드 핫 경로에서의 요청당 Python 오버헤드가 제거되어 높은 동시성에서 작은 텐서 할당과 커널 lancement으로 인한 GPU 유휴 시간이 감소합니다.

3. 핫패스 정리

req_id_to_index O(N²) 조회를 딕셔너리로 대체하고, 비스트리밍 경로를 조기에 건너뛰며, 코덱 금지 마스크를 사전 계산하고, Code2Wav에 대한 CUDA Graph 캡처를 튜닝하여 모델 계산을 변경하지 않고 빈번한 c=64 디코드 루프에서의 Python 오버헤드를 줄였습니다.

4. 수치 정밀도: Code Predictor에 대한 fp32 맞춤

Talker 코드 예측기를 분할하여 PyTorch 네이티브 구현을 통해 RMSNorm 분산, RoPE cos/sin, 주의, QKV 투영을 fp32로 유지함으로써 짧은 시퀀스, 높은 빈도의 자기회귀 단계에서 bfloat16 fused 커널로 인한 정밀도 drift를 방지했습니다.

5. 검증

최적화를 쌓은 후, H20 × 2에서 Qwen3-TTS의 오디오 처리량은 26.55에서 42.88 audio-s/s로 (+61.5%) 증가했고, c=64에서 음성 클론 시 P99 엔드투엔드 지연 시간은 17.7초에서 9.0초로 감소했으며, 따뜻한 동시성 스윕에서는 고정 비용이 상쇄되어 비선형 E2E 성장이 나타났습니다.

VoxCPM2: 단일 단계 하이브리드 TTS

VoxCPM2에 대해 전체 순방향 torch.compile은 MiniCPM4 Talker에서의 Python-컴파일 경계를 줄였고, 요청 간 CFM/LocDIT 디코드 테일을 배치하여 H20 × 1에서 c=64일 때 오디오 처리량을 172.0% 증가시켰습니다.

torch.compile 탐색

전체 Model.forwardtorch.compile로 감싸고 fullgraph=False를 사용하면 PagedAttention 중단에도 불구하고 Dynamo가 28층 MiniCPM4 루프를 최적화하여 cudaLaunchKernel 횟수를 약 71% 줄이고 커널 시간을 약 27% 감소시켰으며, 레이어별 컴파일만으로는 해결되지 않은 경계로 인해 lancement 횟수를 줄이지 못했습니다.

CFM/LocDIT 디코드-테일 배치

요청 간 lm_h, 잔차 출력, 프리픽스 피처 조건을 배치하여 CFM/LocDIT, feat_encoder, 및 stop_head에 적용한 후 결과를 다시 산포하고, 슬라이딩 윈도우 VAE 디코딩과 fused 연산을 결합하여 tiny한 요청당 디퓨전 워크로드를 효율적인 GPU 배치로 변환하여 H20 × 1에서 c=64일 때 처리량을 4.19에서 10.83 req/s(+158.8%)로, 오디오 처리량을 12.16에서 33.07 audio-s/s(+172.0%)로 증가시켰습니다.

Higgs Audio V3: 동적 배치 및 멀티-코드북 상태

Higgs Audio V3에 대해 멀티-코드북 디코드 상태를 GPU 상주 배치 텐서로 이동하고 PIECEWISE 대신 로컬 MLP CUDA Graph를 사용함으로써 Python 오버헤드와 동기화를 피하고 단일 H20에서 c=16일 때 35.26 audio-s/s 처리량을 달성했습니다.

디코드 상태를 GPU로 이동

요청당 Python 딕셔너리 상태(_decode_last_codes, _decode_has_codes, 지연 횟수, EOC 카운트다운 등)를 GPU 상주 배치 텐서로 변환하여 디코드 핫 경로에서의 Python 루프와 D2H 동기화를 제거했으며, 상태 업데이트는 이제 배치된 GPU 경로에서 발생합니다.

동적 배치 형태에 CUDA Graph 적응

CUDA Graph 캡처에 균일한 단일 토큰 디코드 배치(decode_mask가 모두 True)를 사용함으로써 오디오 피드백 메커니즘의 불리언 마스크로 인한 형태 불일치를 피하고, 스케줄러에서의 동적 배치에도 불구하고 안정적인 그래프 형태를 보장했습니다.

로컬 MLP CUDA Graph vs. PIECEWISE

Higgs v3의 경우 로컬 MLP CUDA Graph(post_attention_layernorm + mlp)가 PIECEWISE 그래프보다 우수했습니다. 모델의 멀티-코드북 지연 패턴으로 인해 데이터 의존적 임베딩 조회와 사전 주의 인덱스 연산이 발생하여 더 큰 그래프를 깨거나 비용이 많이 드는 동기화가 필요하기 때문입니다.

기각된 스테이지-오버랩 설계

D2H 복사를 숨기기 위한 한 단계 오디오 스테이지 오버랩 설계는 동기 배치에서 구조적으로 안전하지 않아 거부되었습니다. 스케줄러 유도 요청 재정렬 또는 완료가 커서-요청 매핑을 깨뜨릴 수 있어 요청-ID 키잉과 드레인 훅 없이는 신뢰할 수 없습니다.

Fish Speech S2 Pro: 일반 주의가 병목이 되는 경우

Fish Speech S2 Pro에 대해 모델별 q_len=1 주의 커널과 Fast AR 버퍼 재사용은 일반 주의 오버헤드와 반복 할당으로 인한 GPU 측 병목 현상을 해결하여 H20에서 c=64일 때 23.72 audio-s/s 처리량을 달성했습니다.

모델별 주의 커널

Fish-specific Triton 커널은 SlowAR 디코드 주의(q_len=1, fp16/bf16, head_dim=128, 블록 크기 16, GQA 레이아웃)를 처리하여 순수 디코드 단계에서 일반 페이지드/변길이 주의를 대체했으며, 장 시퀀스에 대한 분할-부분-결합과 경로 선택 중 동기화를 피하기 위한 CPU-side 상한을 제공했습니다.

Fast AR 버퍼 재사용 및 컴파일

Fast AR을 위해 _embed_buf, _k_cache, 및 _v_cache 텐서를 사전 할당하고 재사용하여 짧은 시퀀스 디코드 단계에서의 반복 할당을 제거했으며, torch.compilefullgraph=Falsedynamic=True로 사용하여 SDPA 내부 중단에도 불구하고 4층 트랜스포머의 서브그래프를 메모이제이션했습니다.

DAC 및 런타임 사이드 최적화

코덱 페이로드 전송을 Python list[int]에서 텐서 직렬화로 전환하고, fp16 DAC 지원을 활성화하며, 프레임 수 배치 DAC 배치를 구현하고, 비동기 청크 처리를 통해 코덱 전송과 DAC 계산을 겹치게 함으로써 높은 동시성에서 할당, GC 압력, 및 차단을 줄였습니다.

성능 데이터

최적화는 vLLM-Omni 쿡북 벤치마크에서 검증된 바와 같이 모델 전반에 걸쳐 측정 가능한 향상을 제공했습니다.

Qwen3-TTS (c=64, p=512, H20 × 2, 음성 클론)

Metric Before After Change
Audio throughput 26.55 audio-s/s 42.88 audio-s/s +61.5%
Median E2EL 9654ms 5699ms −41.0%
P99 E2EL 17686ms 8956ms −49.4%
P99 TTFP 7558ms 5563ms −26.4%

VoxCPM2 (c=64, H20 × 1, CFM 배치 전/후)

Metric Before After Change
Request throughput 4.19 req/s 10.83 req/s +158.8%
Audio throughput 12.16 audio-s/s 33.07 audio-s/s +172.0%

Fish Speech S2 Pro (H20, 단일 GPU, c=64, Triton KV 캐시 + 텐서 페이로드)

Metric Value
Audio throughput 23.72 audio-s/s
Request throughput 5.95 req/s
Mean TTFP 899.67 ms
Mean E2EL 10.47 s

Higgs Audio V3 (H20, 단일 GPU, c=16, eager + 로컬 MLP 그래프)

Metric Value
Request throughput 5.18 req/s
Audio throughput 35.26 audio-s/s
Wall time 96.5s
Speedup vs. baseline 2.70×

Sources