How to build & run on-device model

온디바이스 모델에 대한 이해와 어떻게 모델을 온디바이스화 할 수 있을지
김호진's avatar
May 25, 2026
How to build & run on-device model
온디바이스 모델이라고 할 때 그 범주에 들어갈 수 있는 것이 많다.
  • vision/speech understanding, language/speech/action generation, etc
 
  • 어떤 조건을 온디바이스라고 부를까
    • 서버/클라우드가 아닌 로컬 기기에서 실행되면 전부 온디바이스 모델이라고 부른다.
      꼭 cpu로 실행되는 것만을 지칭하는건 아니다.
      맥북에도 이미 어느정도 좋은 GPU/NPU 등이 내장되어 있다.
 
  • 일반적으로 on-device가 되기 위해서 필요한 것
      1. 로컬 메모리에 올라갈 수 있는 정도의 모델 크기
      1. 낮은 병렬 처리 효율성 환경에서도 충분히 기다릴만한 inference 속도
 

메모리에 올릴 수 있는 모델 크기에 대한 이해.

상황을 가정하고 전개해본다. 내 맥북의 memory가 16GB일 때, 어느 정도 사이즈의 모델을 올릴 수 있을까? → 메모리를 점유하는 값들이 무엇인지에 대한 이해가 있어야한다.
llm 3B model size를 가정
whisper
  1. model weight
    1. fp16 → 2 bytes * 30억 = 6GB
      정밀도
      파라미터 1개당 크기
      3B 모델 가중치 크기
      FP32
      4 bytes
      약 12GB
      FP16 / BF16
      2 bytes
      약 6GB
      INT8
      1 byte
      약 3GB
      INT4
      0.5 byte
      약 1.5GB
      FP16과 INT4는 당연히 4배 차이가 난다.
      하지만 실제로는 quantization을 위해서 추가로 저장해야하는 정보가 있기 때문에 실제로는 1.7 ~ 2.0GB 정도 차지. (아래에서)
       
      Transformer block 한개 기준
      아주 단순하게
      Norm + Attention + Norm + MLP/FFN
      라고 생각하면, 일반적으로 MLP의 hidden_dim은 4배 크기 때문에
      • Norm : dim * 2 : 1% 이하
      • Attention : 4 * dim^2 : 약 33% -> Grouped query attention을 사용하면 더 작아짐
      • MLP : 8 * dim^2 : 약 66%
       
  1. activation
    1. 모델이 계산 중간에 만들어내는 임시 tensor : 대표적인 예시 = attention score
      attention score는 단순 구현시 [seq_len, seq_len] 이기 때문에 크기가 꽤 커질 수 있다. 하지만 실제로는 flash attention 같은 프레임워크들이 잘 처리해주기 때문에 그렇게 커지지 않는다.
llm은 여기에 더해서
  1. KV cache
    1. 저번 주에 얘기 하려던거
      LLM에서 주로 사용하는 KV Cache : sequence 길이에 따라 달라진다.
      연산 속도를 크게 높여주는 대신 메모리를 차지한다.
      num_layers * sequence_length * kv_heads * head_dim * 2(K,V) * bytes
       
      3B LLM 가정
      num_layers = 28 hidden_size = 3072 num_attention_heads = 24 num_kv_heads = 8 head_dim = 128 KV cache dtype = FP16, 2 bytes
      여기서 num_kv_heads는 attention에서 MHA, GQA, MQA에 따라 달라진다. KV Cache를 줄이기 위해서 MQA가 나왔다가 성능을 위해 GQA로 타협
       
      → 이제 토큰 길이가 4096이라고 하면,
      28 × 4096 × 8 × 128 × 2 × 2 = 469,762,048 bytes ≈ 448 MiB ≈ 0.45GB
      전체 토큰 수
      KV cache
      1K tokens
      약 0.11GB
      2K tokens
      약 0.22GB
      4K tokens
      약 0.45GB
      8K tokens
      약 0.90GB
      16K tokens
      약 1.8GB
      32K tokens
      약 3.6GB
      단순 곱이기 때문에 선형적으로 증가해서 토큰이 2배 길어지면 메모리도 2배 더 차지함.
 
  1. 기타
      • tokenizer, attention mask, input ids 등등
      • token embedding
        • vocab_size * dim * fp16 128,000 * 3072 * 2 bytes = 786MB
          마지막에 embedding → token을 처리하는 LM head는 공유하는 경우에는 추가되지 않음
      • 일반적으로 앱들이 컴퓨터에서 차지하는 메모리
        • macOS + 기본 앱 + Chrome + VSCode 등등..
          Mac Apple Chip = 16GB = CPU + NPU + GPU
          Activity Monitor 사용하면 볼 수 있다. →
          notion image
          이미 Swap이 일어난 상태이지만 남은게 거의 2GB 밖에 없음;
          모델을 올리기 위해서는 다른 프로그램들을 Swap해야하니 다른 동작들이 느려진다.
          보통 5 ~ 8GB 정도 된다고 한다.
