GGUF 포맷: 두 판 사이의 차이
(새 문서: '''GGUF'''(Generic GPT Unified Format)은 대형 언어 모델(LLM)의 텐서와 메타데이터를 통합 저장하는 바이너리 '''모델 포맷'''으로, llama.cpp 기반의 로컬 추론 환경에서 사용된다. 이 포맷은 이전 GGML 포맷의 한계를 보완하여, 다양한 양자화 형식과 모델 관련 정보를 함께 포함할 수 있도록 설계되었다. ==개요== GGUF는 General Graphical Model Library(GGML) 기반의 추론 시스템을 위해 만...) |
편집 요약 없음 |
||
13번째 줄: | 13번째 줄: | ||
* 정밀도 정보: float32, float16, int8, int4 등 다양한 양자화 지원 | * 정밀도 정보: float32, float16, int8, int4 등 다양한 양자화 지원 | ||
* 키-값 기반의 설명 필드 | * 키-값 기반의 설명 필드 | ||
===1. 헤더 (Header)=== | |||
파일의 맨 앞부분으로, GGUF 포맷의 기본 정보를 정의한다. | |||
*파일 식별자(Magic String): `"GGUF"` | |||
*버전 정보 (예: v3, v4) | |||
*텐서 개수 및 메타데이터 항목 수 | |||
→ 예를 들어 `"GGUFv3"`라는 문자열이 파일 시작 부분에 명시되어 포맷 버전을 구분한다. | |||
===2. 메타데이터 블록 (Metadata Block)=== | |||
모델의 구조 및 설정을 키-값 형태로 저장하는 영역이다. 이 블록은 모델 로딩 시 구조적 정보를 제공하며, 사람이 읽을 수 있도록 문자열 형태로 저장되기도 한다.<syntaxhighlight lang="text"> | |||
key: "general.architecture" → value: "llama" | |||
key: "context_length" → value: 4096 | |||
key: "tensor_data_type" → value: "float16" | |||
key: "tokenizer.ggml.model" → value: "BPE" | |||
key: "quantization" → value: "Q4_K_M" | |||
</syntaxhighlight>이런 식으로 각 키는 모델의 세부 속성을 기술하며, 추론 엔진은 이 정보를 기반으로 가중치를 어떻게 해석할지를 결정한다. | |||
===3. 텐서 블록 (Tensor Block)=== | |||
모델의 실제 가중치 데이터가 저장된 구간이다. 각 텐서는 고유 이름과 데이터 형태(Shape, Data Type, Offset)를 가진다.<syntaxhighlight lang="text"> | |||
tensor name: "model.layers.0.attention.q_proj.weight" | |||
shape: [4096, 4096] | |||
type: Q4_0 | |||
offset: 1024 bytes (파일 내 위치) | |||
</syntaxhighlight>즉, 각 텐서는 연속된 바이너리 덩어리로 저장되며, 양자화 형식(Q2, Q4, Q5, Q8 등)에 따라 실제 저장 크기와 정밀도가 달라진다. | |||
===4. 전체 구조 예시 (시각적 개념)=== | |||
<syntaxhighlight lang="text"> | |||
┌─────────────────────────────┐ | |||
│ GGUF Header (magic, version)│ | |||
├─────────────────────────────┤ | |||
│ Metadata Block (key-value) │ | |||
│ ├── general.architecture │ | |||
│ ├── context_length │ | |||
│ ├── tokenizer.ggml.model │ | |||
│ └── quantization │ | |||
├─────────────────────────────┤ | |||
│ Tensor Block │ | |||
│ ├── layer_0/q_proj.weight │ | |||
│ ├── layer_0/k_proj.weight │ | |||
│ ├── layer_1/... │ | |||
│ └── final_norm.weight │ | |||
└─────────────────────────────┘ | |||
</syntaxhighlight>이런 구조 덕분에 llama.cpp 같은 로더는 파일을 메모리에 바로 매핑(mmap)한 뒤, 필요한 텐서만 읽어 들이는 식으로 빠르게 추론을 수행할 수 있다. | |||
==특징== | ==특징== | ||
* '''단일 포맷 구조''': 모델 정보와 가중치를 하나로 통합하여 로딩 속도 향상 | * '''단일 포맷 구조''': 모델 정보와 가중치를 하나로 통합하여 로딩 속도 향상 |
2025년 10월 8일 (수) 03:51 기준 최신판
GGUF(Generic GPT Unified Format)은 대형 언어 모델(LLM)의 텐서와 메타데이터를 통합 저장하는 바이너리 모델 포맷으로, llama.cpp 기반의 로컬 추론 환경에서 사용된다. 이 포맷은 이전 GGML 포맷의 한계를 보완하여, 다양한 양자화 형식과 모델 관련 정보를 함께 포함할 수 있도록 설계되었다.
개요[편집 | 원본 편집]
GGUF는 General Graphical Model Library(GGML) 기반의 추론 시스템을 위해 만들어진 통합 모델 저장 포맷이다. 단일 포맷 내에 모델 가중치(텐서), 아키텍처 정보, 토크나이저 설정, 정밀도, 최대 컨텍스트 길이 등의 메타데이터를 포함한다. 2023년부터 llama.cpp 커뮤니티에 의해 채택되었으며, 다양한 로컬 추론 프레임워크에서 활용되고 있다.
구조[편집 | 원본 편집]
GGUF 포맷은 다음과 같은 구성 요소를 포함한다:
- 모델 텐서(weight) 데이터
- 메타데이터: 모델 아키텍처, 양자화 형식, 토크나이저 사양 등
- 정밀도 정보: float32, float16, int8, int4 등 다양한 양자화 지원
- 키-값 기반의 설명 필드
1. 헤더 (Header)[편집 | 원본 편집]
파일의 맨 앞부분으로, GGUF 포맷의 기본 정보를 정의한다.
- 파일 식별자(Magic String): `"GGUF"`
- 버전 정보 (예: v3, v4)
- 텐서 개수 및 메타데이터 항목 수
→ 예를 들어 `"GGUFv3"`라는 문자열이 파일 시작 부분에 명시되어 포맷 버전을 구분한다.
2. 메타데이터 블록 (Metadata Block)[편집 | 원본 편집]
모델의 구조 및 설정을 키-값 형태로 저장하는 영역이다. 이 블록은 모델 로딩 시 구조적 정보를 제공하며, 사람이 읽을 수 있도록 문자열 형태로 저장되기도 한다.
key: "general.architecture" → value: "llama"
key: "context_length" → value: 4096
key: "tensor_data_type" → value: "float16"
key: "tokenizer.ggml.model" → value: "BPE"
key: "quantization" → value: "Q4_K_M"
이런 식으로 각 키는 모델의 세부 속성을 기술하며, 추론 엔진은 이 정보를 기반으로 가중치를 어떻게 해석할지를 결정한다.
3. 텐서 블록 (Tensor Block)[편집 | 원본 편집]
모델의 실제 가중치 데이터가 저장된 구간이다. 각 텐서는 고유 이름과 데이터 형태(Shape, Data Type, Offset)를 가진다.
tensor name: "model.layers.0.attention.q_proj.weight"
shape: [4096, 4096]
type: Q4_0
offset: 1024 bytes (파일 내 위치)
즉, 각 텐서는 연속된 바이너리 덩어리로 저장되며, 양자화 형식(Q2, Q4, Q5, Q8 등)에 따라 실제 저장 크기와 정밀도가 달라진다.
4. 전체 구조 예시 (시각적 개념)[편집 | 원본 편집]
┌─────────────────────────────┐
│ GGUF Header (magic, version)│
├─────────────────────────────┤
│ Metadata Block (key-value) │
│ ├── general.architecture │
│ ├── context_length │
│ ├── tokenizer.ggml.model │
│ └── quantization │
├─────────────────────────────┤
│ Tensor Block │
│ ├── layer_0/q_proj.weight │
│ ├── layer_0/k_proj.weight │
│ ├── layer_1/... │
│ └── final_norm.weight │
└─────────────────────────────┘
이런 구조 덕분에 llama.cpp 같은 로더는 파일을 메모리에 바로 매핑(mmap)한 뒤, 필요한 텐서만 읽어 들이는 식으로 빠르게 추론을 수행할 수 있다.
특징[편집 | 원본 편집]
- 단일 포맷 구조: 모델 정보와 가중치를 하나로 통합하여 로딩 속도 향상
- 다양한 양자화 지원: 저정밀 양자화를 통한 모델 경량화 가능
- 확장된 메타데이터: 구조, 학습 파라미터, 토크나이저 등 세부 정보 포함
- 하위 호환성: 기존 GGML 모델을 GGUF 포맷으로 점진적 이전 가능
장점[편집 | 원본 편집]
- 빠른 추론: 메모리 매핑과 로딩 최적화로 실행 속도 향상
- 관리 용이성: 모델 관련 정보가 하나의 포맷에 통합되어 관리가 단순함
- 플랫폼 호환성: CPU, GPU, Apple Silicon 등 다양한 환경 지원
- 양자화 유연성: int8, int4 등 리소스 절약을 위한 다양한 정밀도 선택 가능
단점[편집 | 원본 편집]
- 도구 호환성 제한: llama.cpp, Ollama 등 일부 환경에서만 지원
- 보안 취약점 가능성: 과거 메모리 파싱 오류 사례 존재
- 표준화 미흡: 타 프레임워크와의 직접적 호환성은 아직 제한적
활용 예[편집 | 원본 편집]
- llama.cpp, llama-rs 등에서 로컬 GPT 모델 추론 시 GGUF 포맷 사용
- Hugging Face Hub에서 GGUF 포맷 모델을 다운로드 후 터미널 기반 실행
- Mistral, LLaMA, Phi-2 등 주요 모델들이 GGUF 포맷으로 공개됨
같이 보기[편집 | 원본 편집]
참고 문헌[편집 | 원본 편집]
- Georgi Gerganov. (2023). llama.cpp 프로젝트 문서
- GGUF GitHub 저장소 문서
- Ollie, P. (2024). Quantized LLM inference on edge devices.