logo
|
Blog
    deeplearning

    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 quantization과 static 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-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
      • arxiv.org
        https://arxiv.org/pdf/2407.14679
    • Qwen Exploring the Pruning and Distillation in Large MoE Model Pre-training
      • SlimQwen: Exploring the Pruning and Distillation in Large MoE...
        Structured pruning and knowledge distillation (KD) are typical techniques for compressing large language models, but it remains unclear how they should be applied at pretraining scale, especially...
        SlimQwen: Exploring the Pruning and Distillation in Large MoE...
        https://arxiv.org/abs/2605.08738
        SlimQwen: Exploring the Pruning and Distillation in Large MoE...
     
    Share article

    Kim Hojin

    RSS·Powered by Inblog