• ONNX Runtime์€ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋…๋ฆฝ์ ์œผ๋กœ ML ๋ชจ๋ธ์„ ์ถ”๋ก ํ•˜๋Š” ํฌ๋กœ์Šคํ”Œ๋žซํผ ๊ฐ€์† ์—”์ง„
  • PyTorchยทTensorFlow ๋“ฑ์—์„œ ํ•™์Šตํ•œ ๋ชจ๋ธ์„ ONNX ํฌ๋งท์œผ๋กœ ๋ณ€ํ™˜ํ•ด ์–ด๋””์„œ๋“  ์‹คํ–‰ํ•˜๋Š” ๋Ÿฐํƒ€์ž„
  • ๊ทธ๋ž˜ํ”„ ์ตœ์ ํ™”์™€ Execution Provider๋กœ ํ•˜๋“œ์›จ์–ด๋ณ„ ๊ฐ€์†์„ ์ถ”์ƒํ™”ํ•œ ์ถ”๋ก  ์—”์ง„
  • CPUยทGPUยท๋ชจ๋ฐ”์ผยท๋ธŒ๋ผ์šฐ์ €(WebGPU/WASM)๊นŒ์ง€ ๋‹จ์ผ ๋ชจ๋ธ๋กœ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ

ํ•ด๋‹น ๊ฐœ๋…์ด ํ•„์š”ํ•œ ์ด์œ 

  • ํ•™์Šต ํ™˜๊ฒฝ(PyTorch/Python)๊ณผ ๋ฐฐํฌ ํ™˜๊ฒฝ(C++/Java/๋ธŒ๋ผ์šฐ์ €)์ด ์„œ๋กœ ๋‹ค๋ฆ„
  • ํ•˜๋“œ์›จ์–ด๋งˆ๋‹ค ์ตœ์  ์ถ”๋ก  ๋ฐฉ์‹์ด ๋‹ฌ๋ผ ์ง์ ‘ ๋Œ€์‘ํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ํผ
  • ์˜จ๋””๋ฐ”์ด์Šค ๋ฐฐํฌ์—๋Š” ๊ฒฝ๋Ÿ‰ยท๊ณ ์† ์ถ”๋ก ์ด ํ•„์ˆ˜

ONNX์™€ ONNX Runtime์€ ๋‹ค๋ฅด๋‹ค

ONNX๋Š” ๋ชจ๋ธ์˜ ๊ตฌ์กฐ์™€ ๊ฐ€์ค‘์น˜๋ฅผ ๋‹ด์€ ํ‘œ์ค€ ํŒŒ์ผ ํฌ๋งท(.onnx)์ด๊ณ , ๊ทธ ์ž์ฒด๋กœ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋‹ค. MP3 ํŒŒ์ผ๊ณผ ์Œ์•… ํ”Œ๋ ˆ์ด์–ด์˜ ๊ด€๊ณ„์ฒ˜๋Ÿผ, ONNX ํŒŒ์ผ์„ ์‹ค์ œ๋กœ ๋ถˆ๋Ÿฌ์™€ ์ถ”๋ก (inference)์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹คํ–‰ ์—”์ง„์ด ONNX Runtime์ด๋‹ค. ๋”ฐ๋ผ์„œ โ€œ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•œ๋‹คโ€๋Š” ๊ฒƒ์€ ONNX Runtime์ด .onnx ํŒŒ์ผ์„ ๋กœ๋“œํ•ด ์˜ˆ์ธกยท์ƒ์„ฑ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค.

๊ตฌ๋ถ„ONNXONNX Runtime
์ •์ฒดํŒŒ์ผ ํฌ๋งท (.onnx)๊ทธ ํŒŒ์ผ์„ ์ฝ์–ด ์‹คํ–‰ํ•˜๋Š” ์—”์ง„
๋น„์œ MP3 ํŒŒ์ผ / PDF ๋ฌธ์„œ์Œ์•… ํ”Œ๋ ˆ์ด์–ด / PDF ๋ทฐ์–ด
ํ˜ผ์ž์„œ์‹คํ–‰ ๋ชป ํ•จ (๊ทธ๋ƒฅ ๋ฐ์ดํ„ฐ)ONNX ํŒŒ์ผ์„ ๋กœ๋“œํ•ด์•ผ ๋™์ž‘

