ExecuTorch Backend ์์ธ
๊ฐ์
ExecuTorch๋ PyTorch๊ฐ ๊ฐ๋ฐํ ์จ๋๋ฐ์ด์ค AI ์ถ๋ก ํ๋ ์์ํฌ๋ก, ์ค๋งํธํฐ๋ถํฐ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ๊น์ง ๋ค์ํ ์ฃ์ง ๋๋ฐ์ด์ค์์ AI ๋ชจ๋ธ์ ํจ์จ์ ์ผ๋ก ์คํํ๊ธฐ ์ํ ํตํฉ ์๋ฃจ์ ์ด๋ค. Meta์ Instagram, WhatsApp, Quest 3, Ray-Ban Meta ์ค๋งํธ๊ธ๋์ค ๋ฑ ์์ญ์ต ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํ ํ๋ก๋์ ํ๊ฒฝ์์ ๊ฒ์ฆ๋ ๊ธฐ์ ์ด๋ค.
ExecuTorch๋ ์ธ ๊ฐ์ง ํต์ฌ ๊ฐ์น๋ฅผ ์ ๊ณตํ๋ค. ์ด์์ฑ(Portability): ๊ณ ์ฌ์ ๋ชจ๋ฐ์ผ๋ถํฐ ์ ์ฝ๋ ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ๊น์ง ๋ค์ํ ํ๋ซํผ์์ ์คํ ๊ฐ๋ฅํ๋ค. ์ฑ๋ฅ(Performance): ๊ฒฝ๋ ๋ฐํ์์ผ๋ก CPU, GPU, NPU, DSP ์ ์ฒด ํ๋์จ์ด ๊ฐ์์ ์ง์ํ๋ค. ์์ฐ์ฑ(Productivity): ๋ชจ๋ธ ์์ฑ๋ถํฐ ๋ฐฐํฌ๊น์ง PyTorch ๋๊ตฌ ์ฒด์ธ์ ๊ทธ๋๋ก ํ์ฉํ ์ ์๋ค.
ExecuTorch์ ํต์ฌ์ ๋ฐฑ์๋(Backend) ์์คํ
์ด๋ค. ๋ฐฑ์๋๋ ๋ด๋ณด๋ด๊ธฐ๋ ๋ชจ๋ธ๊ณผ ์ค์ ํ๋์จ์ด ์ฌ์ด์ ๋ค๋ฆฌ ์ญํ ์ ํ๋ฉฐ, ๊ฐ ํ๋์จ์ด ํ๋ซํผ์ ๋ง๋ ๊ฐ์ํ๋ฅผ ์ ๊ณตํ๋ค. PyTorch ๋ชจ๋ธ์ torch.export()๋ก ๋ด๋ณด๋ด๋ฉด .pte ํ์ผ๋ก ๋ณํ๋๋ฉฐ, ์ด ๊ณผ์ ์์ ํํฐ์
๋(Partitioner)๊ฐ ๋ชจ๋ธ ๊ทธ๋ํ๋ฅผ ์ง์๋๋ ์๋ธ๊ทธ๋ํ์ CPU ํด๋ฐฑ์ผ๋ก ๋ถํ ํ๋ค. ์ง์๋์ง ์๋ ์ฐ์ฐ์ XNNPACK ๊ฐ์ ํฌํฐ๋ธ CPU ๋ฐฑ์๋์์ ์คํ๋์ด ๋ถ๋ถ์ ๊ฐ์ํ๊ฐ ๊ฐ๋ฅํ๋ค.
ํต์ฌ ๊ฐ๋
ExecuTorch ์ํคํ ์ฒ
ExecuTorch๋ AOT(Ahead-of-Time) ์ปดํ์ผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ PyTorch ๋ชจ๋ธ์ ์ฃ์ง ๋ฐฐํฌ๋ฅผ ์ํด ์ค๋นํ๋ค:
| ๋จ๊ณ | ๊ณผ์ | ์ค๋ช |
|---|---|---|
| 1. Export | torch.export.export() |
PyTorch ๋ชจ๋ธ ๊ทธ๋ํ ์บก์ฒ |
| 2. Compile | to_edge_transform_and_lower() |
์์ํ, ์ต์ ํ, ํ๋์จ์ด ๋ฐฑ์๋๋ก ํํฐ์
๋ โ .pte |
| 3. Execute | C++ ๋ฐํ์ | ๊ฒฝ๋ ๋ฐํ์์ผ๋ก .pte ๋ก๋ ๋ฐ ์คํ |
์ง์ ๋ชจ๋ธ ํ์
ExecuTorch๋ ๋ค์ํ AI ๋ชจ๋ธ ํ์ ์ ์ง์ํ๋ค:
| ๋ชจ๋ธ ํ์ | ์ค๋ช | ์์ |
|---|---|---|
| ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ (LLM) | ํ ์คํธ ์์ฑ, ์ง์์๋ต, ์์ฝ | Llama, Qwen, Phi |
| ์ปดํจํฐ ๋น์ (CV) | ์ด๋ฏธ์ง ๋ถ๋ฅ, ๊ฐ์ฒด ํ์ง, ์ธ๊ทธ๋ฉํ ์ด์ | ResNet, MobileNet, YOLO |
| ์์ฑ ์ธ์ (ASR) | ์์ฑโํ ์คํธ ๋ณํ | Whisper, wav2vec2 |
| ์์ฑ ํฉ์ฑ (TTS) | ํ ์คํธโ์์ฑ ๋ณํ | VITS, Tacotron |
๋ฐฑ์๋ ์ ํ๊ณผ ํ๋ซํผ ์ง์
ExecuTorch๋ 12๊ฐ ์ด์์ ํ๋์จ์ด ๋ฐฑ์๋๋ฅผ ์ง์ํ๋ค:
| ๋ฐฑ์๋ | ํ๋ซํผ | ํ๋์จ์ด ์ ํ | ํน์ง |
|---|---|---|---|
| XNNPACK | ์ ์ฒด ํ๋ซํผ | CPU | ๋ฒ์ฉ, CPU ํด๋ฐฑ |
| Core ML | iOS, macOS | NPU/GPU/CPU | Apple ๋๋ฐ์ด์ค, ๊ณ ์ฑ๋ฅ |
| Vulkan | Android, Linux, Windows | GPU | Android(์ฑ์), ๋ฐ์คํฌํฑ(์คํ์ ) |
| Qualcomm QNN | Android | NPU | Qualcomm SoC |
| MediaTek | Android | NPU | MediaTek SoC |
| Samsung Exynos | Android | CPU/GPU/NPU | Samsung ๋๋ฐ์ด์ค |
| CUDA | Linux/Windows | GPU | NVIDIA GPU ๊ฐ์ (์คํ์ ) |
| MPS | iOS, macOS | GPU | Apple GPU (deprecated) |
| OpenVINO | ์๋ฒ ๋๋ | CPU/GPU/NPU | Intel SoC |
| Arm Ethos-U | ์๋ฒ ๋๋ | NPU | Arm MCU |
| Arm Cortex-M | ์๋ฒ ๋๋ | CPU | Arm Cortex-M MCU |
| NXP | ์๋ฒ ๋๋ | NPU | NXP SoC |
๋๋ฆฌ๊ฒ์ดํธ์ ํํฐ์ ๋
ExecuTorch์ ํต์ฌ ๋ฉ์ปค๋์ฆ์ ๋๋ฆฌ๊ฒ์ดํธ(Delegate) ์์คํ ์ด๋ค:
- ๋๋ฆฌ๊ฒ์ดํธ: ๋ชจ๋ธ์ ์ผ๋ถ ์๋ธ๊ทธ๋ํ๋ฅผ ํน์ ํ๋์จ์ด ๋ฐฑ์๋์ ์์ํ๋ ๋จ์
- ํํฐ์ ๋(Partitioner): ๋ชจ๋ธ ๊ทธ๋ํ๋ฅผ ๋ถ์ํ์ฌ ์ด๋ค ์๋ธ๊ทธ๋ํ๊ฐ ์ด๋ค ๋ฐฑ์๋์์ ์คํ๋ ์ง ๊ฒฐ์
- CPU ํด๋ฐฑ: ๋ฐฑ์๋๊ฐ ์ง์ํ์ง ์๋ ์ฐ์ฐ์ XNNPACK CPU ๋ฐฑ์๋์์ ์๋ ์คํ
PyTorch ๋ชจ๋ธ โ Export โ ํํฐ์
๋ ๋ถ์
โ
โโโโโโโโโโโโโโโโโ
โ GPU ์๋ธ๊ทธ๋ํ โ โ ๋ฐฑ์๋ ๋๋ฆฌ๊ฒ์ดํธ
โ CPU ์๋ธ๊ทธ๋ํ โ โ XNNPACK ํด๋ฐฑ
โโโโโโโโโโโโโโโโโ
โ
.pte ํ์ผ
๋์ ์๋ฆฌ
1๋จ๊ณ: ๋ชจ๋ธ ๋ด๋ณด๋ด๊ธฐ (Export)
import torch
from executorch.exir import to_edge_transform_and_lower
from executorch.backends.xnnpack.partition.xnnpack_partitioner import XnnpackPartitioner
# ๋ชจ๋ธ ์ ์
model = MyModel().eval()
example_inputs = (torch.randn(1, 3, 224, 224),)
# Export
exported_program = torch.export.export(model, example_inputs)
2๋จ๊ณ: ์ฃ์ง ๋ณํ ๋ฐ ํ๋์จ์ด ํ ๋น
# ๋ฐฑ์๋ ์ ํ (ํ ์ค ๋ณ๊ฒฝ์ผ๋ก ํ๋์จ์ด ์ ํ ๊ฐ๋ฅ)
program = to_edge_transform_and_lower(
exported_program,
partitioner=[XnnpackPartitioner()] # CPU
# partitioner=[CoreMLPartitioner()] # iOS
# partitioner=[QnnPartitioner()] # Qualcomm
).to_executorch()
3๋จ๊ณ: ๋๋ฐ์ด์ค์์ ์คํ
C++ ๋ฐํ์:
#include <executorch/extension/module/module.h>
#include <executorch/extension/tensor/tensor.h>
Module module("model.pte");
auto tensor = make_tensor_ptr({2, 2}, {1.0f, 2.0f, 3.0f, 4.0f});
auto outputs = module.forward(tensor);
Swift (iOS):
import ExecuTorch
let module = Module(filePath: "model.pte")
let input = Tensor<Float>([1.0, 2.0, 3.0, 4.0], shape: [2, 2])
let outputs = try module.forward(input)
Kotlin (Android):
val module = Module.load("model.pte")
val inputTensor = Tensor.fromBlob(floatArrayOf(1.0f, 2.0f, 3.0f, 4.0f), longArrayOf(2, 2))
val outputs = module.forward(EValue.from(inputTensor))
LLM ์ถ๋ก ์์
Llama ๋ชจ๋ธ ๊ฐ์ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ๋ ์ง์ํ๋ค:
# ๋ชจ๋ธ ๋ด๋ณด๋ด๊ธฐ
python -m executorch.extension.llm.export.export_llm --model llama3_2 --output llama.pte
# C++์์ ์คํ
#include <executorch/extension/llm/runner/text_llm_runner.h>
auto runner = create_llama_runner("llama.pte", "tiktoken.bin");
executorch::extension::llm::GenerationConfig config{
.seq_len = 128, .temperature = 0.8f};
runner->generate("Hello, how are you?", config);
๋น๊ต/๋ถ์
๊ธฐ์กด ์ฃ์ง ์ถ๋ก ํ๋ ์์ํฌ์ ๋น๊ต
| ํน์ฑ | ExecuTorch | TensorFlow Lite | ONNX Runtime | Core ML |
|---|---|---|---|---|
| ํ๋ ์์ํฌ | PyTorch ๋ค์ดํฐ๋ธ | TensorFlow | ๋ฒ์ฉ | Apple ์ ์ฉ |
| ๋ชจ๋ธ ํฌ๋งท | .pte |
.tflite |
.onnx |
.mlmodel |
| ๋ฐฑ์๋ ์ | 12+ | 5~6 | 10+ | Apple ํ๋์จ์ด๋ง |
| ๋ฐํ์ ํฌ๊ธฐ | ~50KB | ~1MB | ~2MB | ์์คํ ํตํฉ |
| LLM ์ง์ | ์ต์ ํ๋จ | ์ ํ์ | ์ ํ์ | ์ ํ์ |
| ์์ํ | torchao ํตํฉ | ๊ธฐ๋ณธ ์ง์ | ๊ธฐ๋ณธ ์ง์ | ์๋ |
| ๋์ Shape | ์ง์ | ์ ํ์ | ์ง์ | ์ ํ์ |
๋ฐํ์ ๋น๊ต
| ๋ฐํ์ ํน์ฑ | ExecuTorch | TensorFlow Lite | ONNX Runtime |
|---|---|---|---|
| ๋ฒ ์ด์ค ํฌ๊ธฐ | ~50KB | ~1MB | ~2MB |
| ์์กด์ฑ | ์ต์ | Android/iOS ์์กด | ์ต์ |
| ์ปค์คํ ์ปค๋ | ์ง์ | ์ง์ | ์ง์ |
| ํ๋กํ์ผ๋ง | ETDump | Built-in | Built-in |
์ฅ๋จ์
์ฅ์
- PyTorch ๋ค์ดํฐ๋ธ: .onnx, .tflite ๊ฐ์ ์ค๊ฐ ํฌ๋งท ๋ณํ ๋ถํ์, ๋ชจ๋ธ ์๋ฏธ ๋ณด์กด
- ํ๋ก๋์ ๊ฒ์ฆ: Meta์์ ์์ญ์ต ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ๊ฒ์ฆ๋จ
- ์ด๊ฒฝ๋ ๋ฐํ์: 50KB ๋ฒ ์ด์ค ํฌ๊ธฐ๋ก ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ๊น์ง ์ง์
- ํ๋์จ์ด ์ ์ฐ์ฑ: 12๊ฐ ์ด์ ๋ฐฑ์๋ ์ง์, ํ ์ค ๋ณ๊ฒฝ์ผ๋ก ํ๋์จ์ด ์ ํ
- LLM ํนํ: Llama, Qwen ๋ฑ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ ์ต์ ํ ์ง์
- ์์ํ ํตํฉ: torchao๋ฅผ ํตํ 8๋นํธ, 4๋นํธ, ๋์ ์์ํ ์ง์
๋จ์
- CUDA ๋ฐฑ์๋ ์คํ์ : NVIDIA GPU ์ง์์ด ์์ง ์คํ ๋จ๊ณ
- ํ์ต ๋ฏธ์ง์: ์ถ๋ก ์ ์ฉ, ํ์ต์ PyTorch์์ ๋ณ๋ ์ฒ๋ฆฌ ํ์
- ์๋ก์ด ์ํ๊ณ: TensorFlow Lite, ONNX Runtime์ ๋นํด ์ปค๋ฎค๋ํฐ/๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์
- ํ๋์จ์ด๋ณ ์ต์ ํ ํ์: ๊ฐ ๋ฐฑ์๋๋ง๋ค ๋ณ๋์ ํํฐ์ ๋/์ต์ ํ ์ค์ ํ์
๊ด๋ จ ๊ธฐ์
| ๊ธฐ์ | ๊ด๊ณ | ์ค๋ช |
|---|---|---|
| PyTorch | ์์ ํ๋ ์์ํฌ | ๋ชจ๋ธ ์ ์, ํ์ต, Export ์์ค |
| torchao | ์์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ExecuTorch์ ์์ํ ํ์ดํ๋ผ์ธ |
| XNNPACK | ๊ธฐ๋ณธ CPU ๋ฐฑ์๋ | ๋ชจ๋ ํ๋ซํผ์์ CPU ํด๋ฐฑ์ผ๋ก ์ฌ์ฉ |
| CoreML | Apple ๋ฐฑ์๋ | iOS/macOS Neural Engine ๊ฐ์ |
| Vulkan | GPU ๋ฐฑ์๋ | Android/๋ฐ์คํฌํฑ GPU ๊ฐ์ |
| Qualcomm QNN | NPU ๋ฐฑ์๋ | Snapdragon SoC ๊ฐ์ |
| Cadence DSP | DSP ๋ฐฑ์๋ | ์๋ฒ ๋๋ ์ค๋์ค/์ ํธ ์ฒ๋ฆฌ ๊ฐ์ |
์ฐธ๊ณ ๋ฌธํ
- ExecuTorch ๊ณต์ ๋ฌธ์
- PyTorch GitHub - ExecuTorch
- ExecuTorch: A Unified PyTorch Solution to Run AI Models On-Device (arXiv:2605.08195)
- Meta Engineering Blog - ExecuTorch
ํต์ฌ ์ ๋ฆฌ
- ExecuTorch๋ PyTorch์ ์จ๋๋ฐ์ด์ค AI ์ถ๋ก ํ๋ ์์ํฌ๋ก, Export-Compile-Execute 3๋จ๊ณ AOT ์ปดํ์ผ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
- 12๊ฐ ์ด์์ ํ๋์จ์ด ๋ฐฑ์๋๋ฅผ ์ง์ํ๋ฉฐ, ํํฐ์ ๋๋ฅผ ํตํด ๋ชจ๋ธ ๊ทธ๋ํ๋ฅผ ๊ฐ์๊ธฐ์ CPU ํด๋ฐฑ์ผ๋ก ๋ถํ ํ๋ค.
- ~50KB์ ์ด๊ฒฝ๋ ๋ฐํ์์ผ๋ก ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ๋ถํฐ ์ค๋งํธํฐ๊น์ง ํญ๋์ ๋๋ฐ์ด์ค๋ฅผ ์ง์ํ๋ค.
- Meta์ ํ๋ก๋์ ํ๊ฒฝ์์ ์์ญ์ต ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ๊ฒ์ฆ๋ ์์ ์ ์ธ ๊ธฐ์ ์ด๋ค.
- ํ ์ค ๋ณ๊ฒฝ์ผ๋ก ํ๋์จ์ด ํ๊ฒ์ ์ ํํ ์ ์๋ ์ ์ฐํ ๋ฐฑ์๋ ์ํคํ ์ฒ๋ฅผ ์ ๊ณตํ๋ค.
- LLM, CV, ASR, TTS ๋ฑ ๋ค์ํ ๋ชจ๋ธ ํ์ ์ ์ง์ํ๋ฉฐ, ์ด์์ฑ/์ฑ๋ฅ/์์ฐ์ฑ ์ธ ๊ฐ์ง ํต์ฌ ๊ฐ์น๋ฅผ ์ถ๊ตฌํ๋ค.