Inference를 위해 사용되는 것들
  1. Runtime / framework overhead
    1. 같은 모델이라도 어떤걸 사용해서 돌리느냐에 따라 사용되는 메모리가 다르다.
      PyTorch, Tensorflow, Jax는 학습을 위한 프레임워크로 inference를 위해서는 주로 다른 것들이 사용된다.
      llama.cpp Ollama MLX PyTorch ONNX Runtime Core ML Transformers TensorFlow.js WebGPU runtime
 
 
고정 값과 고정 값이 아닌 것들
메모리 항목
고정/변동
무엇에 비례하나
Weights
거의 고정
파라미터 수 × 정밀도
Quantization metadata
거의 고정
파라미터 수, group size
Tokenizer
거의 고정
vocab 크기
KV cache
변동
layers × tokens × kv_heads × head_dim
Activation
변동
batch × sequence length × hidden size
Attention temp buffer
변동
attention 구현, sequence length
Logits buffer
변동
batch × vocab size, 또는 batch × seq × vocab
Runtime overhead
반고정
framework, backend, allocator
OS/app memory
외부 요인
실행 중인 앱 수
 
 

일반적으로 on-device 모델을 위해서 하는 것들

모델의 크기를 줄이고(GB), inference 속도를 높여야한다.
 

경량화 = model size 줄이기

하나의 단일 솔루션이 존재하지는 않는다.
일반적으로는 가중치 자체를 줄인 뒤 1) Knowledge Distillation로 Student model을 학습하고 2) Quantization을 통해서 가볍게 만든 뒤 3) Pruning을 적용한다.
 
  1. Pruning
    1. notion image
       
      중요하지 않은 가중치를 drop하는걸 의미한다. 단순히 neuron 단위로 drop할 수도 있는데, 이렇게되면 모델의 가중치 수가 줄어들어 가벼워지기는 하지만 latency는 줄어들지 않을 수도 있다.
      왜냐하면 kernel들이 어짜피 병렬 처리에 최적화되어있어 부분적으로 연산이 비더라도 한 단위에 영향이 없을 수 있기 때문에.
      이론적으로 sparsity는 높아지지만, 실제 속도 이득은 sparse 상태를 지원하는 kernel이 있어야함.
      Structured pruning은 channel, attention head, layer 같은 덩어리를 제거한다.
      이건 실제 행렬 크기 자체가 줄어들기 때문에 온디바이스에서는 더 실용적일 때가 많다.
       
      SlimQwen, Nvidia minitron에서는 depth(d_model), width(layer num), expert 단위로 pruning을 적용하는 실험을 했다.
      notion image
      width를 줄이는게 제일 좋았다고 하는데, 큰 의미는 모르겠다.
       
  1. Knowledge Distillation
    1. 잘 학습되었지만 큰 크기의 모델(Teacher)이 있을 때 이걸 활용해서 모델(Student)을 더 효율적으로 학습하는 방법.
      우선 모델의 크기를 줄인다음, 줄어든 크기의 모델도 좋은 성능을 낼 수 있게 학습하는 방법이다.
       
      LLM의 경우에는 기존 LM Loss(정답 token과의 cross entropy) 대신 teacher model의 output logits 분포 자체를 따라가도록 학습한다.
      이렇게되면 한번의 학습 안에 정보량이 더 많다.
       
      Diffusion에서는 모델의 크기보다도 더 적은 step으로 inference하기위해 teacher model을 사용해서 distillation한다.
       
      한번의 학습마다 teacher/student 모델 둘다 inference해야하기 때문에 학습 자체는 더 오래 걸릴 수 있다.
       