ONNX์˜ ๋ชฉ์  โ€” ํ•™์Šต ํ™˜๊ฒฝ๊ณผ ๋ฐฐํฌ ํ™˜๊ฒฝ์˜ ๋ถ„๋ฆฌ

ONNX(Open Neural Network Exchange)์˜ ํ•ต์‹ฌ ๋ชฉ์ ์€ ํ•™์Šต ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์‹คํ–‰ ํ™˜๊ฒฝ์„ ๋ถ„๋ฆฌ(decoupling)ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. PyTorch๋‚˜ TensorFlow๋กœ ํ•™์Šตํ•œ ๋ชจ๋ธ์„ ONNX๋กœ ๋ณ€ํ™˜ํ•ด ๋‘๋ฉด, ๊ทธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์—†๋Š” ํ™˜๊ฒฝ(๋ธŒ๋ผ์šฐ์ €ยทC++ ์•ฑยท๋ชจ๋ฐ”์ผ)์—์„œ๋„ ๋™์ผํ•œ ๋ชจ๋ธ์„ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

flowchart LR
    A[PyTorch / TensorFlow<br/>๋กœ ํ•™์Šต] -->|export| B[(model.onnx<br/>ํ‘œ์ค€ ํฌ๋งท)]
    B --> C[Python ์„œ๋ฒ„]
    B --> D[Node.js ์„œ๋ฒ„]
    B --> E[๋ธŒ๋ผ์šฐ์ € WebGPU]
    B --> F[๋ชจ๋ฐ”์ผ iOS/Android]

๋ชจ๋ธ์€ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๊ณ , ์–ธ์ œ .onnx๊ฐ€ ๋˜๋‚˜

ํ•™์Šต๋œ ๋ชจ๋ธ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ .onnx๊ฐ€ ์•„๋‹ˆ๋‹ค. .onnx๋Š” ํ•™์Šต์ด ๋๋‚œ ๋’ค ์„ ํƒ์ ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋งŒ๋“œ๋Š” ์‚ฐ์ถœ๋ฌผ์ด๋‹ค.

flowchart LR
    A["โ‘  ์„ค๊ณ„<br/>์‹ ๊ฒฝ๋ง ๊ตฌ์กฐ๋ฅผ ์ฝ”๋“œ๋กœ ์ •์˜<br/>(PyTorch: nn.Module)"] --> B["โ‘ก ํ•™์Šต(training)<br/>forwardโ†’lossโ†’backprop<br/>๊ฐ€์ค‘์น˜ ์—…๋ฐ์ดํŠธ ๋ฐ˜๋ณต"]
    B --> C["โ‘ข ์ €์žฅ (๋„ค์ดํ‹ฐ๋ธŒ ํฌ๋งท)<br/>PyTorch: .pt / .safetensors<br/>TF: SavedModel / .h5"]
    C -.์„ ํƒ์  ๋ณ€ํ™˜.-> D["โ‘ฃ ONNX export<br/>model.onnx"]
    D --> E["โ‘ค ONNX Runtime์œผ๋กœ ์ถ”๋ก "]
  1. ์„ค๊ณ„: ์‹ ๊ฒฝ๋ง ๊ตฌ์กฐ(๋ ˆ์ด์–ด)๋ฅผ ์ฝ”๋“œ๋กœ ์ •์˜ํ•œ๋‹ค (PyTorch๋ฉด nn.Module).
  2. ํ•™์Šต: ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด ์˜ˆ์ธก โ†’ ์ •๋‹ต๊ณผ์˜ ์˜ค์ฐจ(loss) ๊ณ„์‚ฐ โ†’ ์—ญ์ „ํŒŒ(backprop)๋กœ ๊ฐ€์ค‘์น˜๋ฅผ ์ˆ˜์ •, ์ด๋ฅผ ์ˆ˜์—†์ด ๋ฐ˜๋ณตํ•œ๋‹ค.
  3. ์ €์žฅ: ํ•™์Šต๋œ โ€œ๊ตฌ์กฐ + ๊ฐ€์ค‘์น˜โ€๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ ๋„ค์ดํ‹ฐ๋ธŒ ํฌ๋งท์œผ๋กœ ์ €์žฅํ•œ๋‹ค. PyTorch๋Š” .pt/.safetensors, TensorFlow๋Š” SavedModel/.h5๋‹ค. ์ด ๋‹จ๊ณ„๊นŒ์ง€๋Š” .onnx๊ฐ€ ์•„๋‹ˆ๋‹ค.
  4. ONNX export(์„ ํƒ): ๋ฐฐํฌยท์ถ”๋ก ์„ ์œ„ํ•ด ๋ณ„๋„ ๋ณ€ํ™˜ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ .onnx๊ฐ€ ๋œ๋‹ค.
