콘텐츠로 이동
Data Prep
상세

Edge LLM 서빙 아키텍처

개요

Edge LLM 서빙은 클라우드가 아닌 엣지 디바이스(모바일, IoT, 온프레미스 서버)에서 LLM을 실행하는 아키텍처다. 지연시간 감소, 프라이버시 보호, 오프라인 동작이 핵심 이점이다.

왜 Edge LLM인가?

관점 클라우드 Edge
지연시간 100-500ms 10-50ms
프라이버시 데이터 전송 필요 로컬 처리
비용 API 호출당 과금 초기 투자 후 무료
오프라인 불가 가능
확장성 무제한 디바이스 제약

디바이스 분류

Tier 1: 고성능 엣지

  • 하드웨어: NVIDIA Jetson AGX, Apple M-series Mac, RTX 4090 워크스테이션
  • 가능 모델: 7B-70B 파라미터
  • 용도: 온프레미스 엔터프라이즈, 전문 워크스테이션

Tier 2: 중간 엣지

  • 하드웨어: Jetson Orin Nano, Raspberry Pi 5 + AI HAT, 일반 데스크톱
  • 가능 모델: 1B-7B 파라미터
  • 용도: 스마트홈 허브, 소규모 사무실

Tier 3: 모바일/경량 엣지

  • 하드웨어: 스마트폰 (iPhone, Android), 태블릿
  • 가능 모델: 0.5B-3B 파라미터
  • 용도: 개인 비서, 오프라인 번역

모델 최적화 기법

1. 양자화 (Quantization)

FP32 → FP16 → INT8 → INT4
100%   50%    25%    12.5% (메모리)
기법 정밀도 손실 메모리 절감 속도 향상
FP16 거의 없음 50% 1.5-2x
INT8 (GPTQ) 1-2% 75% 2-3x
INT4 (GGUF) 3-5% 87.5% 3-4x
2-bit 5-10% 93.75% 4-5x

GGUF 양자화 예시:

# llama.cpp로 양자화
./quantize model-f16.gguf model-q4_k_m.gguf Q4_K_M

2. 지식 증류 (Knowledge Distillation)

┌────────────────┐
│ Teacher Model  │  (70B)
│    (Large)     │
└───────┬────────┘
        │ Soft Labels
┌────────────────┐
│ Student Model  │  (7B)
│    (Small)     │
└────────────────┘
  • Teacher 모델의 출력 분포를 학습
  • 작은 모델로 큰 모델 성능 근접
  • Phi, Gemma 등이 이 방식 활용

3. 프루닝 (Pruning)

# 구조적 프루닝 예시
def prune_attention_heads(model, heads_to_prune):
    for layer, heads in heads_to_prune.items():
        model.layers[layer].self_attn.prune_heads(heads)
  • 불필요한 파라미터 제거
  • 구조적 vs 비구조적 프루닝
  • 10-30% 크기 감소 가능

4. 아키텍처 최적화

기법 설명 효과
Grouped Query Attention KV 캐시 공유 메모리 50-90% 절감
Sliding Window Attention 고정 윈도우 긴 컨텍스트 처리
MoE Sparsity 일부 Expert만 활성화 연산량 감소

서빙 프레임워크

llama.cpp

# 서버 실행
./llama-server \
  -m model-q4_k_m.gguf \
  -c 4096 \
  -ngl 99 \  # GPU 레이어 수
  --host 0.0.0.0 \
  --port 8080

장점: 경량, 다양한 플랫폼, 활발한 커뮤니티 단점: 배치 처리 제한적

Ollama

# 모델 실행
ollama run llama3.2:3b-instruct-q4_K_M

# API 서버
curl http://localhost:11434/api/generate \
  -d '{"model": "llama3.2:3b", "prompt": "Hello"}'

장점: 사용 편의성, 모델 관리 단점: 커스터마이징 제한

MLC LLM (모바일)

# Android/iOS 배포
from mlc_llm import MLCEngine

engine = MLCEngine("Llama-3.2-1B-Instruct-q4f16_1-MLC")
response = engine.chat("Hello!")

장점: 모바일 최적화, WebGPU 지원 단점: 모델 변환 필요

ExecuTorch (PyTorch Mobile)

# 모델 내보내기
import executorch
exported = torch.export.export(model, example_inputs)
executorch_program = executorch.exir.to_edge(exported)

장점: PyTorch 생태계 통합 단점: 아직 초기 단계

아키텍처 패턴

Pattern 1: 완전 로컬

