๐Ÿง  Accelerator

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 Architecture

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

์žฅ๋‹จ์ 

์žฅ์ 

  1. PyTorch ๋„ค์ดํ‹ฐ๋ธŒ: .onnx, .tflite ๊ฐ™์€ ์ค‘๊ฐ„ ํฌ๋งท ๋ณ€ํ™˜ ๋ถˆํ•„์š”, ๋ชจ๋ธ ์˜๋ฏธ ๋ณด์กด
  2. ํ”„๋กœ๋•์…˜ ๊ฒ€์ฆ: Meta์—์„œ ์ˆ˜์‹ญ์–ต ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฒ€์ฆ๋จ
  3. ์ดˆ๊ฒฝ๋Ÿ‰ ๋Ÿฐํƒ€์ž„: 50KB ๋ฒ ์ด์Šค ํฌ๊ธฐ๋กœ ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ๊นŒ์ง€ ์ง€์›
  4. ํ•˜๋“œ์›จ์–ด ์œ ์—ฐ์„ฑ: 12๊ฐœ ์ด์ƒ ๋ฐฑ์—”๋“œ ์ง€์›, ํ•œ ์ค„ ๋ณ€๊ฒฝ์œผ๋กœ ํ•˜๋“œ์›จ์–ด ์ „ํ™˜
  5. LLM ํŠนํ™”: Llama, Qwen ๋“ฑ ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ ์ตœ์ ํ™” ์ง€์›
  6. ์–‘์žํ™” ํ†ตํ•ฉ: torchao๋ฅผ ํ†ตํ•œ 8๋น„ํŠธ, 4๋น„ํŠธ, ๋™์  ์–‘์žํ™” ์ง€์›

๋‹จ์ 

  1. CUDA ๋ฐฑ์—”๋“œ ์‹คํ—˜์ : NVIDIA GPU ์ง€์›์ด ์•„์ง ์‹คํ—˜ ๋‹จ๊ณ„
  2. ํ•™์Šต ๋ฏธ์ง€์›: ์ถ”๋ก  ์ „์šฉ, ํ•™์Šต์€ PyTorch์—์„œ ๋ณ„๋„ ์ฒ˜๋ฆฌ ํ•„์š”
  3. ์ƒˆ๋กœ์šด ์ƒํƒœ๊ณ„: TensorFlow Lite, ONNX Runtime์— ๋น„ํ•ด ์ปค๋ฎค๋‹ˆํ‹ฐ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ž‘์Œ
  4. ํ•˜๋“œ์›จ์–ด๋ณ„ ์ตœ์ ํ™” ํ•„์š”: ๊ฐ ๋ฐฑ์—”๋“œ๋งˆ๋‹ค ๋ณ„๋„์˜ ํŒŒํ‹ฐ์…”๋„ˆ/์ตœ์ ํ™” ์„ค์ • ํ•„์š”

๊ด€๋ จ ๊ธฐ์ˆ 

๊ธฐ์ˆ  ๊ด€๊ณ„ ์„ค๋ช…
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 ๋ฐฑ์—”๋“œ ์ž„๋ฒ ๋””๋“œ ์˜ค๋””์˜ค/์‹ ํ˜ธ ์ฒ˜๋ฆฌ ๊ฐ€์†

์ฐธ๊ณ  ๋ฌธํ—Œ

ํ•ต์‹ฌ ์ •๋ฆฌ

  1. ExecuTorch๋Š” PyTorch์˜ ์˜จ๋””๋ฐ”์ด์Šค AI ์ถ”๋ก  ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, Export-Compile-Execute 3๋‹จ๊ณ„ AOT ์ปดํŒŒ์ผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
  2. 12๊ฐœ ์ด์ƒ์˜ ํ•˜๋“œ์›จ์–ด ๋ฐฑ์—”๋“œ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ํŒŒํ‹ฐ์…”๋„ˆ๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€์†๊ธฐ์™€ CPU ํด๋ฐฑ์œผ๋กœ ๋ถ„ํ• ํ•œ๋‹ค.
  3. ~50KB์˜ ์ดˆ๊ฒฝ๋Ÿ‰ ๋Ÿฐํƒ€์ž„์œผ๋กœ ๋งˆ์ดํฌ๋กœ์ปจํŠธ๋กค๋Ÿฌ๋ถ€ํ„ฐ ์Šค๋งˆํŠธํฐ๊นŒ์ง€ ํญ๋„“์€ ๋””๋ฐ”์ด์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค.
  4. Meta์˜ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ˆ˜์‹ญ์–ต ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฒ€์ฆ๋œ ์•ˆ์ •์ ์ธ ๊ธฐ์ˆ ์ด๋‹ค.
  5. ํ•œ ์ค„ ๋ณ€๊ฒฝ์œผ๋กœ ํ•˜๋“œ์›จ์–ด ํƒ€๊ฒŸ์„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ๋ฐฑ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  6. LLM, CV, ASR, TTS ๋“ฑ ๋‹ค์–‘ํ•œ ๋ชจ๋ธ ํƒ€์ž…์„ ์ง€์›ํ•˜๋ฉฐ, ์ด์‹์„ฑ/์„ฑ๋Šฅ/์ƒ์‚ฐ์„ฑ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ๊ฐ€์น˜๋ฅผ ์ถ”๊ตฌํ•œ๋‹ค.