백엔드 선택 (CPU vs GPU)
HayaKoe 는 CPU (ONNX Runtime) 와 GPU (PyTorch) 두 백엔드를 지원합니다. 코드 레벨에서는 device 파라미터 하나 차이입니다.
python
tts_cpu = TTS(device="cpu").load("tsukuyomi").prepare()
tts_gpu = TTS(device="cuda").load("tsukuyomi").prepare()다만 설치 프로파일부터 다릅니다 — CPU 는 pip install hayakoe 만으로 되지만, GPU 는 hayakoe[gpu] + PyTorch CUDA 빌드가 추가로 필요합니다. 한 환경에 양쪽을 같이 깔아 돌리는 것도 가능하지만, 실제 배포에서는 대개 타겟 환경에 맞춰 한쪽만 설치합니다 (자세한 건 설치 — CPU vs GPU).
그 아래 구조도 완전히 다릅니다. 어느 쪽이 내 배포 환경에 맞는지 결정하는 기준을 정리합니다.
CPU (ONNX) 가 맞는 경우
- GPU 가 없는 서버 환경 — 일반적인 웹 호스팅, VPS, 관리형 컨테이너 플랫폼처럼 CUDA 지원이 없는 환경에서 바로 동작합니다.
- 이미지 크기를 최소화해야 하는 경우 — PyTorch + CUDA 스택은 수 GB 수준이지만, ONNX Runtime 만 포함한 이미지는 수백 MB 대로 줄어듭니다.
- 낮은 동시 요청을 처리하는 워크로드 — 개인 프로젝트나 사내 툴처럼 동시 부하가 크지 않은 경우, CPU 만으로도 충분한 처리량을 확보할 수 있습니다.
- 콜드 스타트가 짧아야 할 때 — ONNX 경로는 프로세스가 뜨는 즉시
prepare()가 끝나고 바로 합성을 받을 수 있습니다. GPU 경로도 기본값은 빠르지만,compile=True를 켰다면 첫prepare()에서 약 80초의 BERT 컴파일 시간을 감수해야 하므로, 오토스케일·서버리스 환경에서 체감 차이가 큽니다.
CPU 경로 구성
- BERT —
bert_q8.onnx(Q8 양자화 DeBERTa), ONNX RuntimeCPUExecutionProvider - Synthesizer —
synthesizer.onnx(ONNX 로 export 된 VITS 디코더) - Duration Predictor —
duration_predictor.onnx
GPU (PyTorch) 가 맞는 경우
- 낮은 지연이 요구되는 실시간 서비스 — 사용자 대면 응답, 대화형 UI 등 단일 요청의 응답 시간이 체감 품질에 직결되는 경우.
- 높은 동시 처리량이 필요한 환경 — 하나의 GPU 에서 여러 화자를 병렬로 합성할 수 있어, CPU 대비 동시 요청 수용 폭이 큽니다.
- 이미 GPU 인프라가 구축된 환경 — 별도 투자 없이 기존 자원을 활용할 수 있으므로, 동일 비용으로 더 나은 지연·처리량을 얻을 수 있습니다.
- 장기 실행 서버 워크로드 —
prepare(compile=True)로 BERT 에torch.compile을 적용하면, 약 80초의 워밍업을 대가로 steady-state 합성이 문장당 약 20% 빨라집니다.
GPU 경로 구성
- BERT — FP32 DeBERTa 가 GPU VRAM 에 올라가 임베딩을 계산합니다. 양자화하지 않아 CPU ONNX 경로보다 정밀도가 약간 높습니다.
prepare(compile=True)시torch.compile이 적용되는 유일한 구성 요소입니다. - Synthesizer — PyTorch VITS 디코더 (eager 실행).
- Duration Predictor — Synthesizer 와 같은 PyTorch 경로 (eager 실행).
GPU 백엔드의 콜드 스타트 줄이기
GPU 백엔드의 첫 prepare() 는 모델 다운로드가 맞물려 오래 걸릴 수 있고, compile=True 를 켰다면 BERT 컴파일 약 80초가 더해집니다. 실제 서비스에서는 아래 두 가지로 이 비용을 미리 치러두는 것이 권장됩니다.
- Docker 빌드 시
pre_download()— 빌드 단계에서 가중치를 이미지 안에 박아 두면, 런타임prepare()는 HF · S3 접근 없이 캐시에서 바로 로드합니다. 이미지가 뜨자마자 네트워크 지연 없이 초기화가 진행됩니다. (→ Docker 이미지) prepare(warmup=True, compile=True)— prepare 시점에 더미 추론을 선행해 BERT 컴파일과 cuDNN 초기화까지 prepare 로 앞당깁니다. prepare 자체는 조금 더 걸리지만 첫 실제 요청이 warmup 비용을 떠안지 않게 됩니다. (→ FastAPI 통합)
나란히 비교
| 항목 | CPU (ONNX) | GPU (PyTorch) |
|---|---|---|
| 설치 | pip install hayakoe | pip install hayakoe[gpu] |
| 이미지 크기 | 수백 MB | 수 GB |
| 콜드 스타트 | 빠름 (초) | 빠름 (초) — compile=True 시 ~80초 |
| 단일 요청 지연 | 보통 | 최저 |
| 동시 처리량 | 코어 수 제한 | GPU 1대에서 병렬 |
| 메모리 (화자 1개 로드) | ≈ 1.7 GB RAM | ≈ 1.3 GB RAM + 1.8 GB VRAM |
| 메모리 (화자당 증가) | +300~400 MB RAM | +250~300 MB VRAM |
| 필요 하드웨어 | 어떤 CPU 든 | NVIDIA GPU + CUDA |
구체 수치는 벤치마크에서
배속·메모리·지연 수치는 하드웨어에 강하게 의존합니다.
- 배속 측정 — 내 머신에서 벤치마크
- 메모리 측정 (실측 표와 재현 스크립트) — FAQ — 화자를 여러 명 올리면 메모리가 얼마나 더 드나요