┌─────────────────────────────┐
│      Edge Device            │
│  ┌───────────────────────┐  │
│  │      Local LLM        │  │
│  │    (3B-7B model)      │  │
│  └───────────────────────┘  │
│  ┌───────────────────────┐  │
│  │    Local Vector DB    │  │
│  │     (Chroma/FAISS)    │  │
│  └───────────────────────┘  │
└─────────────────────────────┘

적합: 오프라인 필수, 민감 데이터, 저지연

Pattern 2: 하이브리드 (Edge + Cloud)

┌──────────────┐          ┌──────────────┐
│ Edge Device  │          │    Cloud     │
│ ┌──────────┐ │          │ ┌──────────┐ │
│ │Small LLM │ │◄────────►│ │Large LLM │ │
│ │ (Router) │ │ Fallback │ │ (70B+)   │ │
│ └──────────┘ │          │ └──────────┘ │
└──────────────┘          └──────────────┘

라우팅 로직:

def route_query(query, complexity_score):
    if complexity_score < 0.3:
        return edge_model.generate(query)
    elif complexity_score < 0.7:
        return edge_model.generate(query, fallback=cloud_api)
    else:
        return cloud_api.generate(query)

Pattern 3: 분산 엣지

      ┌─────────────┐
      │ Coordinator │
      └──────┬──────┘
   ┌─────────┼─────────┐
   ▼         ▼         ▼
┌─────┐  ┌─────┐  ┌─────┐
│Edge │  │Edge │  │Edge │
│ A   │  │ B   │  │ C   │
└─────┘  └─────┘  └─────┘
  • 여러 엣지 디바이스가 협업
  • 모델 샤딩 또는 앙상블
  • 로드 밸런싱

성능 벤치마크

디바이스별 추론 속도 (Llama 3.2 3B Q4)

디바이스 tokens/sec 첫 토큰 지연
M3 Pro (36GB) 45-55 50ms
RTX 4070 60-80 30ms
Jetson Orin 25-35 100ms
iPhone 15 Pro 15-25 150ms
Raspberry Pi 5 3-5 500ms

메모리 요구사항

모델 크기 FP16 Q8 Q4
1B 2GB 1GB 0.6GB
3B 6GB 3GB 1.7GB
7B 14GB 7GB 4GB
13B 26GB 13GB 7.5GB

최적화 체크리스트

모델 선택

  • [ ] 용도에 맞는 크기 선택 (오버스펙 지양)
  • [ ] Instruction-tuned 버전 사용
  • [ ] 도메인 특화 모델 고려

양자화

  • [ ] Q4_K_M이 일반적으로 최적 균형점
  • [ ] 정확도 검증 후 적용
  • [ ] GGUF 형식 표준화

메모리 관리

  • [ ] KV 캐시 크기 적절히 설정
  • [ ] 컨텍스트 길이 제한
  • [ ] 메모리 매핑 활용 (mmap)

배치/캐싱

  • [ ] 자주 쓰는 프롬프트 캐싱
  • [ ] 배치 크기 최적화
  • [ ] Speculative decoding 고려

실전 구성 예시

스마트홈 AI 허브 (Jetson Orin Nano)

hardware:
  device: Jetson Orin Nano (8GB)
  storage: 256GB NVMe

model:
  name: Llama-3.2-3B-Instruct
  quantization: Q4_K_M
  context_length: 2048

server:
  framework: llama.cpp
  port: 8080
  max_concurrent: 4

features:
  - 음성 명령 처리 (Whisper.cpp)
  - 스마트홈 제어
  - 일정 관리
  - 로컬 RAG (가전 매뉴얼)

기업 온프레미스 (RTX 4090 워크스테이션)

hardware:
  gpu: RTX 4090 24GB
  ram: 128GB
  storage: 2TB NVMe

model:
  primary: Llama-3.1-70B-Instruct (Q4)
  fallback: Llama-3.2-8B-Instruct (Q8)

server:
  framework: vLLM
  batching: continuous
  max_concurrent: 32

features:
  - 문서 분석 (RAG)
  - 코드 리뷰
  - 이메일 작성
  - 회의록 요약

보안 고려사항

위협 대응
모델 탈취 암호화 저장, TPM 활용
프롬프트 인젝션 입력 검증, 샌드박싱
사이드채널 공격 타이밍 일정화
물리적 접근 보안 부트, 하드웨어 보안

참고 자료

  • llama.cpp GitHub
  • MLC LLM Documentation
  • Apple MLX Framework
  • NVIDIA Jetson AI Lab
  • Hugging Face Optimum

최종 업데이트: 2026-02-18