SlimQwen은 원래 80B MoE 모델을 23B MoE 모델로 만든 다음 KD를 통해 학습한다.
파란색은 단순히 small architecture를 설계하고 가중치를 랜덤 초기화했고,
초록색은 기존 teacher model에서 pruning을 통해 크기를 줄인 경우.
notion image
  • 실제로는 LM Loss + KD Loss까지 하는게 더 좋았고, Multi-token prediction으로도 KD를 해서 speculative decoding 성능도 최적화했다.
 
  • 또 어짜피 4배를 줄여서 400B token을 학습한다고 할 때, 2배로 줄이고 40B로 학습하고 다시 2배 줄여서 360B를 학습하는 식으로 progressive pruning을 하는게 성능이 더 좋았다고 한다.
    • notion image
 
 

Model quantization

🔥
Model 실행을 위해서 FP32/FP16으로 저장·계산하던 값을 INT8, INT4, FP8 같은 더 싼 표현으로 바꾸는 것
여기서 여러 선택지가 생깁니다.
  1. weight만 줄일 것인가, activation(= 처리되는 데이터)도 줄일 것인가
  1. scale/zero point를 미리 정할 것인가, 실행 중에 계산할 것인가
  1. 학습 없이 바꿀 것인가, 다시 학습하면서 적응시킬 것인가
  1. CPU, GPU, NPU, Apple Neural Engine 중 어디에서 돌릴 것인가
 
컴퓨터에서 숫자 값을 저장하는 방법, float 기준
notion image
쉽게말해 Exponent는 범위를 결정하고, Mantissa는 정확도를 결정함.
 
기본 개념
  • int 양자화는 대충 이런 변환입니다.
    • float 값 ≈ scale × (int 값 - zero_point)
      예를 들어 원래 activation 값이 -3.2 ~ 5.7 범위에 있다면, 이 범위를 INT8의 -128 ~ 127 또는 UINT8의 0 ~ 255 공간에 대응시킵니다.
      즉 zero_point로 위치를 만들고 scale로 size를 만든다. 이 때 일반적으로 weight에서는 channel 단위로 서로 다른 scale, zero_point를 가짐.
       
       
      하지만 여기서 문제는 어떻게 이 float 값의 범위를 미리 알고 결정하지?(특히 activation)
      dynamic quantizationstatic quantization이 갈립니다.
    • dynamic quantization : 사전에는 weight만 양자화 한 다음, inference 단계에서 input tensor를 보고 그 값 범위로 양자화 한다.
    • static quantization : 사전에 dataset 일부를 이용해 tensor 범위를 계산한 뒤 scale, zero_point를 고정해둔다.
 
  • 양자화 방법도 학습 후 양자화를 적용(PTQ)시키는 방법이 있고 학습 단계에서 미리 양자화를 고려해서 학습(QAT)하는 방법이 있다. - DeepSeek V4에서는 QAT
 
  • Weight를 양자화할지 Activation을 양자화할지에 따라 보통 W8A8, W4A16과 같이 표기한다.
    • 어짜피 하는거 둘다 하지않을 이유는?
      1. 학습 후 weight는 고정되기 때문에 양자화가 더 쉽다. 하지만 activation은 계속 바뀌니 양자화가 더 어렵다.
        1. → outlier 때문에 LLM에서 양자화가 더 어렵다.
          작은 값들: -1.2, 0.3, 1.5 큰 outlier: 31.0
          큰 outlier까지 살리려고 scale을 크게 잡으면, 대부분의 작은 값들은 INT8에서 너무 거칠게 표현된다
      1. activation이 해상도가 높은게 정확도 유지가 더 잘된다. 어쨌든 다음 레이어로, output으로 전달되는 값 자체에 손실이 더 적다는거니까
      1. 목적이 약간 다르다.
        1. weight를 양자화하는건 주로 모델 크기를 줄이고 메모리 점유를 줄이기 위함이고, activation을 양자화하는건 메모리 이득은 크지 않지만 연산 속도를 높이기 위함이다.
          그러니 모델을 줄이는게 중요한 경우에는 weight를 양자화하고 정확도를 유지하기 위해 activation은 그대로 둔다.
           
          그래서 모델을 올리는게 문제인 LLM에서는 로컬 LLM을 위해 GGUF, GPTQ, AWQ 같은 quantized model들이 보통 W4A16, W4A16 비슷한 형태를 많이 쓴다.
           
      1. 대신 W8A8과 같이 둘다 int8로 만들게 되면, 진짜 INT8 연산만 하면되니 최적화된 matmul method를 쓸 수 있기 때문에 연산속도 이득이 크다.
 
그럼 보통 quantization을 해야할까 말아야할까?
💡
weight 8-bit까지는 baseline과의 비교만으로 무리없이 시도해봐도 좋고
weight 4-bit이나 activation 8-bit의 경우에는 여러 실험이 필요하다.
 
