본문 바로가기

Develop/Machine Learning

GGUF (Georgi Gerganov Unified Format)

GGUF

GGUF 는 Georgi Gerganov(@ggerganov)란 개발자가 만든

딥러닝 모델을 저장 용도의 단일 파일 포맷이다.

GGML 라이브러리 기반의 런타임에서 주로 사용이 되고 있다.

 

현재는 주로 LLM 추론에 많이 활용이 되고 있는걸로 보인다.

단일 파일이기 때문에 추론을 실행하기에 필요한 모든 정보들이 하나의 파일에 모두 담겨야한다.

크게 1) 모델의 Weight 텐서 값들과 2) 메타데이터가 Key-Value 형식으로 저장되어있다. 이 부분은 자세한건 뒤에서 설명을 한다. 

 

여느 다른 ML라이브러리들과 달리 fp16 정밀도를 넘어서

8-bit, 6-bit, 5-bit, 4-bit, 3-bit 그리고 2-bit 양자 텐서타입까지 지원을 하고 있다.

2023년 하반기에 나타나더니 급속도로 인기를 얻고 있으며

많은 사람들이 Pytorch의 .pt 포맷의 모델 파일을 .gguf 포맷으로 컨버팅하며 공유하고 있다.

 

로컬 컴퓨터 LLM 추론기로 유명한 llama.cpp에는

다양한 모델들을 양자화 변환을 하여 GGUF 파일로 공유되고 있다. 

 

llama.cpp supported models

 

어떤 유저가 올린 2-bit quantized 모델을 HF에서 다운로드할 수 있다!



위 목록들만 봐도 알 수 있지만,

주로 Transformer류 모델의 저장용도로 사용하고 있다.
하지만 설계 자체는 그런 제한이 없어보인다.

 

 

 

 

GGUF는 어떤 정보를 담고있나?

앞서 말했듯이 GGUF 파일에는 두 가지가 기록된다.

1. 모델의 Weight Tensor 값과 텐서 정보

- Tensor 의 이름

- Tensor 의 차원 수

- Tensor 의 Shape

- Tensor 의 데이터 타입

- Tensor 데이터가 위치한 Offset

 

2. Key-Value 형식의 메타데이터

Key는 ASCII 문자와 '.' 으로 계층을 표현한다.

다음처럼 쓸 수 있다. llama.attention.head_count_kv

 

먼저 모델의 세부 정보들이 포함되어야한다. 예를 들어 

- 입력 토큰 길이 (context length)

- 임베딩 크기 (embedding length)

- 피드 포워드 길이 (feed forward length)

 

여기에 추가로 Tokenizer 의 정보도 단일 파일에 포함되어야한다.

- bos token id

- eos token id 

- uknown token id

- seperate token id

- padding token id

- Vocab 파일 : 심지어 vocab 파일도 담아야한다. 예시는 아래에서 확인하자. 

 

이외에도 추론에 필요한 정보가 있다면 꼭 들어가야한다.

물론 추론기에 이 값을 활용하는 기능이 구현이 되어있어야한다. 

magic                                   =  0x46554747
version                                 =  3
tensor_count                            =  291
metadata_kv_count                       =  16
general.architecture                    =  llama
general.name                            =  LLaMA
llama.context_length                    =  2048
llama.embedding_length                  =  4096
llama.block_count                       =  32
llama.feed_forward_length               =  11008
llama.rope.dimension_count              =  128
llama.attention.head_count              =  32
llama.attention.head_count_kv           =  32
llama.attention.layer_norm_rms_epsilon  =  9.999999974752427e-07
general.file_type                       =  10
tokenizer.ggml.model                    =  llama
tokenizer.ggml.tokens                   =  ['<unk>', '<s>', '</s>', '<0x00>', '<0x01>', '<...
tokenizer.ggml.scores                   =  [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0...
tokenizer.ggml.token_type               =  [2, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6...
general.quantization_version            =  2

 

 

이대로 끝내긴 아쉬우니, GGUF 파일 구조를 자세히 알아보자.

GGUF 스펙의 문서를 참고하여 https://github.com/ggerganov/ggml/blob/master/docs/gguf.md 

GGUF 파일 구조를 텍스트로 그려보았다. 

 

크게 세 부분으로 나뉜다. 1) Header 2) Tensor Info 3) Tensor Data 

Header에 메타데이터가 저장이된다. Tensor Info와 Tensor Data 부분에 모델의 Weight Tensor 정보가 기록이 된다. 

GGUF - Header

 

 

GGUF - Tensor Info (Tensor Data는 이진수이기에 생략하였다)

 

 

 

 

이만하면 얼추 이해가 된 것 같다. 

 

다음 포스트에는 위 구조대로 실제 GGUF 파일을 파싱해서 출력해보려고한다.

 

2024.02.01 - [분류 전체보기] - GGUF 파일을 까보자

'Develop > Machine Learning' 카테고리의 다른 글

GGUF 파일 정보 출력하기  (3) 2024.02.01