# PyTorch ๋ชจ๋ธ์„ ONNX๋กœ ๋ณ€ํ™˜(export)ํ•˜๋Š” ํ•œ ์ค„
torch.onnx.export(model, example_input, "model.onnx")

safetensors๋Š” โ€˜๊ฐ€์ค‘์น˜โ€™๋งŒ ๋‹ด๋Š”๋‹ค โ€” open weights โ‰  open source

safetensors๋Š” ํ•™์Šต๋œ ๊ฐ€์ค‘์น˜(ํ…์„œ = ์ˆ˜๋งŽ์€ ์ˆซ์ž)๋งŒ ๋‹ด๋Š” ํŒŒ์ผ ํฌ๋งท์ด๋‹ค(pickle๊ณผ ๋‹ฌ๋ฆฌ ์ž„์˜ ์ฝ”๋“œ ์‹คํ–‰์ด ์—†์–ด โ€œsafeโ€ํ•˜๋‹ค). ๋”ฐ๋ผ์„œ ์ด ํŒŒ์ผ์„ ๋ฐ›์•˜๋‹ค๊ณ  ํ•ด์„œ โ€œ์–ด๋–ป๊ฒŒ ํ•™์Šต๋๋Š”์ง€โ€๊นŒ์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

  • ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ: ๊ฐ€์ค‘์น˜ ๊ฐ’, ๊ทธ๋ฆฌ๊ณ  ๋ณดํ†ต ํ•จ๊ป˜ ๋ฐฐํฌ๋˜๋Š” config.json๊ณผ ๊ณต๊ฐœ๋œ modeling ์ฝ”๋“œ(์˜ˆ: HuggingFace transformers)๋กœ ํŒŒ์•…ํ•˜๋Š” ๋ชจ๋ธ ๊ตฌ์กฐ(architecture). ๊ฐ€์ค‘์น˜๋ฅผ ๋กœ๋“œํ•˜๋ ค๋ฉด ๊ตฌ์กฐ๋ฅผ ์•Œ์•„์•ผ ํ•˜๋ฏ€๋กœ ๊ตฌ์กฐ๋Š” ๋Œ€์ฒด๋กœ ๊ณต๊ฐœ๋œ๋‹ค.
  • ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒƒ: ํ•™์Šต์— ์“ด ๋ฐ์ดํ„ฐ, ์ •ํ™•ํ•œ ํ•™์Šต ์ฝ”๋“œยท๋ ˆ์‹œํ”ผยทํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ, RLHF ๋“ฑ ํ›„์ฒ˜๋ฆฌ. ์ด๋Ÿฐ ์ •๋ณด๋Š” safetensors์— ๋“ค์–ด์žˆ์ง€ ์•Š๋‹ค.