DiT-quantization, ImageNet 256, steps=100 기준:
설정
FID
IS
FP 16/16
12.40
116.68
Q-DiT W6A8
12.21
117.75
Q-DiT W4A8
15.76
98.78
 
당연하지만 모델 아키텍처와 task에 따라 다르다.
하지만 아주 대략적으로 본다고하면
Quantization
성능 하락
Weight memory
속도
BF16/FP16
기준
100%
기준
FP8 / INT8
거의 0 ~ 1%p
약 50%
1.1 ~ 1.8배 가능
INT4 weight-only
대략 0 ~ 3%p, 작은 모델은 3 ~ 5%p도 가능
약 25 ~ 35%
1.2 ~ 2배 가능
W4A8
대략 1 ~ 4%p
약 25 ~ 35%
잘 맞으면 더 빠름
W4A4 / W4A4KV4
대략 1 ~ 5%p 이상 가능
매우 작음
backend/kernel 의존 큼
즉 많은 경우에 우선 8-bit로의 quantization은 시도해볼 가치가 있다. 그럼 언제 차이가 있지?
  1. LLM의 경우 input sequence를 처음에 전체 처리하는 단계와 한 토큰씩 처리하는 decoding 단계가 있음
    1. 구간
      병목
      quantization 효과
      Prefill
      prompt 전체를 한 번에 처리
      matmul 성능, kernel 중요
      Decode
      token 하나씩 생성
      memory bandwidth, KV cache 중요
  1. 어려운 task(math, coding, long-context 등)에서 성능이 더 하락한다.
 
8-bit로 하는 경우 int8, float8
float8이면 range에 4,5 정도 비트를 할당함
 
보통 on-device가 목적이라면 int8을 사용, float8의 경우에는 GPU acceleration이 더 최적화되어있으니 약간의 정확도 하락보다 연산 속도를 더 높이고 싶은 경우 사용.
최종적으로 가능한 이득은?
SlimQwen의 결론 : 성능은 82점 → 77점
Model
Peak Memory
HF prefill latency
HF decoding throughput
vLLM decoding throughput
Qwen3-Next-80A3B
156.56GB
0.99s
4.05 tok/s
142.58 tok/s
SlimQwen-23A2B
43.30GB
0.44s
6.55 tok/s
210.87 tok/s
 
 

Inference Framework

on-deivce, 경량화 모델, local LLM 등등을 들어가보면 항상 등장하는 헷갈리는 단어들이 있다.
ONNX, GGUF, Core ML, TensorFlow Lite / LiteRT
뭐하는 애들일까?
 
모델 포맷: - ONNX - 범용적인 포맷 - GGUF - LLM 전용 - .mlmodel / .mlpackage - Core ML 용 포맷 - .tflite - tensorRT용 포맷 Runtime / Framework: - ONNX Runtime - llama.cpp - Core ML - Apple 생태계에서 모델을 실행하고 싶은 경우 - LiteRT - TensorRT - OpenVINO
 
특정 하드웨어/벤더에 강하게 최적화된 runtime
환경
대표 runtime / framework
느낌
NVIDIA GPU
TensorRT, TensorRT-LLM, CUDA, cuDNN, FasterTransformer
NVIDIA GPU 성능 최대화
Apple chip / iPhone / Mac
Core ML, MLX, Metal Performance Shaders
Apple Neural Engine / GPU / CPU 활용
Intel CPU / Intel GPU / Intel NPU
OpenVINO
Intel 하드웨어 최적화
Qualcomm Snapdragon / Android NPU
Qualcomm AI Engine, QNN SDK, SNPE
Qualcomm 모바일 칩 최적화
AMD GPU
ROCm, MIGraphX
AMD GPU 최적화
Google TPU / Edge TPU
XLA, TensorFlow Lite Edge TPU delegate
Google TPU 계열 최적화
왜 이렇게 많지?
  • GPU vs CPU
 
 
범용 runtime
Runtime
주 사용처
느낌
ONNX Runtime
CPU, NVIDIA GPU, DirectML, mobile, edge
여러 환경에서 ONNX 모델 실행
TensorFlow Lite / LiteRT
Android, mobile, edge, embedded
모바일/엣지 범용 runtime
TVM
CPU, GPU, NPU 등 다양
여러 하드웨어용으로 컴파일 최적화
IREE
mobile, edge, accelerator
MLIR 기반 범용 배포/컴파일 runtime
 
