ํ˜œํƒ ์ข…๋ฃŒ๊นŒ์ง€ 47H 59M 59S

Fish Audio๊ฐ€ ํ•œ ์‚ด์ด ๋˜์—ˆ์–ด์š” ๐ŸŽ‚

50% ํ• ์ธ ์ „ ์ƒํ’ˆ.

ํ˜œํƒ ๋ฐ›๊ธฐ
2026๋…„ 7์›” 23์ผ์—ฐ๊ตฌ

์šฐ๋ฆฌ๊ฐ€ ํ…์ŠคํŠธ ์Œ์„ฑ ๋ณ€ํ™˜(TTS) API๋ฅผ ๋ฌด๋ฃŒ๋กœ ๋งŒ๋“  ๋ฐฉ๋ฒ•: S2.1 Pro ์ด๋ฉด์˜ ์ถ”๋ก  ์—”์ง€๋‹ˆ์–ด๋ง

์šฐ๋ฆฌ๊ฐ€ ํ…์ŠคํŠธ ์Œ์„ฑ ๋ณ€ํ™˜(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% ๋ฏธ๋งŒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋“œ์›จ์–ด๋Š” ์ค€๋น„๋˜์–ด ์žˆ์ง€๋งŒ, ์ž‘์—…์ด ํ•˜๋“œ์›จ์–ด๋ฅผ ์ฑ„์šฐ์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹จ์ผ TTS ์š”์ฒญ์ด ํ† ํฐ ์ƒ์„ฑ ๋‹จ๊ณ„ ์‚ฌ์ด์˜ ๊ธด ๋ฉ”๋ชจ๋ฆฌ ์ง€์—ฐ ๊ฐ„๊ฒฉ์œผ๋กœ ์ธํ•ด GPU๋ฅผ ์•ฝ 10%์˜ ์‹œ๊ฐ„ ๋™์•ˆ๋งŒ ๋ฐ”์˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ํƒ€์ž„๋ผ์ธ

์—…๊ณ„์˜ ๋Œ€๋‹ต์€ ๊ธ€์ž ์ˆ˜๋‹น ๊ณผ๊ธˆ์„ ํ†ตํ•ด ๊ทธ ๋น„์šฉ์„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ „๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋‹ต์€ ์ธํ”„๋ผ ๊ณ„์ธต์—์„œ ์ด์šฉ๋ฅ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ GPU๊ฐ€ ์ด์ „์˜ 4๋Œ€ ๋ถ„๋Ÿ‰์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด, ๋ฌด๋ฃŒ ํ‹ฐ์–ด์˜ ๊ฒฝ์ œ์„ฑ์ด ํ™•๋ณด๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ํ•„์š”ํ•œ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


์—”๋“œํˆฌ์—”๋“œ ์ตœ์ ํ™”: ์ „์ฒด ์Šคํƒ

์„œ๋น™์—์„œ ์ธํ”„๋ผ๊นŒ์ง€ 5๊ฐœ ๋ ˆ์ด์–ด์˜ ์ตœ์ ํ™” ์Šคํƒ. ๊ฐ ๋ ˆ์ด์–ด์—์„œ์˜ ํšจ์œจ์„ฑ ์ด๋“์„ ๋ณด์—ฌ์คŒ: 52๋ฐฐ ์ฒ˜๋ฆฌ๋Ÿ‰, 2.1โ€“4.3๋ฐฐ ์ปค๋„ ์†๋„ ํ–ฅ์ƒ, GPU ์ด์šฉ๋ฅ  ์•ฝ 50%์—์„œ 90% ์ด์ƒ์œผ๋กœ ํ–ฅ์ƒ, ํด๋ผ์šฐ๋“œ ๋งˆ์ง„ ์ œ๊ฑฐ, ์ „์†ก ๋น„์šฉ(egress) ์ œ๊ฑฐ

๋‹จ ํ•˜๋‚˜์˜ ๋ณ€ํ™”๋กœ 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=1, 4, 16, 64์—์„œ fish-scales-ops MXFP8๊ณผ cuBLAS ๋ฐ torch.compile์„ ๋น„๊ตํ•œ ๊ทธ๋ฃน ๋ง‰๋Œ€ ์ฐจํŠธ. fish-scales-ops๋Š” M=1์—์„œ cuBLAS๋ณด๋‹ค 6.2๋ฐฐ ๋น ๋ฅด๋ฉฐ, M=64์—์„œ 1.7๋ฐฐ๋กœ ์ˆ˜๋ ดํ•จ

๋””์ฝ”๋“œ ์…ฐ์ดํ”„(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
1154 tok/s73.2 ms
4595 tok/s75.5 ms
81,206 tok/s81.2 ms
162,373 tok/s79.6 ms
324,099 tok/s96.9 ms
648,006 tok/s109.8 ms

๋™์‹œ์„ฑ 1์—์„œ์˜ 154 tok/s์—์„œ ๋™์‹œ์„ฑ 512์—์„œ์˜ 19,517 tok/s๊นŒ์ง€์˜ ์ดํ•ฉ ์ฒ˜๋ฆฌ๋Ÿ‰ ํ™•์žฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ์ด์ค‘ ์ถ• ์ฐจํŠธ. TTFB p50์€ 73ms์—์„œ 525ms๋กœ ์ ์ง„์ ์œผ๋กœ ์ƒ์Šนํ•จ

์ฒ˜๋ฆฌ๋Ÿ‰์€ 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์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


ํ’ˆ์งˆ ๊ฒ€์ฆ: ์ตœ์ ํ™”๊ฐ€ ์˜ค๋””์˜ค๋ฅผ ์ €ํ•˜์‹œํ‚ค์ง€ ์•Š์•˜์Œ์„ ํ™•์ธํ•œ ๋ฐฉ๋ฒ•

ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์ „ ๋ชจ๋“  ์ถ”๋ก  ์Šคํƒ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ •ํ™•์„ฑ ๊ฒŒ์ดํŠธ(์ฒ˜์Œ 5๊ฐœ ํ”„๋ ˆ์ž„์—์„œ bf16 ๋Œ€๋น„ ํ† ํฐ ์ผ์น˜)์™€ ์„ฑ๋Šฅ ๊ฒŒ์ดํŠธ(c=1, 16, 64์—์„œ decode_tps 5% ์ด๋‚ด)๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•จ์„ ๋ณด์—ฌ์ฃผ๋Š” ์ˆœ์„œ๋„

์–‘์žํ™”์™€ ๋ฐฐ์นญ์€ ์ฒ˜๋ฆฌ๋Ÿ‰ ๋ฒค์น˜๋งˆํฌ๋งŒ์œผ๋กœ๋Š” ๊ฐ์ง€ํ•˜๊ธฐ ์–ด๋ ค์šด ํ’ˆ์งˆ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GPU๊ฐ€ ์ตœ๋Œ€ ์†๋„๋กœ ์ž‘๋™ํ•˜๋”๋ผ๋„ ์ž˜๋ชป๋œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” mxfp8 ๊ฐœ๋ฐœ ์ค‘์— ์ด๋Ÿฌํ•œ ์‚ฌ๋ก€๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์›จ์ดํŠธ ๋ ˆ์ด์•„์›ƒ ๋ฒ„๊ทธ๋Š” ์ปค๋„ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์™„์ „ํžˆ ์ •์ƒ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์•ฝ 53%์˜ ์ƒ๋Œ€์  ๋กœ์ง“ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ €ํ•˜๋Š” ์„ฑ๋Šฅ ์ง€ํ‘œ๊ฐ€ ์•„๋‹Œ ์ถœ๋ ฅ ํ† ํฐ ๋ถ„์„์—์„œ๋งŒ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ์—๋Š” ๋‘ ๊ฐ€์ง€ ๊ฒŒ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

์ •ํ™•์„ฑ ๊ฒŒ์ดํŠธ(Correctness gate): ์–‘์žํ™” ํ›„ ๊ทธ๋ฆฌ๋”” ๋””์ฝ”๋“œ๋Š” ๊ณ ์ •๋œ ์ฐธ์กฐ ์ž…๋ ฅ์— ๋Œ€ํ•ด ์ฒ˜์Œ 5๊ฐœ์˜ ์˜ค๋””์˜ค ํ”„๋ ˆ์ž„์—์„œ bf16๊ณผ ํ† ํฐ ๋‹จ์œ„๋กœ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ํ”„๋ ˆ์ž„์—์„œ์˜ ํ† ํฐ ๋‹จ์œ„ ์ผ์น˜๋Š” ์‹œ์Šคํ…œ์ ์ธ ๋กœ์ง“ ์†์ƒ์„ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค. ์–‘์žํ™”๋œ ๋ชจ๋ธ์ด ๋‹ค๋ฅธ ํ™•๋ฅ  ๋ถ„ํฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ๊ฒฐ์ •๋ก ์  ์ž…๋ ฅ์— ๋Œ€ํ•ด ์ฆ‰์‹œ bf16๊ณผ ๋‹ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ์ €ํ•˜ ๊ฒŒ์ดํŠธ(Performance regression gate): ์š”์ฒญ๋‹น decode_tps๋Š” ๋ชจ๋“  ๋™์‹œ์„ฑ ์ง€์ ์—์„œ ๊ณ ์ •๋œ ๋ฒ ์ด์Šค๋ผ์ธ ์ˆ˜์น˜์˜ 5% ์ด๋‚ด๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋™์‹œ์„ฑ ์ง€์ (c=1, c=16, c=64)์—์„œ๋“  ์ฒ˜๋ฆฌ๋Ÿ‰์„ 5% ์ด์ƒ ์ €ํ•˜์‹œํ‚ค๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ณ‘ํ•ฉ ์ „ ๋ช…์‹œ์ ์ธ ์ •๋‹นํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒŒ์ดํŠธ๋Š” ๋””์ฝ”๋“œ ๋ฃจํ”„์— ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ ๋™๊ธฐํ™” ๊ณผ์ •์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ •ํ™•์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฒŒ์ดํŠธ๋Š” ์ถ”๋ก  ์Šคํƒ์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, S2.1 Pro ๋ฌด๋ฃŒ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋Š” ์œ ๋ฃŒ ํ‹ฐ์–ด์™€ ๋™์ผํ•˜๋ฉฐ, ์–‘์žํ™”๋œ ์„œ๋น™ ๊ฒฝ๋กœ๋Š” ๋ชจ๋“  ๋ฐฐํฌ ์‹œ ๋น„์–‘์žํ™” ๋ฒ ์ด์Šค๋ผ์ธ์— ๋Œ€ํ•ด ๊ฒ€์ฆ๋ฉ๋‹ˆ๋‹ค.


๋Œ€๊ทœ๋ชจ ์Œ์„ฑ ํด๋กœ๋‹: ์ถ”๋ก  ํšจ์œจ์„ฑ์ด ์ค‘์š”ํ•œ ์ด์œ 

ํ‘œ์ค€ TTS(ํ…์ŠคํŠธ ์ž…๋ ฅ โ†’ S2.1 Pro ๋ชจ๋ธ โ†’ ์˜ค๋””์˜ค ์ถœ๋ ฅ)์™€ ์Œ์„ฑ ํด๋กœ๋‹(ํ…์ŠคํŠธ ์ž…๋ ฅ + ์ฐธ์กฐ ์˜ค๋””์˜ค ์ƒ˜ํ”Œ โ†’ ํ™”์ž ์กฐ๊ฑดํ™”๊ฐ€ ํฌํ•จ๋œ 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%์˜ ์œ ํœด ๊ฐ„๊ฒฉ์„ ๋‚จ๊น€. ํ›„: ์ถ”๋ก , ํ•™์Šต, ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ์ž‘์—…์ด ์ด์šฉ๋ฅ ์„ ์•ฝ 90% ์ด์ƒ์œผ๋กœ ์ด˜์ด˜ํžˆ ์ฑ„์›€

์ถ”๋ก  ์ „์šฉ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฒ ์ด์Šค๋ผ์ธ 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์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.


๊ฒฐ๊ณผ: ์Šคํƒ์ด ๋งŒ๋“ค์–ด๋‚ธ ์„ฑ๊ณผ

์ด์ „์—๋Š” ์•ฝ 50% ์ด์šฉ๋ฅ ๋กœ 4๋Œ€์˜ H200 GPU๊ฐ€ ํ•„์š”ํ–ˆ๋˜ ๋™์ผํ•œ ์š”์ฒญ๋Ÿ‰์„, 4๋ฐฐ ํšจ์œจ์„ฑ ํ–ฅ์ƒ ํ›„ ์•ฝ 90% ์ด์ƒ ์ด์šฉ๋ฅ ๋กœ 1๋Œ€์˜ H200์ด ์ฒ˜๋ฆฌํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด์—ฌ์ฃผ๋Š” ์ „ํ›„ ๋‹ค์ด์–ด๊ทธ๋žจ

๋ชจ๋“  ๋ ˆ์ด์–ด์— ๊ฑธ์ณ:

  • ์ปค์Šคํ…€ 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 ProElevenLabsOpenAI TTSGoogle 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๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

60์ดˆ ์ด๋‚ด์— ์Œ์„ฑ ํด๋กœ๋‹ํ•˜๊ธฐ โ†’

์ „์ฒด API ๋ฌธ์„œ โ†’

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

์—ฐ์† ๋ฐฐ์นญ(Continuous batching)์ด๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์™œ TTS ๋น„์šฉ์— ์ค‘์š”ํ•œ๊ฐ€์š”?
์—ฐ์† ๋ฐฐ์นญ์€ ์ „์ฒด ๋ฐฐ์น˜๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  GPU ๋””์ฝ”๋“œ ๋ฃจํ”„๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค. ์ •์  ๋ฐฐ์นญ์—์„œ๋Š” ๋ฐฐ์น˜ ๋‚ด์˜ ๋‹จ์ผ ์Šฌ๋กœ์šฐ ์š”์ฒญ์ด ๋‹ค๋ฅธ ๋ชจ๋“  ์š”์ฒญ์„ ๋ถ™์žก์•„ ๋‘์–ด ๊ฐ€์žฅ ๋А๋ฆฐ ์‹œํ€€์Šค๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ GPU๊ฐ€ ์œ ํœด ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์—ฐ์† ๋ฐฐ์นญ์€ ์Šฌ๋กฏ์ด ๋น„๋Š” ๋Œ€๋กœ ํ™œ์„ฑ ๋””์ฝ”๋“œ ๋ฐฐ์น˜์— ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ์ถœ๋ ฅ ๊ธธ์ด์˜ ๊ฐ€๋ณ€์„ฑ์— ๊ด€๊ณ„์—†์ด GPU ์ด์šฉ๋ฅ ์„ ๋†’๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์งง์€ ๊ตฌ์ ˆ๋ถ€ํ„ฐ ๊ธด ๋ฌธ๋‹จ๊นŒ์ง€ ์š”์ฒญ๋ณ„ ์ถœ๋ ฅ ๊ธธ์ด ์ฐจ์ด๊ฐ€ ํฐ TTS์˜ ๊ฒฝ์šฐ, ์ •์  ๋ฐฐ์นญ๊ณผ ์—ฐ์† ๋ฐฐ์นญ ์‚ฌ์ด์˜ ์ด์šฉ๋ฅ  ์ฐจ์ด๋Š” ์ƒ๋‹นํ•ฉ๋‹ˆ๋‹ค.
์™œ FP8 ์–‘์žํ™”๊ฐ€ ์Œ์„ฑ ํ’ˆ์งˆ์„ ์ €ํ•˜์‹œํ‚ค์ง€ ์•Š๋‚˜์š”?
FP8 ์–‘์žํ™”๋Š” ๊ฐ€์ค‘์น˜ ํ‘œํ˜„์˜ ์ˆ˜์น˜ ์ •๋ฐ€๋„๋ฅผ 16๋น„ํŠธ์—์„œ 8๋น„ํŠธ๋กœ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ด๋ฉฐ, ์‹ ์ค‘ํ•œ ๊ฒ€์ฆ ์—†์ด ์ ์šฉํ•  ๊ฒฝ์šฐ ํ’ˆ์งˆ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ฐฐํฌ ์‹œ๋งˆ๋‹ค ๋‘ ๊ฐ€์ง€ ๊ฒŒ์ดํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค: ํ† ํฐ ๋‹จ์œ„ ์ •ํ™•์„ฑ ์ฒดํฌ(์–‘์žํ™”๋œ ๊ทธ๋ฆฌ๋”” ๋””์ฝ”๋“œ๊ฐ€ ๊ณ ์ •๋œ ์ฐธ์กฐ ์ž…๋ ฅ์˜ ์ฒ˜์Œ 5๊ฐœ ์˜ค๋””์˜ค ํ”„๋ ˆ์ž„์—์„œ bf16๊ณผ ํ† ํฐ๋ณ„๋กœ ์ผ์น˜ํ•ด์•ผ ํ•จ)์™€ ์ฒ˜๋ฆฌ๋Ÿ‰ ์ €ํ•˜ ๊ฒŒ์ดํŠธ(๋ชจ๋“  ๋™์‹œ์„ฑ ์ง€์ ์—์„œ ๋””์ฝ”๋“œ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋ฒ ์ด์Šค๋ผ์ธ์˜ 5% ์ด๋‚ด์—ฌ์•ผ ํ•จ)์ž…๋‹ˆ๋‹ค. ํ† ํฐ ๋‹จ์œ„ ์ฒดํฌ๋Š” ๋กœ์ง“ ์ˆ˜์ค€์˜ ์†์ƒ์„ ์ง์ ‘ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค. ์–‘์žํ™”๊ฐ€ ๋ชจ๋ธ์˜ ํ™•๋ฅ  ๋ถ„ํฌ๋ฅผ ์ €ํ•˜์‹œํ‚จ๋‹ค๋ฉด ๊ฒฐ์ •๋ก ์  ์ž…๋ ฅ์—์„œ ์ฆ‰์‹œ ๋‚˜ํƒ€๋‚˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. S2.1 Pro Free๋Š” ์œ ๋ฃŒ ํ‹ฐ์–ด์™€ ๋™์ผํ•œ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์–‘์žํ™”๋Š” ์„œ๋น™ ๋ ˆ์ด์–ด์—์„œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๋ฐฐ์น˜ ์ถ”๋ก ์ด ๊ฐœ๋ณ„ ์š”์ฒญ์˜ ์ง€์—ฐ ์‹œ๊ฐ„์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋‚˜์š”?
c=1์ผ ๋•Œ์™€ ๋น„๊ตํ•˜์—ฌ c=64์ผ ๋•Œ TTFB๋Š” 73ms์—์„œ 110ms๋กœ 37ms ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๋•์…˜ ์›Œํฌ๋กœ๋“œ์—์„œ ์ด ์ฐจ์ด๋Š” ์ธ์ง€ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด๋Š” 37ms์˜ ์ถ”๊ฐ€ ์š”์ฒญ๋‹น ์ง€์—ฐ ์‹œ๊ฐ„์„ ๋Œ€๊ฐ€๋กœ 52๋ฐฐ ๋” ๋งŽ์€ ์ดํ•ฉ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์–ป๋Š” ๋ช…ํ™•ํ•œ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„์ž…๋‹ˆ๋‹ค. ๋ณด์ด์Šค ์—์ด์ „ํŠธ์™€ ๊ฐ™์ด ์ง€์—ฐ ์‹œ๊ฐ„์— ๋ฏผ๊ฐํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด, ์šฐ๋ฆฌ๋Š” ์ฒ˜๋ฆฌ๋Ÿ‰๋ณด๋‹ค TTFA์— ์ตœ์ ํ™”๋œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ€์ง„ ๋ณ„๋„์˜ ์‹ค์‹œ๊ฐ„ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ ์‹œ ํ”„๋ฆฌํ•„์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ค‘์š”ํ•œ ๊ฒฝ๋กœ์—์„œ ์ œ์™ธํ•˜๊ณ , ํ•‘ํ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ†ตํ•ด ์‚ฌ์ดํด๋ณ„ ํ˜ธ์ŠคํŠธ ๋ฐฐ๋ฆฌ์–ด๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
fish-scales-ops๋ž€ ๋ฌด์—‡์ด๋ฉฐ ๋ˆ„๊ฐ€ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”?
fish-scales-ops๋Š” NVIDIA Hopper(H200) ๋ฐ Blackwell(RTX 5090, RTX 6000 PRO) ์•„ํ‚คํ…์ฒ˜๋ฅผ ์œ„ํ•œ Fish Audio์˜ ์˜คํ”ˆ ์†Œ์Šค FP8 GEMM ๋ฐ FlashAttention ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ž๊ธฐํšŒ๊ท€ ์ถ”๋ก ์„ ์ง€๋ฐฐํ•˜๋Š” ์ž‘์€ M ๋””์ฝ”๋“œ ์…ฐ์ดํ”„(M โ‰ค 128)๋ฅผ ํƒ€๊ฒŸ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์…ฐ์ดํ”„๋Š” cuBLAS๋‚˜ PyTorch์™€ ๊ฐ™์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ตœ์ ํ™”๋˜์–ด ์žˆ์ง€ ์•Š์€ ์˜์—ญ์ž…๋‹ˆ๋‹ค. H200 ๋˜๋Š” Blackwell ํ•˜๋“œ์›จ์–ด์—์„œ ์ž๊ธฐํšŒ๊ท€ ๋ชจ๋ธ(TTS, LLM ๋“ฑ)์„ ์‹คํ–‰ํ•˜๊ณ  ์ €~์ค‘๊ฐ„ ๋™์‹œ์„ฑ์œผ๋กœ ์„œ๋น™ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์„ฑ๋Šฅ ๊ฒฉ์ฐจ๋ฅผ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ฉ”์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” CUDA Graph ์บก์ฒ˜ ์•ˆ์ „์ด ๋ณด์žฅ๋˜๋ฉฐ Fish Audio์˜ ์„œ๋น™ ์ธํ”„๋ผ์—์„œ ๊ฒ€์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Fish Audio์˜ ์ธํ”„๋ผ๋Š” ํด๋ผ์šฐ๋“œ ํ˜ธ์ŠคํŒ… TTS ์ œ๊ณต์—…์ฒด์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?
๋Œ€๋ถ€๋ถ„์˜ TTS ์ œ๊ณต์—…์ฒด๋Š” ํด๋ผ์šฐ๋“œ ๊ด€๋ฆฌ GPU ์ธํ”„๋ผ(AWS, Azure, GCP)์—์„œ ์šด์˜ํ•˜๋ฉฐ ํด๋ผ์šฐ๋“œ ๊ฐ€๊ฒฉ ์ฑ…์ •์„ API ๋น„์šฉ์— ์ „์ดํ•ฉ๋‹ˆ๋‹ค. Fish Audio๋Š” ์ž์ฒด GPU ํด๋Ÿฌ์Šคํ„ฐ(์•ฝ 500๊ฐœ ์นด๋“œ, ๋ฉ€ํ‹ฐ DC), ๋„คํŠธ์›Œํฌ ์ธํ”„๋ผ(ASN, 300Gbps, Cloudflare ํ”ผ์–ด๋ง), ์Šคํ† ๋ฆฌ์ง€(์ž์ฒด ํ˜ธ์ŠคํŒ… Ceph)๋ฅผ ์†Œ์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ์„ ์ง์ ‘ ์†Œ์œ ํ•จ์œผ๋กœ์จ ์ปดํ“จํŒ…, ์ „์†ก ๋น„์šฉ, ์Šคํ† ๋ฆฌ์ง€ ๋“ฑ ๋ชจ๋“  ๋ ˆ์ด์–ด์—์„œ ํด๋ผ์šฐ๋“œ ๋งˆ์ง„์„ ์ œ๊ฑฐํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํ™˜๊ฒฝ์—์„œ ๊ตฌ์กฐ์ ์ธ ๋น„์šฉ ์šฐ์œ„๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ด€๋ฆฌํ˜• ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ํ•˜๋“œ์›จ์–ด๋ณ„ ์ตœ์ ํ™”(์˜ˆ: RTX 6000 PRO๋ฅผ ์œ„ํ•œ sm_120a CUDA ๊ทธ๋ž˜ํ”„ ์ž‘์—… ๋“ฑ)๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

์‹ค๊ฐ ๋‚˜๋Š” ๋ชฉ์†Œ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”

์˜ค๋Š˜๋ถ€ํ„ฐ ์ตœ๊ณ  ํ’ˆ์งˆ์˜ ์˜ค๋””์˜ค๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.

์ด๋ฏธ ๊ณ„์ •์ด ์žˆ์œผ์‹ ๊ฐ€์š”? ๋กœ๊ทธ์ธ