๊ทธ๋ž˜์„œ GemmaยทLlama ๊ฐ™์€ ๋ชจ๋ธ์€ โ€œopen weightsโ€(๊ฐ€์ค‘์น˜ ๊ณต๊ฐœ)์ด์ง€ ์™„์ „ํ•œ โ€œopen sourceโ€๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ฐ€์ค‘์น˜๋Š” ๋‚ด๋ ค๋ฐ›์•„ ์“ฐ๊ณ  ํŠœ๋‹ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์–ด๋–ค ๋ฐ์ดํ„ฐ๋กœ ์–ด๋–ป๊ฒŒ ํ•™์Šตํ–ˆ๋Š”์ง€๋Š” ๊ธฐ์ˆ  ๋ณด๊ณ ์„œ(technical report)์˜ ๊ฐœ๋žต์  ์„ค๋ช… ์ •๋„๋งŒ ๊ณต๊ฐœ๋˜๋ฉฐ ์ „์ฒด๋ฅผ ์žฌํ˜„(reproduce)ํ•  ์ˆ˜๋Š” ์—†๋‹ค. ๊ฐ€์ค‘์น˜ + ํ•™์Šต ์ฝ”๋“œ + ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋ชจ๋‘ ๊ณต๊ฐœํ•˜๋Š” OLMo, Pythia ๊ฐ™์€ ์‚ฌ๋ก€๊ฐ€ ์ง„์งœ โ€œopen sourceโ€์— ๊ฐ€๊น๋‹ค.

๋น„์œ ํ•˜๋ฉด safetensors๋Š” ๊ณต๋ถ€๋ฅผ ๋๋‚ธ ํ•™์ƒ์˜ โ€˜๋จธ๋ฆฟ์† ์ง€์‹โ€™์„ ํ†ต์งธ๋กœ ๋ณต์‚ฌํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ๋ฌด์—‡์„ ์•„๋Š”์ง€(๊ฐ€์ค‘์น˜)๋Š” ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™”์ง€๋งŒ, ๊ทธ ํ•™์ƒ์ด ์–ด๋–ค ๊ต์žฌ๋กœ ์–ด๋–ป๊ฒŒ ๊ณต๋ถ€ํ–ˆ๋Š”์ง€(ํ•™์Šต ๋ฐ์ดํ„ฐยท๊ณผ์ •)๋Š” ๋ณต์‚ฌ๋ณธ๋งŒ ๋ด์„œ๋Š” ์•Œ ์ˆ˜ ์—†๋‹ค.

.onnx์—์„œ ํŠœ๋‹ํ•  ์ˆ˜ ์žˆ๋‚˜?

์—†๋‹ค๊ณ  ๋ณด๋Š” ๊ฒŒ ๋งž๋‹ค. ONNX๋Š” ์ถ”๋ก ์— ์ตœ์ ํ™”๋œ ๊ฑฐ์˜ ๊ณ ์ •๋œ ๊ทธ๋ž˜ํ”„๋ผ ํ•™์Šต/ํŠœ๋‹์šฉ์ด ์•„๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ fine-tuning์€ ONNX ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ PyTorch ์›๋ณธ(.safetensors ๋“ฑ)์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋๋‚œ ๋’ค ๋‹ค์‹œ ONNX๋กœ re-exportํ•œ๋‹ค. Gemma ๊ฐ™์€ ๊ณต๊ฐœ ๋ชจ๋ธ๋„ ์›๋ณธ์€ ๋ณดํ†ต .safetensors๋กœ ๋ฐฐํฌ๋˜๋ฉฐ, ONNX ๋ฒ„์ „์€ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋ณ€ํ™˜ํ–ˆ๊ฑฐ๋‚˜ ์ง์ ‘ exportํ•œ ๋ณ„๋„ ์‚ฐ์ถœ๋ฌผ์ด๋‹ค. ์ฆ‰ โ€œํ•™์ŠตยทํŠœ๋‹์€ PyTorch์—์„œ, ๋ฐฐํฌยท์ถ”๋ก ์€ ONNX์—์„œโ€๊ฐ€ ์ผ๋ฐ˜์ ์ธ ๋ถ„์—…์ด๋ฉฐ, Supertonic๋„ PyTorch๋กœ ํ•™์Šตํ•œ ๋’ค ONNX๋กœ ๋ฐฐํฌํ•œ ์‚ฌ๋ก€๋‹ค.