LLM 특화 runtime
Runtime
주 환경
느낌
vLLM
NVIDIA GPU 서버
LLM serving, batching, KV cache 최적화
SGLang
NVIDIA GPU 서버
LLM serving, agent/workflow 최적화
TensorRT-LLM
NVIDIA GPU
NVIDIA에서 LLM 최대 성능
llama.cpp
CPU, Apple, NVIDIA, Android 등
local LLM, GGUF 실행
MLX
Apple Silicon
Apple chip에서 LLM/ML 실행
Ollama
Mac/Windows/Linux local
llama.cpp 등을 감싼 local LLM 앱/서버
→ LLM이 따로 있는 이유는 주로 LLM serving을 위해서 추가로 필요한 최적화 방법들이 있기 때문에(K-V Caching, paged attention, 배치처리, speculative decoding 등)
 

ONNX - 범용적인 모델 파일 포맷

우리가 일반적으로 모델을 학습하면 학습 framework를 사용한 아키텍처, 코드, 데이터가 발생한다.
→ ONNX는 이걸 학습용 프레임워크에 묶이지 않고 여러 실행 환경에서 돌릴 수 있게 하기 위한 중간 표현이다.
 
PyTorch / TensorFlow에서 만든 모델 → ONNX라는 공통 그래프 표현으로 export → ONNX Runtime, TensorRT, OpenVINO, DirectML 같은 실행 엔진에서 돌림
 
PyTorch 모델은 학습할 때 이런 것들을 포함하거나 의존한다.
Python 코드 nn.Module class 구조 autograd graph optimizer loss function training-only branch dropout / batchnorm training behavior custom Python control flow
그런데 실제 inference에서는 대부분 필요 없다.
필요한 건
입력 tensor가 들어오면 어떤 연산들을 어떤 순서로 하고 어떤 weight를 써서 출력 tensor를 만들 것인가
ONNX는 이걸 정적인 계산 그래프로 저장하는 방식. 자연스럽게 여러 환경에서 실행할 수도 있고, 추론에 필요한 연산들만 남게된다.
 
  • GGUF : LLM용 quantized 모델 파일 포맷
    • quantized LLM을 로컬에서 빠르게 로드/실행하기 위한 파일 포맷
 
가장 단순한건 모델을 ONNX 포맷으로 export하고, 다양한 환경에서 ONNX runtime으로 실행.
ONNX runtime은 Python, Go, Rust, C++, Java, Javascript, Swift, flutter 등으로 전부 실행가능하다.
ONNX Runtime은 내부에 Execution Provider라는 backend 선택 구조가 있다.
ONNX Runtime Execution Provider
실제로 쓰는 것
CPU EP
CPU에서 직접 실행
CUDA EP
NVIDIA GPU에서 CUDA로 직접 실행
TensorRT EP
NVIDIA TensorRT로 그래프 일부/전체 실행
CoreML EP
Apple Core ML로 그래프 일부/전체 실행
OpenVINO EP
Intel OpenVINO로 실행
DirectML EP
Windows DirectML로 실행
WebGPU EP
브라우저 WebGPU로 실행
 
즉 ONNX runtime으로 실행하면 알아서 최적화된 형태로 실행을 하지만, 필요하면 다른 프레임워크를 호출해서 해당 방법으로 실행할 수도 있다는 것 → 하지만 100점은 아님.
모델 graph를 어디까지 TensorRT로 넘길지 어떤 precision을 쓸지 dynamic shape를 어떻게 처리할지 어떤 op는 fallback할지 batch size / sequence length / memory layout을 어떻게 고정할지
등등에서 끝까지 최적화를 하려면 직접 하는게 더 좋다.
 

결론

