- 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 ํ์ผ์ ๋ก๋ํด ์์ธกยท์์ฑ์ ์ํํ๋ค๋ ์๋ฏธ๋ค.
| ๊ตฌ๋ถ | ONNX | ONNX 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์ผ๋ก ์ถ๋ก "]
- ์ค๊ณ: ์ ๊ฒฝ๋ง ๊ตฌ์กฐ(๋ ์ด์ด)๋ฅผ ์ฝ๋๋ก ์ ์ํ๋ค (PyTorch๋ฉด
nn.Module). - ํ์ต: ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ์์ธก โ ์ ๋ต๊ณผ์ ์ค์ฐจ(loss) ๊ณ์ฐ โ ์ญ์ ํ(backprop)๋ก ๊ฐ์ค์น๋ฅผ ์์ , ์ด๋ฅผ ์์์ด ๋ฐ๋ณตํ๋ค.
- ์ ์ฅ: ํ์ต๋ โ๊ตฌ์กฐ + ๊ฐ์ค์นโ๋ฅผ ํ๋ ์์ํฌ ๋ค์ดํฐ๋ธ ํฌ๋งท์ผ๋ก ์ ์ฅํ๋ค. PyTorch๋
.pt/.safetensors, TensorFlow๋ SavedModel/.h5๋ค. ์ด ๋จ๊ณ๊น์ง๋.onnx๊ฐ ์๋๋ค. - 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 ์ฝ๋(์: HuggingFacetransformers)๋ก ํ์ ํ๋ ๋ชจ๋ธ ๊ตฌ์กฐ(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๋จ๊ณ
- Graph optimization: ์ฐ์ฐ ๊ทธ๋ํ๋ฅผ ์ต์ ํํ๋ค
- Hardware partitioning: ๊ทธ๋ํ๋ฅผ ๊ฐ์๊ธฐ๋ณ ์๋ธ๊ทธ๋ํ๋ก ๋ถํ ํ๋ค
- 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๋ฅผ ๋ชจ๋ ์ ๊ณตํ ์ ์๋ ๊ฒ๋ ์ด ๋ฉํฐ ๋ฐ์ธ๋ฉ ๋๋ถ์ด๋ค.
์ฐธ๊ณ ๋ฌธ์
- ONNX Runtime Documentation
- ONNX ๊ณต์ ์ฌ์ดํธ
- ์์ ๊ฐ๋ : Supertonic 3