๊ฐ€์ค‘์น˜๋กœ ๋ฌด์—‡์„ ์žฌํ™œ์šฉํ•˜๋‚˜ โ€” fine-tuning๊ณผ distillation

open weights๋ฅผ ๋ฐ›์œผ๋ฉด ๋‹ค์Œ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๊ทธ๋Œ€๋กœ ์ถ”๋ก : ๋ณ€ํ™˜ยทํ•™์Šต ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • Fine-tuning(๋ฏธ์„ธ์กฐ์ •): ๊ณต๊ฐœ ๊ฐ€์ค‘์น˜๋ฅผ ์ถœ๋ฐœ์ ์œผ๋กœ ์‚ผ์•„ ๋‚ด ๋ฐ์ดํ„ฐ๋กœ ์ถ”๊ฐ€ ํ•™์Šตํ•œ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ(scratch) ํ•™์Šตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ์ ์€ ๋ฐ์ดํ„ฐยท๋น„์šฉ์œผ๋กœ ๋‚ด ์šฉ๋„์— ๋งž์ถ˜๋‹ค. ๋Œ€ํ•™ ์กธ์—…์ž๋ฅผ ์‹ ์ž…์œผ๋กœ ๋ฝ‘์•„ ํšŒ์‚ฌ ์—…๋ฌด๋งŒ ๋‹จ๊ธฐ ๊ต์œกํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ํ”ํ•œ ์žฌํ™œ์šฉ ๋ฐฉ์‹์ด๋‹ค.
  • Knowledge Distillation(์ง€์‹ ์ฆ๋ฅ˜): ํฐ ๋ชจ๋ธ(teacher)์˜ ์ถœ๋ ฅ์„ ์ž‘์€ ๋ชจ๋ธ(student)์—๊ฒŒ ๊ฐ€๋ฅด์ณ ์ง€์‹์„ ์˜ฎ๊ธด๋‹ค. ๋ฐ•์‚ฌ๊ฐ€ ํ•™์ƒ์„ ๊ณผ์™ธํ•ด ๋น„์Šทํ•œ ๋‹ต์„ ๋‚ด๊ฒŒ ๋งŒ๋“œ๋Š” ์…ˆ์ด๋‹ค.

โ€œ๋จธ๋ฆฟ์† ์ง€์‹์„ ํ†ต์งธ๋กœ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋‚˜?โ€์— ๋‹ตํ•˜๋ฉด, ๊ตฌ์กฐ๊ฐ€ ๊ฐ™์€ ๋ชจ๋ธ์ด๋ผ๋ฉด ๊ฐ€์ค‘์น˜ ํŒŒ์ผ์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ๊ณง ํ†ต์งธ ๋ณต์ œ๋‹ค(๋™์ผํ•œ โ€˜๋‡Œโ€™ ๋ณต์‚ฌ๋ณธ). ํ•˜์ง€๋งŒ ๋” ์ž‘๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๊ตฌ์กฐ์˜ ๋ชจ๋ธ๋กœ ์˜ฎ๊ธฐ๋ ค๋ฉด ํ†ต์งธ ์ด์‹์ด ์•„๋‹ˆ๋ผ distillation์œผ๋กœ โ€œ๊ฐ€๋ฅด์ณ์„œ ํ‰๋‚ด๋‚ด๊ฒŒโ€ ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ์›๋ณธ์˜ ๊ทผ์‚ฌ์น˜๋‹ค. ๊ธฐ์กด ์ง€์‹ ์œ„์— ๋‚ด ์ „๋ฌธ ์ง€์‹์„ ์–น๋Š” ๊ฒƒ์€ fine-tuning์ด๋‹ค.

