안녕하세요 써드앵글입니다.
AI를 활용하여 GGUF와 GGML에 대해 알아봤습니다.
재밌게 읽어주세요.
GGUF와 GGML은 로컬 환경에서 대형 언어 모델(LLM)을 실행할 때 자주 접하게 되는 파일 포맷입니다. 둘 다 효율성을 목표로 설계되었지만, GGUF는 GGML의 후속 버전으로 여러 한계를 개선한 포맷입니다. 이 글에서는 두 포맷의 차이를 쉽게 풀어 설명하고, 실제 어떤 데이터가 어떻게 들어가는지 구체적인 예시를 들어 보겠습니다.
1. GGUF와 GGML이란?
GGML (Georgi Gerganov Machine Learning Format)
GGML은 Llama.cpp와 같은 경량 머신러닝 라이브러리에서 사용되던 모델 파일 포맷입니다. CPU와 GPU에서 효율적으로 동작하도록 설계되었으며, 특히 개인 컴퓨터에서 LLM을 실행하려는 사용자들에게 사랑받았습니다. 가볍고 빠르게 실행 가능한 것이 장점이지만, 시간이 지나며 복잡한 모델 구조와 다양한 요구사항을 반영하기에는 한계가 드러났습니다.
GGUF (GGML Unified Format)
GGUF는 GGML을 기반으로 한 개선된 포맷입니다. 이름에서 알 수 있듯 '통합된(Unified)' 형식을 지향하며, 더 많은 메타데이터를 포함하고 확장성을 높였습니다. 최신 Llama.cpp와 다양한 로컬 AI 엔진에서 지원하며, GGML의 단점을 보완해 현대적인 AI 모델 실행 환경에 적합하게 설계되었습니다.
2. 쉬운 비유: GGML은 ZIP, GGUF는 TAR
GGML과 GGUF의 차이를 파일 압축 포맷인 ZIP과 TAR에 비유하면 이해가 더 쉬울 겁니다.
- GGML = ZIP: ZIP 파일은 빠르고 간단하게 압축하고 풀 수 있습니다. 각 파일을 독립적으로 관리할 수 있지만, 새로운 기능(예: 암호화, 메타데이터 추가)을 추가하려면 포맷 자체를 바꿔야 하는 단점이 있습니다. GGML도 마찬가지로 기본적인 모델 실행에는 적합하지만, 새로운 요구사항을 반영하기 어렵습니다.
- GGUF = TAR: TAR는 여러 파일을 하나로 묶고, 파일 권한이나 소유권 같은 추가 정보(메타데이터)를 유연하게 포함할 수 있습니다. 필요하면 별도의 압축 알고리즘(gzip 등)을 적용할 수도 있어 확장성이 뛰어납니다. GGUF도 이런 특성을 닮아 더 많은 정보를 담고, 다양한 환경에 맞게 최적화할 수 있습니다.
이 비유에서 ZIP과 TAR의 차이가 단순히 압축률에만 있는 게 아니듯, GGML과 GGUF의 차이도 단순히 데이터 크기가 아니라 구조적 유연성과 정보 포함 능력에 있다고 볼 수 있습니다.
3. GGUF가 필요한 이유: GGML의 한계와 개선점
GGUF는 GGML의 한계를 극복하기 위해 등장했습니다. 그 이유를 구체적으로 살펴보겠습니다.
1) 더 많은 메타데이터 저장 필요
GGML은 모델의 핵심 데이터(가중치, 레이어 구조 등)만 저장할 수 있어 추가적인 실행 정보가 부족했습니다. GGUF는 이런 문제를 해결하기 위해 메타데이터를 대폭 확장했습니다.
GGML에 포함되는 데이터 예시:
- 모델 가중치 (Weights): 예: [0.12, -0.45, 0.89, ...] 같은 숫자 배열
- 레이어 구조 (Layer Structure): "레이어 32개, 각 레이어당 4096개의 뉴런"
- 양자화 정보 (Quantization): "4bit 양자화 적용"
GGUF에서 추가된 메타데이터 예시:
- 하드웨어 지원 정보: "이 모델은 NVIDIA GPU의 CUDA 11.8 이상에서 최적화됨"
- 벡터 크기: "임베딩 벡터 크기 = 512"
- 학습 하이퍼파라미터: "Learning rate = 0.001, Batch size = 64"
- 토큰화 정보: "BPE 토크나이저 사용, vocab size = 50,000"
- 버전 정보: "GGUF v2 포맷, Llama.cpp v1.4.0 이상 호환"
실제 상황 예시:
GGML 파일을 실행하려는데 "이 모델이 어떤 토크나이저를 썼는지 모르겠다"거나 "내 GPU에서 제대로 돌아갈지 확신이 안 된다"는 문제가 생길 수 있습니다. GGUF는 이런 메타데이터를 파일 안에 포함해 사용자가 별도로 추측하거나 문서를 찾을 필요를 줄입니다.
2) 새로운 모델 구조 지원
AI 모델은 계속 진화합니다. 예를 들어, Mixture of Experts (MoE)처럼 여러 전문가 모델을 결합한 구조나, 새로운 활성화 함수(예: SwiGLU)를 사용하는 모델이 등장했는데, GGML로는 이를 제대로 표현하기 어려웠습니다. GGUF는 이런 구조를 지원하도록 설계되었습니다.
예시:
- GGML: "32개 레이어, ReLU 활성화 함수"만 표현 가능
- GGUF: "16개 MoE 레이어, 각 레이어에 8개 전문가 포함, SwiGLU 활성화 함수 사용" 같은 복잡한 정보도 저장 가능
3) 호환성과 유지보수 용이성
GGML은 특정 버전의 Llama.cpp에서만 잘 동작하는 경우가 많았고, 시간이 지나며 호환성 문제가 생겼습니다. GGUF는 표준화된 포맷을 통해 다양한 엔진에서 안정적으로 실행되도록 개선되었습니다.
실제 상황 예시:
GGML 모델을 최신 Llama.cpp에서 돌리려 했더니 "지원되지 않는 포맷" 오류가 발생. GGUF로 변환하면 이런 문제를 피할 수 있습니다.
4. 주요 차이점 정리
차이점 | GGML | GGUF |
확장성 | 제한적 (기본 데이터만 저장) |
유연함 (다양한 메타데이터 포함 가능)
|
지원 정보 | 가중치, 레이어, 양자화 정보 |
하드웨어, 토큰화, 하이퍼파라미터 등
|
새로운 모델 지원 | 기존 구조에 한정됨 |
MoE, 새로운 함수 등 지원 가능
|
호환성 | 특정 엔진에 의존적 |
표준화로 광범위한 호환성 제공
|
파일 크기 | 상대적으로 작음 |
메타데이터 증가로 약간 큼
|
5. 실제 데이터가 어떻게 들어가는지 예시로 살펴보기
GGML 파일 내부 (간략화된 예):
Layer Count: 32
Quantization: 4-bit
[Weights]
Layer 1: [0.12, -0.45, 0.89, ...]
Layer 2: [0.34, 0.67, -0.23, ...]
- 단순히 숫자와 기본 구조만 기록. 추가 정보는 외부 문서나 사용자가 직접 알아내야 함.
GGUF 파일 내부 (간략화된 예):
Model Name: Llama-13B
Version: Compatible with Llama.cpp v1.5.0
Hardware: Optimized for NVIDIA RTX 3090
[Metadata]
Tokenizer: BPE, Vocab Size = 50,000
Vector Size: 4096
Hyperparameters: LR=0.0001, Dropout=0.1
Architecture: 40 layers, MoE with 8 experts
[Weights]
Layer 1: [0.12, -0.45, 0.89, ...]
Layer 2: [0.34, 0.67, -0.23, ...]
- 모델 실행에 필요한 모든 정보가 파일 안에 포함되어 있어 바로 사용할 수 있음.