์ฐ๋ฆฌ๊ฐ ํ ์คํธ ์์ฑ ๋ณํ(TTS) API๋ฅผ ๋ฌด๋ฃ๋ก ๋ง๋ ๋ฐฉ๋ฒ: S2.1 Pro ์ด๋ฉด์ ์ถ๋ก ์์ง๋์ด๋ง
์์ฝ (TL;DR)
- Fish Audio S2.1 Pro๋ฅผ ์ด์ ๋ฌด๋ฃ ํ ์คํธ ์์ฑ ๋ณํ(TTS) API๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค: 83๊ฐ ์ธ์ด ์ง์, ์๊ฒฉํ ์ฌ์ฉ๋ ์ ํ ์์, ๋ชจ๋ธ ๋ฌธ์์ด
s2.1-pro-free. ๋ฌด๋ฃ ์ก์ธ์ค๋ ์ด๊ธฐ ๊ธฐ๊ฐ ๋์ ์ ๊ณต๋๋ฉฐ, ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๊ฒฝ์ฐ ์ฌ์ ์ ์๋ดํด ๋๋ฆฝ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ์์ ํ์ธํ์ธ์.- ์๋ํฌ์๋ ์ถ๋ก ์ต์ ํ๋ฅผ ํตํด GPU๋น ์์ฒญ ์ฒ๋ฆฌ ์ฉ๋์ 4๋ฐฐ ํฅ์ํ์ต๋๋ค. ์ด์ ์๋ 4๊ฐ์ H200์ด ํ์ํ๋ ์์ ์ ์ด์ ๋จ ํ ๊ฐ์ H200์์ ์คํํ ์ ์์ต๋๋ค.
- ํต์ฌ ๋์ธ: ์ปค์คํ CUDA ์ปค๋(๋์ฝ๋ ์ ฐ์ดํ์์ cuBLAS ๋๋น 2.1โ4.3๋ฐฐ ํฅ์), ์ฐ์ ๋ฐฐ์นญ(c=1โ64์์ ์ฒ๋ฆฌ๋ 52๋ฐฐ ํ์ฅ), GPU ์ด์ฉ๋ฅ ์ฝ 50%์์ 90% ์ด์์ผ๋ก ํฅ์
- ๋์ผํ ์คํ์ด ์ฐ๋ฆฌ์ ์์ฑ ํด๋ก๋ API์๋ ์ ์ฉ๋ฉ๋๋ค. ๋์ผํ ๋ชจ๋ธ ๊ฐ์ค์น์ ์ธํ๋ผ๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ฌด๋ฃ ํฐ์ด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. S2.1 Pro๋ ์ฐ๋ฆฌ์ ์คํ ๊ฐ์ค์น ํ์ด๋ฐ์ด์ ๋ชจ๋ธ์ธ Fish Speech๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ต๋๋ค.
- ํต์ฌ ์ปค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ fish-scales-ops๋ ์คํ ์์ค๋ก ๊ณต๊ฐ๋์ด ์์ต๋๋ค.
์ ๊ฐ๋ฐ์๋ค์ด ๋ค๋ฅธ ํ๋ซํผ์์ ์ฐ๋ฆฌ๋ก ์ ํํ๋์ง ํ์ธํด ๋ณด์ธ์ โ ๋ฌด๋ฃ๋ก ๋น๋ ์์ํ๊ธฐ
2026๋ 7์ | Fish Audio๋ ์ถ๋ก ์คํ์ ์ฌ๊ตฌ์ถํ์ฌ ๋ชจ๋ ๊ฐ๋ฐ์๋ฅผ ์ํด S2.1 Pro๋ฅผ ๋ฌด๋ฃ๋ก ๊ณต๊ฐํ์ต๋๋ค.
์์ฑ AI์ ๋น์ฉ์ด ๋๋ ์ง์ง ์ด์
์์ฑ AI ์ถ๋ก ์๋ ๊ฐ๊ฒฉ ํ์ด์ง์์ ์ค๋ช ํ์ง ์๋ ๊ตฌ์กฐ์ ์ธ ๋ฌธ์ ๊ฐ ์์ต๋๋ค: ์๊ธฐํ๊ท(autoregressive) ๋์ฝ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก GPU ์ด์ฉ๋ฅ ์ ๋งค์ฐ ์ ๋์ ์ ๋๋ค.
๋ชจ๋ TTS API ํธ์ถ์ ์ค๋์ค ํ ํฐ์ ํ ๋ฒ์ ํ๋์ฉ ์์ฑํ๋ ๋์ฝ๋ ๋ฃจํ๋ฅผ ๊ตฌ๋ํฉ๋๋ค. ๊ฐ ๋จ๊ณ๋ ์ค์ ๋ก๋ M โค 128์ธ ์์ ํ๋ ฌ ๊ณฑ์ ์ด๋ฉฐ, ๊ทธ ๋ค๋ฅผ ํด๋น ์ํ์ค์ ๋ํ KV ์บ์์ ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ๊ฐ ๋ฐ๋ฆ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ํ์ ์์คํ ์ด ๋ฐ๋ผ์ก๋ ๋์ CUDA ์ฝ์ด๋ ๋๋ถ๋ถ ์ ํด ์ํ๋ก ๋๊ธฐํฉ๋๋ค. 30,000๋ฌ๋ฌ์ง๋ฆฌ H200์์ ์ฌ๋ฌ๋ถ์ ์ฐ์ฐ ๋น์ฉ์ ์ง๋ถํ๊ณ ์์ง๋ง, ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ง์ฐ(stall)์ผ๋ก ๊ทธ ์ฑ๋ฅ์ ๋ญ๋นํ๊ณ ์๋ ์ ์ ๋๋ค.
๋์์ฑ์ด ๋ฎ์ ๋๋ ์ํฉ์ด ๋ ๋๋น ์ง๋๋ค. ๋จ์ผ ์์ฒญ ๋์ฝ๋ ๋ฃจํ๋ ์ค์ผ์ค๋ง ์ค๋ฒํค๋๋ก ๊ตฌ๋ถ๋ 10โ20ฮผs์ ์งง์ ๋ฒ์คํธ๋ก GPU๋ฅผ ์ ์ ํฉ๋๋ค. ๋์ด๋ธํ๊ฒ ์๋น๋๋ TTS ์๋ํฌ์ธํธ์ GPU ์ด์ฉ๋ฅ ์ c=1์ผ ๋ 10% ๋ฏธ๋ง์ผ ์ ์์ต๋๋ค. ํ๋์จ์ด๋ ์ค๋น๋์ด ์์ง๋ง, ์์ ์ด ํ๋์จ์ด๋ฅผ ์ฑ์ฐ์ง ๋ชปํ๊ณ ์๋ ๊ฒ์ ๋๋ค.
์ ๊ณ์ ๋๋ต์ ๊ธ์ ์๋น ๊ณผ๊ธ์ ํตํด ๊ทธ ๋น์ฉ์ ๊ฐ๋ฐ์์๊ฒ ์ ๊ฐํ๋ ๊ฒ์ด์์ต๋๋ค. ์ฐ๋ฆฌ์ ๋ต์ ์ธํ๋ผ ๊ณ์ธต์์ ์ด์ฉ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด์์ต๋๋ค. ๋จ์ผ GPU๊ฐ ์ด์ ์ 4๋ ๋ถ๋์ ์์ ์ ์ํํ ์ ์๊ฒ ๋๋ฉด, ๋ฌด๋ฃ ํฐ์ด์ ๊ฒฝ์ ์ฑ์ด ํ๋ณด๋ฉ๋๋ค.
์ด๋ฅผ ์ํด ํ์ํ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์๋ํฌ์๋ ์ต์ ํ: ์ ์ฒด ์คํ
๋จ ํ๋์ ๋ณํ๋ก 4๋ฐฐ์ ํจ์จ์ฑ ํฅ์์ ์ป์ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ์ด๋์ ๋ชจ๋ ๋ ์ด์ด๋ฅผ ๋์์ ์ต์ ํํ๊ณ ๊ทธ ํจ๊ณผ๋ฅผ ๊ฒฐํฉํจ์ผ๋ก์จ ์ป์ด์ก์ต๋๋ค.
- ์ปค์คํ CUDA ์ปค๋ โ ํ ํฐ๋น ์ฐ์ฐ ๋ญ๋น ์ ๊ฑฐ
- FP8 ์์ํ โ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ ์๋ฐ์ ์ ๋ฐ์ผ๋ก ๊ฐ์
- ์ฐ์ ๋ฐฐ์นญ (Continuous batching) โ ๋์ ์์ฒญ ์ ์ฒด์์ GPU๋ฅผ ์ฑ์
- GPU ์ค์ผ์ค๋ง โ ์์ ์ฌ์ด์ ์ ํด ์ฉ๋ ์ ๊ฑฐ
- ์์ฒด ๋คํธ์ํฌ ๋ฐ ์คํ ๋ฆฌ์ง ์์ โ ํด๋ผ์ฐ๋ ์ธํ๋ผ ๋ง์ง ์ ๊ฑฐ
๊ฐ ๋ ์ด์ด๋ ์๋์ ์์ธํ ์ค๋ช ๋์ด ์์ต๋๋ค. ๋ง์ง๋ง์ ์ ์๋ ์ฒ๋ฆฌ๋๊ณผ ๋น์ฉ ์์น๋ ์ด ๋ชจ๋ ์์๊ฐ ๊ฒฐํฉ๋ ๊ฒฐ๊ณผ์ ๋๋ค.
์ปค์คํ CUDA ์ปค๋: fish-scales-ops
์ cuBLAS๋ก๋ ๋ถ์กฑํ๋๊ฐ
TTS ์๋น์์์ ๋์ฝ๋ ์
ฐ์ดํ(M โค 128)๋ cuBLAS, PyTorch์ GEMM ์ปค๋, ๋๋ ์ฌ์ง์ด torch.compile์ด ์ต์ ํ๋ ํํ๊ฐ ์๋๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ํ์ต์ด๋ M์ด ์์ฒ ๋จ์์ธ ๋๊ท๋ชจ ๋ฐฐ์น ํ๋ฆฌํ(prefill)์ ํ๊ฒ์ผ๋ก ํฉ๋๋ค. ์์ M์์๋ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ์ ๋ญ๋นํ๊ณ ๋์ฝ๋ ๋ฐฐ์น ์ฌ์ด์ฆ์์๋ง ์กด์ฌํ๋ ํจ์ (fusion) ๊ธฐํ๋ฅผ ๋์น๊ฒ ๋ฉ๋๋ค.
๊ตฌ์ฒด์ ์ธ ์ฐจ์ด์ : M=1(๋จ์ผ ์์ฒญ ๋์ฝ๋)์์์ SwiGLU MLP ํฌ์๋์ ๊ฒฝ์ฐ, cuBLAS scaled_mm์ ํ์ฑํ(activation), ๊ฒ์ดํธ ๊ณฑ์
(gate multiply), ๋ค์ด ํ๋ก์ ์
(down projection)์ด๋ผ๋ ์ธ ๊ฐ์ ๊ฐ๋ณ ์ปค๋ ๋ฐ์น๋ฅผ ์คํํ๋ฉฐ, ๊ฐ ๋จ๊ณ ์ฌ์ด์ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ HBM์ ์ฐ๊ณ ๋ค์ ์ฝ์ด์ต๋๋ค. M=1์์๋ ์ฐ์ฐ์ด ์๋๋ผ ์ด ๋ฐ์ดํฐ์ ์๋ณต์ด ๋ณ๋ชฉ ํ์์ด ๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ด ๊ฐ๊ทน์ ๋ฉ์ฐ๊ธฐ ์ํด fish-scales-ops๋ฅผ ๊ฐ๋ฐํ์ต๋๋ค. ์ด๋ NVIDIA Hopper (H200, sm_90a) ๋ฐ Blackwell (sm_120a) ์ํคํ ์ฒ๋ฅผ ํ๊ฒ์ผ๋ก ํ๋ ์์ฉ ์์ค์ ์คํ ์์ค FP8 GEMM ๋ฐ FlashAttention ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค.
FP8 ์์ํ ์ ๋ต
์ฐ๋ฆฌ๋ ์๋ก ๋ค๋ฅธ ํ๋์จ์ด ์ธ๋๋ฅผ ์ํด ๋ ๊ฐ์ง ์์ํ ์คํด์ ๊ตฌํํ์ต๋๋ค.
bsgemm (128ร128 ๋ธ๋ก ์ค์ผ์ผ๋ง FP8): H200/Hopper์ฉ. 128ร128 ๋จ์์ ๋ธ๋ก ์ค์ผ์ผ๋ง์ ํ ์๋ณ(per-tensor) ์์ํ์ ์ ํ๋ ์ํ ์์ด ์ฐ์ํ ์์น์ ์์ ์ฑ์ ์ ๊ณตํฉ๋๋ค.
mxfp8 (1ร32, OCP UE8M0 ํฌ๋งท): Blackwell (RTX 5090, RTX 6000 PRO)์ฉ. 32๊ฐ ์์ ๊ณต์ ์ง์๋ฅผ ์ฌ์ฉํ๋ ๋ง์ดํฌ๋ก์ค์ผ์ผ๋ง(OCP MX ํ์ค)์ ์ค๋์ค ํ ํฐ ์์ฑ์ ์ค์ํ ์ค์ผ์ผ์์ ๋ ์ธ๋ฐํ ์์น์ ์ ๋ฐ๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
mxfp8 ๊ฒฝ๋ก์์ ๋ฐ์ํ ํ ๊ฐ์ง ๊น๋ค๋ก์ด ๋ฒ๊ทธ๋ ์๋นํ ๋๋ฒ๊น
์ด ํ์ํ์ต๋๋ค. quantize_blockscale.py๊ฐ safetensors ํธํ์ฑ์ ์ํด .contiguous()๋ก weight_scale ํ
์๋ฅผ ๊ตฌ์ฒดํํ์ง๋ง, linear_mxfp8_raw๋ K-major ์คํธ๋ผ์ด๋ (1, N)์ผ๋ก ์ค์ผ์ผ์ ์ฝ์์ต๋๋ค. ํ-๋ฉ์ด์ (row-major) ์ฐ์ [N, K/128]์ ๋ก๋ํ์ ๋ชจ๋ GEMM์ด ์ต๋ ์ปค๋ ์๋์์ ์๋ชป๋ ๋ก์ง์ ์์ฑํ์ต๋๋ค. ์ด๋ก ์ธํด ๋ค์ด์คํธ๋ฆผ ์ํ๋ง์ด ํ๋์ ๋ฐ๋ณต๋๋ ์๋งจํฑ ํ ํฐ์ผ๋ก ๋ชจ๋ ๋ถ๊ดด(mode-collapsed)๋์์ต๋๋ค. ์ด๋ ๋ชจ๋ธ ํ์ง ๋ฌธ์ ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์ ๋ฒ๊ทธ์์ต๋๋ค. ํด๊ฒฐ์ฑ
์ MXFP8LinearMethod.process_weights_after_loading์์ ์คํธ๋ผ์ด๋๋ฅผ ๋ค์ ์กฐ์ ํ๋ ๊ฒ์ด์์ต๋๋ค. ์์ ํ, ๊ทธ๋ฆฌ๋ ๋์ฝ๋๋ ์ฒ์ 5๊ฐ์ ์ค๋์ค ํ๋ ์์์ bf16๊ณผ ํ ํฐ ๋จ์๋ก ์ ํํ ์ผ์นํ์ต๋๋ค.
์ปค๋ ๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ
๋์ฝ๋ ์ ฐ์ดํ(M โค 128)์ ๋ํ ๋์ผ ํ๋์จ์ด ๋ด ๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค(์์ธ ๋ฐฉ๋ฒ๋ก ์ fish-scales-ops ์ ์ฅ์ ์ฐธ์กฐ):
- MXFP8 ๊ฒฝ๋ก๋ 1024ยณ์์ 16384ยณ ์ฌ์ด์ 10๊ฐ ์ ์ฌ๊ฐ ์
ฐ์ดํ ์ค 8๊ฐ์์
torch.nn.functional.scaled_mm์ ๋ฅ๊ฐํ๋ฉฐ ์ต๋ 21% ํฅ์ - ์๋ํฌ์๋ Qwen3-4B SwiGLU MLP ํฌ์๋: 1์์ 4096 ์ฌ์ด์ ๋ชจ๋ M์์ ์์ cuBLAS
scaled_mm๋๋น 1.7โ6.2๋ฐฐ ํฅ์ - ๋์ฝ๋ ์
ฐ์ดํ์์
torch.compile์ด ํจ์ฆ๋ cuBLAS ๋๋น: 2.1โ4.3๋ฐฐ ๋น ๋ฆ - sm_120a์์์ MXFP8 FlashAttention: PyTorch SDPA ๋์ฝ๋ ๋๋น 7โ19๋ฐฐ, FlashInfer BF16 ๋๋น 1.2โ2.7๋ฐฐ ํฅ์
์ด๋ฌํ ์ด๋์ ์ฃผ๋ํ๋ ๋ ๊ฐ์ง ํจ์ฆ๋ ์ปค๋: ํ๋๋ ํ์ฑํ ์์ํ + UE8M0 ์ค์ผ์ผ ํฉ์ ๋จ์ผ ํธ์ถ๋ก ํจ์งํฉ๋๋ค. ๋ค๋ฅธ ํ๋๋ SwiGLU ํ๋กค๋ก๊ทธ๋ฅผ ๋ค์ด-GEMM ํ์ฑํ ์์ํ์ ์ง์ ํจ์งํ์ฌ, PyTorch๊ฐ ๋ ์ฐ์ฐ ์ฌ์ด์์ ๊ตฌ์ฒดํํ๋ ์ ์ฒด BF16 ์ค๊ฐ ์ฐ๊ธฐ+์ฝ๊ธฐ ๊ณผ์ ์ ์ ๊ฑฐํฉ๋๋ค.
๋ฐฐ์น ์ถ๋ก ์ํคํ ์ฒ: ์ง์ฐ ์๊ฐ๊ณผ ์ฒ๋ฆฌ๋์ ํธ๋ ์ด๋์คํ
์๊ธฐํ๊ท TTS๋ฅผ ์ํ ์ฐ์ ๋ฐฐ์นญ (Continuous Batching)
์ปค๋ ํจ์จ์ฑ์ ํ ํฐ๋น ๋น์ฉ์ ๊ฐ์ ํฉ๋๋ค. ๋ฐฐ์นญ(Batching)์ ์ด ํ ํฐ๋น ํจ์จ์ฑ์ ์์ฒญ ์คํธ๋ฆผ ์ ์ฒด์ GPU ์ด์ฉ๋ฅ ๋ก ์ ํํ๋ ์ญํ ์ ํฉ๋๋ค.
์ ์ ๋ฐฐ์นญ(Static batching) โ ๋ชจ๋ ์ํ์ค๋ฅผ ๋์ผํ ๊ธธ์ด๋ก ํจ๋ฉํ์ฌ ๊ณ ์ ๋ ๋ฐฐ์น๋ก ์คํ โ ์ ํจ๋ฉ์ ์ฐ์ฐ์ ๋ญ๋นํ๊ณ ๋ฐฐ์น์ ๊ฐ์ฅ ๋๋ฆฐ ์ํ์ค๊ฐ ๋๋ ๋๊น์ง ์๋ก์ด ์์ฒญ์ ์ฐจ๋จํฉ๋๋ค. ์ถ๋ ฅ ๊ธธ์ด๊ฐ ๊ฐ๋ณ์ ์ธ TTS์ ๊ฒฝ์ฐ ๊ผฌ๋ฆฌ ์ง์ฐ ์๊ฐ(tail latency) ํ๋ํฐ๊ฐ ํฝ๋๋ค.
์ฐ๋ฆฌ๋ sglang์์ ์๊ฐ์ ์ป์ ์ฐ์ ๋ฐฐ์นญ์ ์ฌ์ฉํฉ๋๋ค. ์๋ก์ด ์์ฒญ์ ๋ฐฐ์น ๊ฒฝ๊ณ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฌ๋กฏ์ด ๋น๋ ๋๋ก ํ์ฑ ๋์ฝ๋ ๋ฐฐ์น์ ํฉ๋ฅํฉ๋๋ค. GPU ๋์ฝ๋ ๋ฃจํ๋ ๋๋ฆฐ ์์ฒญ ๋๋ฌธ์ ์ง์ฐ๋์ง ์์ต๋๋ค.
DualAR: S2 ์ ์ฉ ๋ฐฐ์นญ ์ ์ฝ ์ฌํญ
S2.1 Pro์ DualAR ์ํคํ
์ฒ๋ ์ค๋์ค ํ ํฐ์ ๋ ๋จ๊ณ(Coarse ์ฝ๋๋ถ ๋ค์ Fine ์ฝ๋๋ถ)๋ก ์์ฑํ๋ฉฐ, ๊ฐ ๋จ๊ณ๋ฅผ ์กฐ๊ฑดํํ๋ ์ฌ๋ผ์ด๋ฉ previous_tokens ์๋์ฐ๋ฅผ ๊ฐ์ง๋๋ค. ์ด๋ ํ์ค LLM ๋ฐฐ์นญ์๋ ์๋ ์ ํ์ฑ ์ ์ฝ์ ๋ง๋ญ๋๋ค: prev_tokens_shift_inplace ์ปค๋์ ์๊ฒฉํ ์
ฐ์ดํ/๋ฐ์ดํฐ ํ์
๊ณ์ฝ(prev int32 [bs, W, cw], next_tokens int32 [bs, cw])์ ์๊ตฌํฉ๋๋ค. ํธ์ถ์์ ๋ชจ๋ ์
ฐ์ดํ ์กฐ์(.unsqueeze(), ์์์ ๋ฐ์ดํฐ ํ์
ํ๋ก๋ชจ์
๋ฑ)์ ์๋์ฐ๋ฅผ ์์์ํค๊ณ ๋ชจ๋ธ ํ์ง ์ ํ์ ๊ตฌ๋ณํ๊ธฐ ์ด๋ ค์ด ์ดํ๋ ์ค๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
์์ฑ ํด๋ก๋ ์์ ์ ๊ฒฝ์ฐ ์ด ์ ์ฝ์ด ํนํ ์ค์ํฉ๋๋ค. ํ์ ์กฐ๊ฑดํ๊ฐ ๋์ผํ ๋์ฝ๋ ๊ฒฝ๋ก๋ฅผ ํตํด ํ๋ฅด๊ธฐ ๋๋ฌธ์, ์๋์ฐ ์์์ ๋ช ํํ ์ค๋์ค ์ํฐํฉํธ๋ณด๋ค๋ ๊ธด ์ถ๋ ฅ ์ ์ฒด์์ ํ์ ์ ์ฒด์ฑ์ด ํ์ด์ง๋ ํ์์ผ๋ก ๋ํ๋ฉ๋๋ค.
์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ
H200, bsgemm FP8, ๋์์ฑ ์ค์:
| ๋์์ฑ | ์ดํฉ ์ฒ๋ฆฌ๋ | TTFB p50 |
|---|---|---|
| 1 | 154 tok/s | 73.2 ms |
| 4 | 595 tok/s | 75.5 ms |
| 8 | 1,206 tok/s | 81.2 ms |
| 16 | 2,373 tok/s | 79.6 ms |
| 32 | 4,099 tok/s | 96.9 ms |
| 64 | 8,006 tok/s | 109.8 ms |
์ฒ๋ฆฌ๋์ c=1์์ c=64๊น์ง ์ฝ 52๋ฐฐ ํ์ฅ๋๋ ๋์, TTFB๋ 36.6ms(73ms์์ 110ms) ์ฆ๊ฐํ๋ ๋ฐ ๊ทธ์ณค์ต๋๋ค. GPU๋ ๋๋ถ๋ถ์ ํ๋ก๋์ ์ํฌ๋ก๋์์ ์ธ์งํ ์ ์๋ ์์ค์ ์ง์ฐ ์๊ฐ ํ๋ํฐ๋ง์ผ๋ก 52๋ฐฐ ๋ ๋ง์ ์์ ์ ์ํํฉ๋๋ค.
c=64์์ ๋จ์ผ H200์ 8,006 tok/s๋ฅผ ์ ์งํฉ๋๋ค. ์ด ์์น๊ฐ ๋ฐ๋ก ๋ฌด๋ฃ ํฐ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ง์ ์ ์ธ ๋ฉ์ปค๋์ฆ์ ๋๋ค. GPU๋น ์ฒ๋ฆฌ๋์ด ๋์์๋ก ์์ฒญ๋น ๋น์ฉ์ด ๋ฎ์์ง๋๋ค.
์ด ์์น๋ค์ ๋ชจ๋ ๋ฌด๋ฃ API ํธ์ถ ์ด๋ฉด์์ ์๋ํ๊ณ ์์ต๋๋ค. ๋น๋ ์์ํ๊ธฐ โ
์ค์๊ฐ ๋ชจ๋: ์ ์ง์ฐ ์ํฌ๋ก๋๋ฅผ ์ํ ์ํคํ ์ฒ์ ์ ๊ทผ
๋ณด์ด์ค ์์ด์ ํธ ๋ฐ ํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด, ์ฐ๋ฆฌ๋ ์ดํฉ ์ฒ๋ฆฌ๋๋ณด๋ค๋ ์ฒซ ์ค๋์ค ์ถ๋ ฅ ์๊ฐ(TTFA)์ ์ต์ ํ๋ ๋ณ๋์ ์ค์๊ฐ ์๋ํฌ์ธํธ๋ฅผ ๋ ธ์ถํฉ๋๋ค.
ํต์ฌ ์ํคํ ์ฒ ๊ฒฐ์ : ํ๋ฆฌํ(Prefill)์ ์ฐ๊ฒฐ์ด ์ด๋ฆด ๋ ๋ฐ์ํ์ฌ ์ง์ฐ ์๊ฐ์ด ์ค์ํ ๊ฒฝ๋ก์์ ์์ ํ ์ ์ธ๋ฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ ์ง์ฐ ์๊ฐ์ ์๊ณ๋ ์ฐ๊ฒฐ ์๋ฆฝ ์์ ์ด ์๋๋ผ ์ฒซ ๋ฒ์งธ ์ค๋์ค ์ฒญํฌ ์ ์ก ์์ ๋ถํฐ ์์๋ฉ๋๋ค. ์ฆ, ํ๋กฌํํธ ๊ธธ์ด์ ๋ฐ๋ผ ํ์ฅ๋๋ ํ๋ฆฌํ ๋น์ฉ์ด TTFA ์์น์ ์ ํ ๋ํ๋์ง ์์ต๋๋ค.
์ค์ผ์ค๋ฌ ์์ค์์๋ ํํ(pingpong) ์ค๊ณ๊ฐ ์ฌ์ดํด๋ณ ํธ์คํธ ๋ฐฐ๋ฆฌ์ด ์์ด ๋ณ๋์ ์ค๋ ๋์์ ๋์ฝ๋์ ํ๋ฆฌํ์ ์คํํฉ๋๋ค. ๋ฐฐ๋ฆฌ์ด ์ ๊ฑฐ๋ cโฅ4์์ TTFA๋ฅผ ๊ฐ์ ํ๋ ํต์ฌ ์์์ ๋๋ค. ๋์ด๋ธํ ๊ตฌํ์์๋ ๊ฐ ๋์ฝ๋ ๋จ๊ณ ํ์ ํธ์คํธ ์ธก ๋๊ธฐํ๊ฐ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํ ์์ ์ ์ง๋ ฌํํฉ๋๋ค. ํ์ดํ๋ผ์ธ๋ ๋์ฝ๋ ๋ฃจํ์ ํ๋(pinned) H2D ๋ฉ๋ชจ๋ฆฌ ์ ์ก์ ๋์ ๋์์ฑ ํ๊ฒฝ์์ TTFB์ ์งํฐ(jitter) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ ์ฒด ์ค๊ณ ๋ฐ ์ง์ฐ ์๊ฐ ๋ถ์์ arXiv:2603.08823์์ ํ์ธํ ์ ์์ต๋๋ค.
ํ์ง ๊ฒ์ฆ: ์ต์ ํ๊ฐ ์ค๋์ค๋ฅผ ์ ํ์ํค์ง ์์์์ ํ์ธํ ๋ฐฉ๋ฒ
์์ํ์ ๋ฐฐ์นญ์ ์ฒ๋ฆฌ๋ ๋ฒค์น๋งํฌ๋ง์ผ๋ก๋ ๊ฐ์งํ๊ธฐ ์ด๋ ค์ด ํ์ง ์ ํ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. GPU๊ฐ ์ต๋ ์๋๋ก ์๋ํ๋๋ผ๋ ์๋ชป๋ ์ถ๋ ฅ์ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฐ๋ฆฌ๋ mxfp8 ๊ฐ๋ฐ ์ค์ ์ด๋ฌํ ์ฌ๋ก๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ์์์ ์ธ๊ธํ ์จ์ดํธ ๋ ์ด์์ ๋ฒ๊ทธ๋ ์ปค๋ ์ง์ฐ ์๊ฐ์ด ์์ ํ ์ ์์์๋ ๋ถ๊ตฌํ๊ณ ์ฝ 53%์ ์๋์ ๋ก์ง ์ค๋ฅ๋ฅผ ๋ฐ์์์ผฐ์ต๋๋ค. ์ด๋ฌํ ์ ํ๋ ์ฑ๋ฅ ์งํ๊ฐ ์๋ ์ถ๋ ฅ ํ ํฐ ๋ถ์์์๋ง ๋ํ๋ฌ์ต๋๋ค.
์ฐ๋ฆฌ์ ๊ฒ์ฆ ํ์ดํ๋ผ์ธ์๋ ๋ ๊ฐ์ง ๊ฒ์ดํธ๊ฐ ์์ต๋๋ค:
์ ํ์ฑ ๊ฒ์ดํธ(Correctness gate): ์์ํ ํ ๊ทธ๋ฆฌ๋ ๋์ฝ๋๋ ๊ณ ์ ๋ ์ฐธ์กฐ ์ ๋ ฅ์ ๋ํด ์ฒ์ 5๊ฐ์ ์ค๋์ค ํ๋ ์์์ bf16๊ณผ ํ ํฐ ๋จ์๋ก ์ ํํ ์ผ์นํด์ผ ํฉ๋๋ค. ์ฒซ ํ๋ ์์์์ ํ ํฐ ๋จ์ ์ผ์น๋ ์์คํ ์ ์ธ ๋ก์ง ์์์ ํฌ์ฐฉํฉ๋๋ค. ์์ํ๋ ๋ชจ๋ธ์ด ๋ค๋ฅธ ํ๋ฅ ๋ถํฌ๋ฅผ ์์ฑํ๋ค๋ฉด ๊ฒฐ์ ๋ก ์ ์ ๋ ฅ์ ๋ํด ์ฆ์ bf16๊ณผ ๋ฌ๋ผ์ง ๊ฒ์ ๋๋ค.
์ฑ๋ฅ ์ ํ ๊ฒ์ดํธ(Performance regression gate): ์์ฒญ๋น decode_tps๋ ๋ชจ๋ ๋์์ฑ ์ง์ ์์ ๊ณ ์ ๋ ๋ฒ ์ด์ค๋ผ์ธ ์์น์ 5% ์ด๋ด๋ฅผ ์ ์งํด์ผ ํฉ๋๋ค. ์ด๋ค ๋์์ฑ ์ง์ (c=1, c=16, c=64)์์๋ ์ฒ๋ฆฌ๋์ 5% ์ด์ ์ ํ์ํค๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ณํฉ ์ ๋ช
์์ ์ธ ์ ๋นํ๊ฐ ํ์ํฉ๋๋ค. ์ด ๊ฒ์ดํธ๋ ๋์ฝ๋ ๋ฃจํ์ ๋ฌด๋ถ๋ณํ๊ฒ ๋๊ธฐํ ๊ณผ์ ์ ์ถ๊ฐํ์ฌ ์ ํ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ ์๋๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
๋ ๊ฒ์ดํธ๋ ์ถ๋ก ์คํ์ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ์คํ๋ฉ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, S2.1 Pro ๋ฌด๋ฃ ๋ชจ๋ธ ๊ฐ์ค์น๋ ์ ๋ฃ ํฐ์ด์ ๋์ผํ๋ฉฐ, ์์ํ๋ ์๋น ๊ฒฝ๋ก๋ ๋ชจ๋ ๋ฐฐํฌ ์ ๋น์์ํ ๋ฒ ์ด์ค๋ผ์ธ์ ๋ํด ๊ฒ์ฆ๋ฉ๋๋ค.
๋๊ท๋ชจ ์์ฑ ํด๋ก๋: ์ถ๋ก ํจ์จ์ฑ์ด ์ค์ํ ์ด์
Fish Audio์ ์์ฑ ํด๋ก๋์ ํญ์ ๋ฌด๋ฃ์์ผ๋ฉฐ, ์ฐ๋ฆฌ์ ์์ฒด ํ๊ฐ์ ๊ฐ๋ฐ์ ํผ๋๋ฐฑ์ ๋ฐ๋ฅด๋ฉด ์ฌ์ ํ ๋๊ธ ์ต๊ฐ์ ์ฑ๋ฅ์ ์๋ํฉ๋๋ค. 83๊ฐ ์ธ์ด์ ๊ฑธ์น ํ์ ์ผ๊ด์ฑ, ์์ฐ์ค๋ฌ์ด ์ด์จ, ์ ์ผํธ ์ ๋ฐ์ ์์ ์ ์ธ ์ฑ๋ฅ์ ์ ๋ฃ ํฐ์ด์๋ง ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ด ์๋๋๋ค. ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ์ ๊ธฐ๋ณธ๊ฐ์ ๋๋ค. S2.1 Pro๋ ์ฌํด ์ด ์ถ์๋ ์คํ ๊ฐ์ค์น ํ์ด๋ฐ์ด์ ๋ชจ๋ธ์ธ Fish Speech S2 Pro๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
์ถ๋ก ์ต์ ํ๊ฐ ๋ฐ๊พธ๋ ๊ฒ์ ์ด๋ฌํ ์ฝ์์ ๋๊ท๋ชจ๋ก ์ ์งํ ์ ์๊ฒ ํ๋ ๊ฒฝ์ ์ฑ์ ๋๋ค. ์์ฑ ํด๋ก๋ ์ํฌ๋ก๋๋ ํ์ค TTS๋ณด๋ค ์์ฒญ๋น ๋น์ฉ์ด ๋ ๋์ต๋๋ค. ๋ชจ๋ ํธ์ถ์ ์ฐธ์กฐ ํ์ ์๋ฒ ๋ฉ์ ์กฐ๊ฑดํํ๊ณ , ๊ฐ๋ณ ๊ธธ์ด ์ถ๋ ฅ ์ ์ฒด์์ ํ์ ์ ์ฒด์ฑ์ ์ ์งํ๋ฉฐ, ์ด๋ฅผ ์ฌ๋ฌ ์ธ์ด์์ ์ผ๊ด๋๊ฒ ์ํํด์ผ ํฉ๋๋ค. ์ด ํฌ์คํ ์์ ์ค๋ช ํ ํจ์จ์ฑ ์ด๋์ด ์์๋ค๋ฉด, ๋๊ท๋ชจ ํ๋ก๋์ ํ๊ฒฝ์์์ ๋ฌด๋ฃ ์์ฑ ํด๋ก๋์ ๊ตฌ์กฐ์ ์ผ๋ก ๊ฐ๋น์ผ ์ํฌ๋ก๋๋ฅผ ๋ณด์กฐํ๋ ๊ฒฉ์ด์์ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ต์ ํ ๋๋ถ์ ๋ ์ด์ ๊ทธ๋ ์ง ์์ต๋๋ค.
ํนํ ์์ฑ ํด๋ก๋์ ์ค์ํ ์ธ ๊ฐ์ง ์ต์ ํ:
FP8์ ํ์ ์กฐ๊ฑดํ๋ฅผ ๋ณด์กดํฉ๋๋ค. ๋ก์ง ์์ค์ ์์์ ํฌ์ฐฉํ๋ ํ ํฐ ๋จ์ ์ ํ์ฑ ๊ฒ์ฆ์ ์์ํ๊ฐ ํ์ ์๋ฒ ๋ฉ ์ ํธ๋ฅผ ์ ํ์ํค์ง ์์์ ์ง์ ์ ์ผ๋ก ์ ์ฆํฉ๋๋ค. ํด๋ก๋๋ ์ถ๋ ฅ์ ํ์ ์ผ๊ด์ฑ์ bf16 ๋ฒ ์ด์ค๋ผ์ธ๊ณผ ์ผ์นํฉ๋๋ค.
์ฐ์ ๋ฐฐ์นญ์ ํผํฉ ์์ฒญ ์ ํ์ ์ฒ๋ฆฌํฉ๋๋ค. ํ๋ก๋์ ์์ฑ ํด๋ก๋ ํธ๋ํฝ์ ์ฐธ์กฐ ์กฐ๊ฑด๋ถ ์์ฒญ๊ณผ ๋น์กฐ๊ฑด๋ถ ์์ฒญ, ๋ค์ํ ์ถ๋ ฅ ๊ธธ์ด, ๋ค์ํ ์ธ์ด๊ฐ ์์ฌ ์์ต๋๋ค. ์ฐ์ ๋ฐฐ์นญ์ ์์ฒญ ์ ํ์ ๊ด๊ณ์์ด ๋์ฝ๋ ๋ฐฐ์น๋ฅผ ์ฑ์ฐ๋ฏ๋ก ์ํฌ๋ก๋์ ์ด์ง์ฑ์ ๋ฐ๋ฅธ ํ๋ํฐ๊ฐ ์์ต๋๋ค.
52๋ฐฐ ์ฒ๋ฆฌ๋ ํ์ฅ์ ๋๋ ์์ฑ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋จ์ผ H200์์ 8,006 tok/s์ ์๋๋ก ์ค๋์ค๋ถ, ๊ฒ์ ๋ค์ด์ผ๋ก๊ทธ, ํ์งํ๋ ์ฝํ ์ธ ๋ฑ ๋๊ท๋ชจ ์์ฑ ํด๋ก๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋ฌด๋ฃ ํฐ์ด ๋ด์์๋ ๊ฒฝ์ ์ ์ผ๋ก ๊ฐ๋ฅํด์ง๋๋ค.
๋ฌด๋ฃ ํฐ์ด์ ์์ฑ ํด๋ก๋์ด ํฌํจ๋ ๊ฒ์ ๋จ์ํ ์ฐ๋ฆฌ๊ฐ ๋น์ฉ์ ๊ฐ๋นํ ์ ์๊ฒ ์ต์ ํํ๊ธฐ ๋๋ฌธ๋ง์ ์๋๋๋ค. ๊ทธ๊ฒ์ด ํญ์ ์ฐ๋ฆฌ์ ์ ํ์ด์๊ธฐ ๋๋ฌธ์ด๋ฉฐ, ์ฌ๊ธฐ์์ ์ค๋ช ํ ์์ง๋์ด๋ง ์์ ์ ์ฌ์ฉ๋์ด ๋์ด๋๋๋ผ๋ ๊ทธ ์ฝ์์ ์งํฌ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฐ์ ๋๋ค. ์์ฑ ํด๋ก๋์ ์์ด์ ํธ ์ํฌํ๋ก์ฐ์ ํตํฉํ๋ ค๋ฉด MCP ๋ฐ ์์ด์ ํธ ์คํฌ ์ง์์ ์ฐธ์กฐํ์ธ์.
60์ด ์ด๋ด์ ์์ฑ ํด๋ก๋ํ๊ธฐ โ ๋ฌด๋ฃ ์ฒดํ
GPU ์ธํ๋ผ: ์คํ ์์ ํ๊ธฐ
ํ๋์จ์ด ๋ฐ ์กฐ๋ฌ
์ฐ๋ฆฌ์ GPU ํด๋ฌ์คํฐ๋ ์ฌ๋ฌ ๋ฐ์ดํฐ ์ผํฐ์ ๊ฑธ์ณ ์ฝ 500๊ฐ์ ์นด๋๋ฅผ ์ด์ํฉ๋๋ค. ๋ฉํฐ DC ํ ํด๋ก์ง๋ ์ ๋ขฐ์ฑ ์ด์ ์ ์กฐ๋ฌ ์ธก๋ฉด์ ๊ฒฐ์ ์ด์์ต๋๋ค. GPU ๊ณต๊ธ๊ณผ ๊ฐ๊ฒฉ์ ๋ณ๋์ฑ์ด ํฌ๋ฉฐ, ๋จ์ผ ๋ฒค๋์ ์ข ์๋๋ ๊ฒ์ ๊ทธ ๋ณ๋์ฑ์ ์ง์ ํก์ํด์ผ ํจ์ ์๋ฏธํฉ๋๋ค. ๋ฉํฐ ๋ฒค๋, ๋ฉํฐ DC ์์ฑ์ ์ด์์์ ๋ณต์ก์ฑ์ ๋๊ฐ๋ก ๊ฐ๊ฒฉ ๋ฆฌ์คํฌ์ ๊ณต๊ธ ์ ์ฝ์ ๋์์ ํค์งํฉ๋๋ค.
์ถ๋ก ์ ์ํด ์ฐ๋ฆฌ๋ ํผํฉ ํ๋ฆฟ(mixed fleet)์ ์ด์ํฉ๋๋ค. H200 SXM5๋ bsgemm FP8 ์ดํฉ ์ฒ๋ฆฌ๋์ด ์ง๋ฐฐ์ ์ธ ๊ณ ๋์์ฑ ํ๋ก๋์ ์๋น์ ๋ด๋นํฉ๋๋ค. RTX 5090 ๋ฐ RTX 6000 PRO (sm_120a)๋ ์์ง ์๋ํฌ์ธํธ๋ฅผ ์๋นํฉ๋๋ค. c=64์์ 5090 mxfp8์ 5,869 tok/s๋ฅผ ๋ฌ์ฑํ๋ฉฐ, ์ด๋ ์นด๋๋น ํจ์ฌ ๋ฎ์ ํ๋์จ์ด ๋น์ฉ์ผ๋ก H200 bsgemm ์ฒ๋ฆฌ๋์ ์ฝ 71%์ ํด๋นํฉ๋๋ค.
sm_120a ๋ฐฐํฌ์๋ ํ ๊ฐ์ง ๊น๋ค๋ก์ด ์์ ์ด ํ์ํ์ต๋๋ค: 32GB GPU์ ๋ํ ์๋์ cuda_graph_max_bs = 24 ์บก์ด ๋์ ๋์์ฑ์์ ์ฌ๊ฐํ ์ฒ๋ฆฌ๋ ์ ๋ฒฝ์ ๋ง๋ค์์ต๋๋ค(c=32์์ ~31 tok/s/req, c=64์์ ~35 tok/s/req). ์ด ์บก์ min(max_running_requests, 64)๋ก ๋์์ผ๋ก์จ ์ ์ฒด ์ฒ๋ฆฌ๋ ๊ณก์ ์ ํ๋ณตํ์ต๋๋ค. ๊ทผ๋ณธ์ ์ธ ์์ธ์ bs=24์์์ CUDA ๊ทธ๋ํ ์บก์ฒ๊ฐ ์ค์ c=32 ์ด์์์ ๋ํ๋๋ ๋์ฝ๋ ๋ฐฐ์น ์ฌ์ด์ฆ์์ GPU๋ฅผ ๊ณผ์ ์ด์ฉํ๊ฒ ๋ง๋ค์๊ธฐ ๋๋ฌธ์
๋๋ค.
GPU ์ค์ผ์ค๋ง: ์ ํด ์ฉ๋ ์ ๊ฑฐ
์ถ๋ก ์ ์ฉ ํด๋ฌ์คํฐ์ ๋ฒ ์ด์ค๋ผ์ธ GPU ์ด์ฉ๋ฅ ์ ์ฝ 50%์ ๋๋ค. ์ถ๋ก ํธ๋ํฝ์ ๋ณธ์ง์ ์ผ๋ก ๋ณ๋์ด ์ฌํ๋ฉฐ, GPU๋ ํผํฌ ํ์์ด ์๋ ๋, ํ์ต ์คํ ์ฌ์ด, ๋ฐ์ดํฐ์ ๋ก๋ฉ ๋จ๊ณ ๋์ ์ ํด ์ํ๋ก ๋ฐฉ์น๋ฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋ ๊ฐ์ ๋ณ๋ ฌ ์ค์ผ์ค๋ง ์์คํ (์ถ๋ก ์ฉ Kubernetes, ํ์ต์ฉ Slurm)์ ์ด์ํ๋ฉฐ ํ๋์ ๊ณต์ ์์น์ ๋ฐ๋ฆ ๋๋ค: ๋ฐ์ดํฐ ํด๋ฆฌ๋ ๋ฐ ์ ์ฒ๋ฆฌ ์์ ์ ๋ ํด๋ฌ์คํฐ ๋ชจ๋์์ ์ตํ์ ์ฐ์ ์์ ํฐ์ด์ ํ๋ ฅ์ ์ธ ์ฑ์ฐ๊ธฐ ์์ (elastic fill work)์ผ๋ก ์คํ๋ฉ๋๋ค. ํด๋ฆฌ๋ ์์ ์ ์ถ๋ก ์ด๋ ํ์ต์ด ์ฌ์ฉํ์ง ์์ ๋๋ง๋ค ์ ํด GPU ์ฉ๋์ ์ ์ ํฉ๋๋ค. ์ด ์์ ๋ค์ ์ฒดํฌํฌ์ธํธ ์ค์ ์ด ๊ฐ๋ฅํ๊ณ ์ฆ์ ์ ์ (preemptible)๋ ์ ์์ผ๋ฏ๋ก, ์ค์ ์์ ์ด ๋ค์ด์ค๋ฉด ์ ํ์ฑ ์์ค ์์ด ์ฆ์ ์ฌ๋ผ์ง๋๋ค.
์ฐ์ ์์ ์์: K8s ํด๋ฌ์คํฐ์์๋ ์ถ๋ก > ํด๋ฆฌ๋, Slurm์์๋ ํ์ต > ํด๋ฆฌ๋์ ๋๋ค. ์ถ๋ก ์ธก์ ์คํ ์ค์ผ์ผ๋ฌ๋ ์๊ฐ ๊ธฐ๋ฐ ํด๋ฆฌ์คํฑ์ด ์๋ ์ค์๊ฐ ํธ๋ํฝ ์ ํธ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ถํ๊ฐ ์ฆ๊ฐํ๋ ์ฆ์ ํด๋ฆฌ๋ ์์ ์ด ํด๊ฑฐ๋ฉ๋๋ค.
๊ฒฐ๊ณผ: GPU ์ด์ฉ๋ฅ ์ด ์ฝ 50%์์ 90% ์ด์์ผ๋ก ํฅ์๋์์ต๋๋ค. ํด๋ฌ์คํฐ ๊ท๋ชจ์์ ์ด ์ฐจ์ด๋ ์ถ๋ก ์์ฒญ๋น ์ ํจ ๋น์ฉ์ ๋๋ต ์ ๋ฐ์ผ๋ก ์ค์ฌ์ค๋๋ค. ํ๋์จ์ด ์์ฐ์ ๊ณ ์ ๋์ด ์์ง๋ง, ๋์ผํ ์์ฐ์ผ๋ก ๋ ๋ฐฐ ๋ ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋คํธ์ํฌ ์ธํ๋ผ
์ฐ๋ฆฌ๋ ์ง์ ISP ๋์ญํญ ์กฐ๋ฌ, ASN, 300Gbps ์ฐ๊ฒฐ, Cloudflare ํผ์ด๋ง์ ํฌํจํ ์์ฒด ๋คํธ์ํฌ๋ฅผ ์ด์ํฉ๋๋ค. ํนํ TTS์ ๊ฒฝ์ฐ ๋ ๊ฐ์ง ๋น์ฉ์ ์์ฌ์ ์ด ์์ต๋๋ค.
TTS ๊ท๋ชจ์์ ์ ์ก ๋น์ฉ(Egress)์ ๋ฌด์ํ ์ ์์ต๋๋ค. ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด์ ์ ์ก ๋น์ฉ ์ฑ ์ ์ ๊ตฌ์กฐ์ ์ผ๋ก ๋ง์ง์ด ๋์ต๋๋ค. ๋คํธ์ํฌ ๊ณ์ธต์ ์์ ํ๋ฉด ์ด ๋ง์ง์ ์์ ํ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
๋ ๋ฒ์งธ ์ด์ ๋ ์ง์ฐ ์๊ฐ์ ๋๋ค. ๋คํธ์ํฌ ์๋ณต์ ๋งค ๋ฐ๋ฆฌ์ด๋ ์ฌ์ฉ์๊ฐ ์ฒด๊ฐํ๋ TTFB์ ๊ทธ๋๋ก ๋ฐ์๋ฉ๋๋ค. Cloudflare ํผ์ด๋ง์ ํตํด Fish Audio ์๋ํฌ์ธํธ๋ฅผ Cloudflare ๋คํธ์ํฌ๋ฅผ ํตํด ๋ผ์ฐํ ๋๋ ์ฌ์ฉ์(๊ธ๋ก๋ฒ API ํธ๋ํฝ์ ์๋น ๋ถ๋ถ)์ ๊ฐ๊น๊ฒ ๋ฐฐ์นํฉ๋๋ค. ๋ฉํฐ DC ๋ฐฐํฌ๋ ๋๋ถ๋ถ์ ์์ฒญ์ด ๊ณต์ฉ ์ธํฐ๋ท ์ ์ฒด๋ฅผ ๊ฐ๋ก์ง๋ฅด์ง ์๊ณ ๊ทผ์ฒ์ ์ถ๋ก ๋ ธ๋์ ๋๋ฌํจ์ ์๋ฏธํฉ๋๋ค.
์คํ ๋ฆฌ์ง: ๊ณ์ธตํ๋ ์ํคํ ์ฒ
ํ์ต ๋ฐ์ดํฐ, ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ, ์ถ๋ก ์บ์๋ ์๋ก ๋ค๋ฅธ ์ก์ธ์ค ํจํด๊ณผ ๋น์ฉ ์๊ตฌ ์ฌํญ์ ๊ฐ์ง๋๋ค. ์ฐ๋ฆฌ๋ 3๊ณ์ธต ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค:
- Hot (NVMe ํ๋์): ํ์ฑ ํ์ต ๋ฐ์ดํฐ, ์๋น์ฉ ๋ชจ๋ธ ๊ฐ์ค์น
- Warm (ํผํฉ ํ๋์/HDD): ์ต๊ทผ ์ฒดํฌํฌ์ธํธ, ์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ์
- Cold (์์ฒด ํธ์คํ Ceph HDD ํด๋ฌ์คํฐ): ๊ณผ๊ฑฐ ํ์ต ๋ฐ์ดํฐ, ์ฅ๊ธฐ ๋ณด๊ด
๋๋ ๋ฐ์ดํฐ๋ฅผ ์ํด ์๋ํํฐ ์ค๋ธ์ ํธ ์คํ ๋ฆฌ์ง๋ฅผ Cold ๊ณ์ธต์ผ๋ก ๊ต์ฒดํ์ต๋๋ค. Cold ์คํ ๋ฆฌ์ง ์๋จ์ ๋ก์ปฌ ์บ์ ๊ณ์ธต์ ํ์ต ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์์ ํํ ๋ฐ์ํ๋ ๋ฐ๋ณต ์ฝ๊ธฐ ์์ ์ Cold HDD๊ฐ ์๋ NVMe์์ ์ฒ๋ฆฌํ๋๋ก ํฉ๋๋ค.
๊ฒฐ๊ณผ: ์คํ์ด ๋ง๋ค์ด๋ธ ์ฑ๊ณผ
๋ชจ๋ ๋ ์ด์ด์ ๊ฑธ์ณ:
- ์ปค์คํ FP8 ์ปค๋: ๋์ฝ๋ ์ ฐ์ดํ์์ ํ์ค cuBLAS ๋๋น 2.1โ4.3๋ฐฐ ๋น ๋ฆ
- ์ฐ์ ๋ฐฐ์นญ: c=1์์ c=64๊น์ง 52๋ฐฐ ์ฒ๋ฆฌ๋ ํ์ฅ, ์ง์ฐ ์๊ฐ์ 37ms ์ฆ๊ฐ์ ๊ทธ์นจ
- GPU ์ค์ผ์ค๋ง: ์ด์ฉ๋ฅ ์ฝ 50% โ 90% ์ด์, ์์ฒญ๋น ๋น์ฉ ๋๋ต ์ ๋ฐ์ผ๋ก ๊ฐ์
- ์์ฒด ์ธํ๋ผ ์์ : ์ปดํจํ , ๋คํธ์ํฌ, ์คํ ๋ฆฌ์ง์์ ํด๋ผ์ฐ๋ ๋ง์ง ์ ๊ฑฐ
์ข ํฉ์ ์ผ๋ก, ์ด์ ์๋ 4๋์ H200์ด ํ์ํ๋ ๋์ผํ ์์ฒญ๋์ ์ด์ 1๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. 4๋ฐฐ์ ํจ์จ์ฑ ํฅ์์ด ๋ฌด๋ฃ ํฐ์ด๋ฅผ ๊ฒฝ์ ์ ์ผ๋ก ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๊ฒ์ ๋๋ค. ์ด๋ ๋ณด์กฐ๊ธ์ด ์๋ ๊ตฌ์กฐ์ ์ธ ๋น์ฉ ์ ๊ฐ์ ๊ฒฐ๊ณผ์ ๋๋ค. ๋ฌด๋ฃ ์ก์ธ์ค ๊ธฐ๊ฐ์ ์ด๋ฌํ ๋จ์ ๊ฒฝ์ ์ฑ์ด ์๋ํจ์ ๋ฐ์ํฉ๋๋ค. ํ์ฌ ๊ฐ์ฉ์ฑ์ ๋ํด์๋ ์๊ธ์ ๋ฅผ ํ์ธํ์ธ์.
Fish Audio์ ์ถ๋ก ์คํ ๋น๊ต
์ธํ๋ผ ๋ฐ์ดํฐ๋ 2026๋ 6์ ๊ธฐ์ค ๊ณต๊ฐ ๋ฌธ์, GitHub ์ ์ฅ์ ๋ฐ ์์ง๋์ด๋ง ๋ธ๋ก๊ทธ๋ฅผ ๋ฐํ์ผ๋ก ํจ.
| Fish Audio S2.1 Pro | ElevenLabs | OpenAI TTS | Google Cloud TTS | |
|---|---|---|---|---|
| ์ถ๋ก ์ํคํ ์ฒ | ์ฐ์ ๋ฐฐ์นญ (sglang ๊ธฐ๋ฐ) | ๋ฏธ๊ณต๊ฐ | ๋ฏธ๊ณต๊ฐ | ๋ฏธ๊ณต๊ฐ |
| ์ปค์คํ ์ถ๋ก ์ปค๋ | โ fish-scales-ops (์คํ ์์ค) | ๋ฏธ๊ณต๊ฐ | ๋ฏธ๊ณต๊ฐ | ๋ฏธ๊ณต๊ฐ |
| FP8 ์์ํ | โ bsgemm + mxfp8 | ๋ฏธ๊ณต๊ฐ | ๋ฏธ๊ณต๊ฐ | ๋ฏธ๊ณต๊ฐ |
| GPU ์ธํ๋ผ | ์์ฒด ์์ , ์ฝ 500๊ฐ ์นด๋, ๋ฉํฐ DC | ํด๋ผ์ฐ๋ ํธ์คํ | ์์ฒด ์์ (Azure) | ์์ฒด ์์ (TPU) |
| ์คํ ์์ค ์๋น ์คํ | โ ๋ถ๋ถ์ (fish-scales-ops) | โ | โ | โ |
| ๊ณต๊ฐ๋ ์ฒ๋ฆฌ๋ ๋ฒค์น๋งํฌ | โ 8,006 tok/s (c=64, H200 ๊ธฐ์ค) | ๋ฏธ๊ณต๊ฐ | ๋ฏธ๊ณต๊ฐ | ๋ฏธ๊ณต๊ฐ |
ํจํด์ ์ผ๊ด๋ฉ๋๋ค: Fish Audio๋ ์ถ๋ก ์ํคํ ์ฒ๋ฅผ ๊ณต๊ฐ์ ์ผ๋ก ๋ฌธ์ํํ๊ณ , ์ปค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์คํ ์์ค๋ก ์ ๊ณตํ๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ์ฒ๋ฆฌ๋ ์์น๋ฅผ ๋ฐํํ ์ ์ผํ ์ฃผ์ TTS ์ ๊ณต์ ์ฒด์ ๋๋ค. "๋ฏธ๊ณต๊ฐ"๋ ๋นํ์ด ์๋๋ผ ๊ฒ์ฆ ๊ฐ๋ฅํ ์ ๋ณด์ ๋ํ ๊ด์ฐฐ์ ๋๋ค. ์ ๊ณต์ ์ฒด๋ณ ์์ฑ ํ์ง์ ๋ํ ๋ ๋ฆฝ์ ์ธ ํ๊ฐ๋ ์ฐ๋ฆฌ์ ๋ธ๋ผ์ธ๋ TTS ์ ๊ณต์ ์ฒด ๋น๊ต๋ฅผ ์ฐธ์กฐํ์ธ์.
์คํ ์์ค ํญ๋ชฉ
fish-scales-ops๋ฅผ ์ง๊ธ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค: Hopper ๋ฐ Blackwell์ฉ FP8 GEMM ๋ฐ FlashAttention, ์์ฉ ์์ค, CUDA Graph ์บก์ฒ ์์ ๋ณด์ฅ.
H200 ๋๋ RTX 5090/6000 PRO์์ ์๊ธฐํ๊ท ๋ชจ๋ธ์ ์ํ ์ถ๋ก ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๊ณ ์๋ค๋ฉด, ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋์ฝ๋ ์ ฐ์ดํ ์ฑ๋ฅ ๊ฒฉ์ฐจ๋ ์ค์ฌํ๋ฉฐ ์ด ์ปค๋๋ค์ด ๊ทธ ๊ฒฉ์ฐจ๋ฅผ ๋ฉ์์ค ๊ฒ์ ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌํจ ์ฌํญ:
- FP8 GEMM: Hopper์ฉ bsgemm (1ร128 act ร 128ร128 wgt), Blackwell์ฉ MXFP8 1ร32 (OCP UE8M0)
- sm_120a์ฉ MXFP8 FlashAttention: ์ฐ์ ํ๋ฆฌํ, ํ์ด์ง๋ ํ๋ฆฌํ(extend), ์คํธ๋ผ์ด๋-0 K/V ๋ธ๋ก๋์บ์คํธ๋ฅผ ํตํ ๋ค์ดํฐ๋ธ GQA ํ์ด์ง๋ ๋์ฝ๋
- ์ ์ฒด ๊ณผ์ ์์ CUDA Graph ์บก์ฒ ์์ ๋ณด์ฅ
ํฅํ ๊ณํ
B300 ์ง์์ด ๋ก๋๋งต์ ์์ต๋๋ค. Blackwell์ ๋ค์ดํฐ๋ธ FP8 ํ ์ ์ฝ์ด์ NVLink 5 ๋์ญํญ์ ์ฒ๋ฆฌ๋ ๊ณก์ ์ ๋์ฑ ๋์ด์ฌ๋ฆด ๊ฒ์ ๋๋ค.
์ถ๋ก ์ต์ ํ๋ ๊ณ์๋ฉ๋๋ค. ๊ณ ์ ๋ ๋ฒค์น๋งํฌ ์์น๋ ๋ชฉํ๊ฐ ์๋ ์ ํ ๋ฐฉ์ง๋ฅผ ์ํ ๊ฒ์ดํธ์ผ ๋ฟ์ ๋๋ค. ๊ฐ ๋์์ฑ ์ง์ ์ ๊ณ์ํด์ ๊ฒฝ์ ํด์ผ ํ ๋์์ ๋๋ค.
๋ ๋ง์ ์๋น ์คํ์ด ์์ ํ๋จ์ ๋ฐ๋ผ ์คํ ์์คํ๋ฅผ ๊ฒํ ์ค์ ๋๋ค โ sglang_lite ์์ ์ฌํญ, DualAR ์ ์ฉ ๋ฐฐ์นญ ๋ก์ง, sm_120a CUDA ๊ทธ๋ํ ์ฒ๋ฆฌ ๋ฑ. ๋ฌด๋ฃ ํฐ์ด๋ฅผ ์ง์ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ์ธํ๋ผ๊ฐ ๋ฐ๋ก ์ปค๋ฎค๋ํฐ๊ฐ ๊ทธ ์์์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ตฌ์ถํ๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ์ธํ๋ผ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฌด๋ฃ TTS API ์์ํ๊ธฐ
๋ชจ๋ธ ๋ฌธ์์ด: s2.1-pro-free. ๊ธฐ์กด Fish Audio API ํธ์ถ์์ ํค๋ ํ๋๋ง ๋ณ๊ฒฝํ๋ฉด ๋ฉ๋๋ค.
python
import httpx
body = {
"text": "Hello, world!",
"reference_id": "your_model_id",
"format": "mp3",
}
with httpx.Client() as client:
res = client.post(
"https://api.fish.audio/v1/tts",
headers={
"Authorization": "Bearer <YOUR_API_KEY>",
"Content-Type": "application/json",
"model": "s2.1-pro-free",
},
json=body,
)
res.raise_for_status()
with open("output.mp3", "wb") as f:
f.write(res.content)
JavaScript
import { writeFile } from "fs/promises";
const body = {
text: "Hello, world!",
reference_id: "your_model_id",
format: "mp3",
};
const res = await fetch("https://api.fish.audio/v1/tts", {
method: "POST",
headers: {
Authorization: "Bearer <YOUR_API_KEY>",
"Content-Type": "application/json",
model: "s2.1-pro-free",
},
body: JSON.stringify(body),
});
if (!res.ok) {
throw new Error(`TTS request failed: ${res.status} ${await res.text()}`);
}
const buffer = Buffer.from(await res.arrayBuffer());
await writeFile("output.mp3", buffer);
83๊ฐ ์ธ์ด. ์๊ฒฉํ ์ฌ์ฉ๋ ์ ํ ์์. ์ ์ฉ์นด๋ ํ์ ์์. ์์ฑ ํด๋ก๋ ํฌํจ.
๋ค๋ฅธ ๋ชจ๋ ์ต์ฒจ๋จ TTS API๋ ์ฒซ ํ ํฐ๋ถํฐ ๋น์ฉ์ ์ฒญ๊ตฌํ์ง๋ง, S2.1 Pro๋ ๊ทธ๋ ์ง ์์ต๋๋ค.