๋™์ž‘ 3๋‹จ๊ณ„

  1. Graph optimization: ์—ฐ์‚ฐ ๊ทธ๋ž˜ํ”„๋ฅผ ์ตœ์ ํ™”ํ•œ๋‹ค
  2. Hardware partitioning: ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€์†๊ธฐ๋ณ„ ์„œ๋ธŒ๊ทธ๋ž˜ํ”„๋กœ ๋ถ„ํ• ํ•œ๋‹ค
  3. Execution Provider: ํ•˜๋“œ์›จ์–ด๋ณ„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(CUDA/TensorRT/OpenVINO/CoreML/QNN/WebGPU/WASM)๋กœ ๊ฐ€์†ํ•œ๋‹ค

์–ธ์–ดยทํ”Œ๋žซํผ ๋ฐ”์ธ๋”ฉ

ONNX Runtime์€ Python ์ „์šฉ์ด ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ์–ธ์–ด ๋ฐ”์ธ๋”ฉ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ฐ™์€ ONNX ๋ชจ๋ธ ํ•˜๋‚˜๋ฅผ ์—ฌ๋Ÿฌ ๋Ÿฐํƒ€์ž„์—์„œ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Python (onnxruntime) โ€” ํ•™์Šตยทํ”„๋กœํ† ํƒ€์ดํ•‘์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ
  • Node.js (onnxruntime-node) โ€” ์„œ๋ฒ„์‚ฌ์ด๋“œ JavaScript์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ ์ถ”๋ก 
  • Browser (onnxruntime-web) โ€” WASMยทWebGPU๋กœ ๋ธŒ๋ผ์šฐ์ € ๋‚ด ์ถ”๋ก 
  • C/C++, C#(.NET), Java, Rust, Swift/Objective-C, React Native ๋“ฑ

์—”์ง„์€ ํ•˜๋‚˜, ๋ฐ”์ธ๋”ฉ๋งŒ ์—ฌ๋Ÿฟ

ONNX Runtime์€ ์–ธ์–ด๋งˆ๋‹ค ๋ณ„๊ฐœ์˜ ๊ตฌํ˜„์ด ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, C++๋กœ ์ž‘์„ฑ๋œ ๋‹จ์ผ ์ฝ”์–ด ์—”์ง„์ด ์‹ค์ œ ์ถ”๋ก ์„ ๋‹ด๋‹นํ•œ๋‹ค. onnxruntime(Python), onnxruntime-node(Node.js), onnxruntime-web(๋ธŒ๋ผ์šฐ์ €) ๋“ฑ์€ ๋ชจ๋‘ ์ด ๊ฐ™์€ ์ฝ”์–ด๋ฅผ ๊ฐ ์–ธ์–ด์—์„œ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ์–‡์€ ๋ฐ”์ธ๋”ฉ์ด๋‹ค. ์ž๋™์ฐจ ์—”์ง„์€ ๋™์ผํ•˜๊ณ  ์šด์ „๋Œ€๋งŒ ์–ธ์–ด๋ณ„๋กœ ๋‹ค๋ฅธ ์…ˆ์ด๋‹ค. ๋”ฐ๋ผ์„œ Python์œผ๋กœ ๋ถ€๋ฅด๋“  Node๋กœ ๋ถ€๋ฅด๋“  ๊ฐ™์€ ONNX ๋ชจ๋ธ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ถ”๋ก  ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค.

flowchart TD
    subgraph CORE["ONNX Runtime ์ฝ”์–ด (C++) โ€” ์‹ค์ œ ์ถ”๋ก  ์—”์ง„"]
        E["๋ชจ๋ธ ๋กœ๋“œ ยท ๊ทธ๋ž˜ํ”„ ์ตœ์ ํ™” ยท ์—ฐ์‚ฐ ์‹คํ–‰"]
    end
    P["Python ๋ฐ”์ธ๋”ฉ<br/>(onnxruntime)"] --> E
    N["Node.js ๋ฐ”์ธ๋”ฉ<br/>(onnxruntime-node)"] --> E
    W["Browser ๋ฐ”์ธ๋”ฉ<br/>(onnxruntime-web, WASM/WebGPU)"] --> E
    J["Java / C# / Rust ..."] --> E