분류
예시 기기/칩
메모리 규모
메모리 종류
감각
최고급 AI 서버 GPU
NVIDIA B200
약 180GB급 per GPU
HBM3e
대형 LLM 학습/추론용
고급 AI 서버 GPU
NVIDIA H100 SXM
80GB
HBM3
현재도 많이 쓰는 학습/추론 표준급
이전 세대 서버 GPU
NVIDIA A100
40GB / 80GB
HBM2e
여전히 많이 쓰임
소비자 고급 GPU
RTX 4090
24GB
GDDR6X
개인 연구/로컬 inference에서 흔함
Apple 노트북 기본 M5
MacBook Pro M5
기본 16GB, 옵션 24GB/32GB
Unified memory
3B, 7B 양자화 모델 정도
일반 노트북
Intel/AMD 노트북
16GB / 32GB / 64GB 흔함
DDR5/LPDDR5X
CPU inference 가능하지만 느릴 수 있음
고성능 x86 APU
AMD Ryzen AI Max+ 395
최대 128GB
LPDDR5X unified 계열
Mac과 비슷하게 큰 RAM을 GPU와 공유
데스크탑 CPU 시스템
Intel Core Ultra 9 285K 등
최대 256GB 지원 가능
DDR5 RAM
실제 GPU VRAM은 별도
일반 데스크탑 GPU
RTX 4060/4070/4080 계열
8GB / 12GB / 16GB
GDDR6/GDDR6X
작은 모델, 이미지 모델 일부
최신 Android
Galaxy S26 Ultra
12GB / 16GB
LPDDR 계열 RAM
온디바이스 작은 모델용
최신 iPhone
iPhone 17 Pro
12GB급
LPDDR 계열 RAM
Apple on-device AI용, 큰 LLM은 제한적
일반 스마트폰
보통 Android/iPhone
6GB / 8GB / 12GB
LPDDR RAM
작은 모델, NPU용 모델 중심
임베디드/소형 보드
Raspberry Pi, Jetson Nano급
4GB / 8GB / 16GB
시스템 RAM
tiny model, vision 모델 일부
 
 
supertonic
supertone-incUpdated May 25, 2026
핵심 차이는 이겁니다.
500M도 메모리에 올라간다 = 실행 가능 99M이면 훨씬 낫다 = 다운로드, 로딩, latency, 배터리, 브라우저/모바일 배포가 쉬워진다
예를 들어 FP16 기준으로 단순 계산하면:
99M params × 2 bytes ≈ 198MB 500M params × 2 bytes ≈ 1GB
 
모델을 얼마나 줄여야하지?
목표 환경
권장 모델 크기
브라우저 extension / 웹앱
가능하면 50M~150M params
모바일 앱
가능하면 50M~200M params
데스크톱 앱
100M~500M도 가능
고성능 로컬 앱 / Mac 전용
500M 이상도 가능
서버 없는 “가벼운 제품 기능”
100M 전후가 매우 유리
 
첫째, 다운로드 크기입니다.
사용자가 extension을 설치했는데 모델 asset이 수백 MB에서 1GB 가까이 되면 첫 실행 경험이 나빠집니다. Supertonic 관련 소개에서도 99M 모델이 0.7B~2B급 TTS 대비 다운로드 용량, 시작 시간, 메모리 사용량에서 가볍다는 점을 강조합니다.
둘째, cold start입니다.
모델 파일을 다운로드하고, 파싱하고, ONNX Runtime에 올리고, WebGPU/WASM backend를 준비하는 시간이 있습니다. 500M 모델은 메모리에 올라가더라도 첫 실행이 느려질 수 있습니다.
셋째, latency입니다.
TTS는 LLM처럼 “몇 초 기다려도 되는” 경우보다, 클릭하면 바로 읽어줘야 하는 경험이 중요합니다. 특히 웹페이지 읽기, 접근성 기능, 브라우저 extension은 반응성이 제품 가치입니다. README도 “under a second”를 강조합니다.
넷째, CPU/GPU 점유와 배터리입니다.
500M이 MacBook에서는 괜찮아도, 저사양 노트북, 모바일, 태블릿, edge device에서는 부담이 큽니다. 모델이 작으면 같은 작업을 더 적은 전력과 발열로 처리할 가능성이 커집니다.
다섯째, 동시 실행 환경입니다.
사용자는 Chrome 탭 여러 개, Zoom, VSCode, Slack을 같이 켜둡니다. “단독으로 모델만 띄웠을 때 가능”과 “실제 사용 중에도 쾌적”은 다릅니다.
여섯째, 브라우저 runtime 제약입니다.
네이티브 앱이면 Core ML, TensorRT, Metal, CUDA 같은 최적화 경로를 더 깊게 탈 수 있지만, 브라우저에서는 보통 ONNX Runtime Web + WebGPU/WASM 경로를 씁니다. 이 경로는 편리하지만 메모리/성능 제약이 더 민감하게 느껴질 수 있습니다. Supertonic은 ONNX Runtime 기반으로 여러 환경에서 로컬 실행되는 것을 강조하고 있습니다.
 
 
 
 
 
 
 
 
 
📂 주로 참고한 자료
 
Share article