How to build & run on-device model
온디바이스 모델에 대한 이해와 어떻게 모델을 온디바이스화 할 수 있을지
May 25, 2026
온디바이스 모델이라고 할 때 그 범주에 들어갈 수 있는 것이 많다.
- vision/speech understanding, language/speech/action generation, etc
- 어떤 조건을 온디바이스라고 부를까
서버/클라우드가 아닌 로컬 기기에서 실행되면 전부 온디바이스 모델이라고 부른다.
꼭 cpu로 실행되는 것만을 지칭하는건 아니다.
맥북에도 이미 어느정도 좋은 GPU/NPU 등이 내장되어 있다.
- 일반적으로 on-device가 되기 위해서 필요한 것
- 로컬 메모리에 올라갈 수 있는 정도의 모델 크기
- 낮은 병렬 처리 효율성 환경에서도 충분히 기다릴만한 inference 속도
메모리에 올릴 수 있는 모델 크기에 대한 이해.
상황을 가정하고 전개해본다. 내 맥북의 memory가 16GB일 때, 어느 정도 사이즈의 모델을 올릴 수 있을까? → 메모리를 점유하는 값들이 무엇인지에 대한 이해가 있어야한다.
llm 3B model size를 가정whisper- model weight
- Norm : dim * 2 :
1% 이하 - Attention : 4 * dim^2 :
약 33%-> Grouped query attention을 사용하면 더 작아짐 - MLP : 8 * dim^2 :
약 66%
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배 크기 때문에
- activation
모델이 계산 중간에 만들어내는 임시 tensor : 대표적인 예시 = attention score
attention score는 단순 구현시 [seq_len, seq_len] 이기 때문에 크기가 꽤 커질 수 있다. 하지만 실제로는 flash attention 같은 프레임워크들이 잘 처리해주기 때문에 그렇게 커지지 않는다.
llm은 여기에 더해서- KV cache
저번 주에 얘기 하려던거
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배 더 차지함.
- 기타
- 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 사용하면 볼 수 있다. →

이미 Swap이 일어난 상태이지만 남은게 거의 2GB 밖에 없음;
모델을 올리기 위해서는 다른 프로그램들을 Swap해야하니 다른 동작들이 느려진다.
보통 5 ~ 8GB 정도 된다고 한다.
Inference를 위해 사용되는 것들
- Runtime / framework overhead
같은 모델이라도 어떤걸 사용해서 돌리느냐에 따라 사용되는 메모리가 다르다.
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을 적용한다.
- Pruning

중요하지 않은 가중치를 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을 적용하는 실험을 했다.

width를 줄이는게 제일 좋았다고 하는데, 큰 의미는 모르겠다.
- Knowledge Distillation
잘 학습되었지만 큰 크기의 모델(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을 통해 크기를 줄인 경우.

- 실제로는 LM Loss + KD Loss까지 하는게 더 좋았고, Multi-token prediction으로도 KD를 해서 speculative decoding 성능도 최적화했다.
- 또 어짜피 4배를 줄여서 400B token을 학습한다고 할 때, 2배로 줄이고 40B로 학습하고 다시 2배 줄여서 360B를 학습하는 식으로 progressive pruning을 하는게 성능이 더 좋았다고 한다.

Model quantization
Model 실행을 위해서 FP32/FP16으로 저장·계산하던 값을 INT8, INT4, FP8 같은 더 싼 표현으로 바꾸는 것
여기서 여러 선택지가 생깁니다.
- weight만 줄일 것인가, activation(= 처리되는 데이터)도 줄일 것인가
- scale/zero point를 미리 정할 것인가, 실행 중에 계산할 것인가
- 학습 없이 바꿀 것인가, 다시 학습하면서 적응시킬 것인가
- CPU, GPU, NPU, Apple Neural Engine 중 어디에서 돌릴 것인가
컴퓨터에서 숫자 값을 저장하는 방법, float 기준

쉽게말해 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 quantization과 static quantization이 갈립니다.
- 양자화 방법도 학습 후 양자화를 적용(PTQ)시키는 방법이 있고 학습 단계에서 미리 양자화를 고려해서 학습(QAT)하는 방법이 있다. - DeepSeek V4에서는 QAT
- Weight를 양자화할지 Activation을 양자화할지에 따라 보통
W8A8,W4A16과 같이 표기한다. - 학습 후 weight는 고정되기 때문에 양자화가 더 쉽다. 하지만 activation은 계속 바뀌니 양자화가 더 어렵다.
- activation이 해상도가 높은게 정확도 유지가 더 잘된다. 어쨌든 다음 레이어로, output으로 전달되는 값 자체에 손실이 더 적다는거니까
- 목적이 약간 다르다.
- 대신 W8A8과 같이 둘다 int8로 만들게 되면, 진짜 INT8 연산만 하면되니 최적화된 matmul method를 쓸 수 있기 때문에 연산속도 이득이 크다.
어짜피 하는거 둘다 하지않을 이유는?
→ outlier 때문에 LLM에서 양자화가 더 어렵다.
작은 값들: -1.2, 0.3, 1.5 큰 outlier: 31.0
큰 outlier까지 살리려고 scale을 크게 잡으면, 대부분의 작은 값들은 INT8에서 너무 거칠게 표현된다
weight를 양자화하는건 주로 모델 크기를 줄이고 메모리 점유를 줄이기 위함이고, activation을 양자화하는건 메모리 이득은 크지 않지만 연산 속도를 높이기 위함이다.
그러니 모델을 줄이는게 중요한 경우에는 weight를 양자화하고 정확도를 유지하기 위해 activation은 그대로 둔다.
그래서 모델을 올리는게 문제인 LLM에서는 로컬 LLM을 위해 GGUF, GPTQ, AWQ 같은 quantized model들이 보통 W4A16, W4A16 비슷한 형태를 많이 쓴다.
그럼 보통 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은 시도해볼 가치가 있다. 그럼 언제 차이가 있지?
- LLM의 경우 input sequence를 처음에 전체 처리하는 단계와 한 토큰씩 처리하는 decoding 단계가 있음
구간 | 병목 | quantization 효과 |
Prefill | prompt 전체를 한 번에 처리 | matmul 성능, kernel 중요 |
Decode | token 하나씩 생성 | memory bandwidth, KV cache 중요 |
- 어려운 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-inc • Updated 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 기반으로 여러 환경에서 로컬 실행되는 것을 강조하고 있습니다.
📂 주로 참고한 자료
- Nvidia Compact Language Models via Pruning and Knowledge Distillation
- Qwen Exploring the Pruning and Distillation in Large MoE Model Pre-training
Share article