์‹คํ–‰ ์—”์ง„๊ณผ ํ˜ธ์ถœ ๋ ˆ์ด์–ด์˜ ๊ด€๊ณ„

ONNX ๋ชจ๋ธ์„ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ C++๋กœ ์ž‘์„ฑยท์ปดํŒŒ์ผ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ์—”์ง„(.so/.dll/.dylib)์ด๊ณ , PythonยทNode ๋“ฑ์€ ๊ทธ ์—”์ง„์„ ํ˜ธ์ถœํ•˜๋Š” ์ƒ์œ„ ๋ ˆ์ด์–ด๋‹ค. ๋‹ค๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ C++ ์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๋”ฐ๋กœ ์ค€๋น„ํ•  ํ•„์š”๋Š” ์—†๋‹ค. pip install onnxruntime์ด๋‚˜ npm install onnxruntime-node๋ฅผ ํ•˜๋ฉด ๋ฏธ๋ฆฌ ๋นŒ๋“œ๋œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ํŒจํ‚ค์ง€์— ํ•จ๊ป˜ ์„ค์น˜๋˜์–ด, Python/Node ํ™˜๊ฒฝ๋งŒ์œผ๋กœ ๊ณง๋ฐ”๋กœ ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ธŒ๋ผ์šฐ์ €์ฒ˜๋Ÿผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์˜ฌ๋ฆด ์ˆ˜ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐ™์€ C++ ์ฝ”์–ด๋ฅผ WebAssembly๋กœ ์ปดํŒŒ์ผํ•œ onnxruntime-web์„ ์‚ฌ์šฉํ•œ๋‹ค.

flowchart TD
    A["โ‘  ํ˜ธ์ถœ ๋ ˆ์ด์–ด<br/>๋‚ด ์ฝ”๋“œ (Python / Node / Java ...)"] --> B
    B["โ‘ก ๋ฐ”์ธ๋”ฉ ๋ ˆ์ด์–ด<br/>onnxruntime ํŒจํ‚ค์ง€ (์–‡์€ ๋ž˜ํผ)"] --> C
    C["โ‘ข ์—”์ง„ ๋ ˆ์ด์–ด<br/>C++๋กœ ๋งŒ๋“  ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ<br/>(.so/.dll/.dylib) โ€” ์‹ค์ œ ์—ฐ์‚ฐ"]
    D[("model.onnx<br/>(๋ฐ์ดํ„ฐ/์ž…๋ ฅ)")] -.๋กœ๋“œ.-> C

Supertonic์—์„œ์˜ ์—ญํ• 

  • Supertonic์˜ ๋ชจ๋“  ๋ชจ๋“ˆ์ด ONNX๋กœ ๋ฐฐํฌ๋˜์–ด GPU ์—†์ด CPUยท๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋œ๋‹ค.
  • ์–‘์žํ™”(quantized) ๋ชจ๋ธ์„ ํ•จ๊ป˜ ์ œ๊ณตํ•ด ํฌ๊ธฐยท์†๋„๋ฅผ ์ถ”๊ฐ€ ์ตœ์ ํ™”ํ•œ๋‹ค.
  • from supertonic import TTS์˜ TTS ๊ฐ์ฒด๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ .onnx ๋ชจ๋“ˆ์„ ONNX Runtime์œผ๋กœ ๊ตฌ๋™ํ•˜๋ฏ€๋กœ, ์‚ฌ์šฉ์ž๋Š” ONNX ํŒŒ์ผ์„ ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š๋Š”๋‹ค.
  • PythonยทNode.jsยทBrowser(WebGPU) SDK๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ์ด ๋ฉ€ํ‹ฐ ๋ฐ”์ธ๋”ฉ ๋•๋ถ„์ด๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