두 포맷, 두 일자리
safetensors는 저장과 학습 프레임워크의 포맷이고, GGUF는 로컬 추론 런타임의 포맷이야. llama.cpp 스타일 엔진과 함께 떠올랐지: 아키텍처 메타데이터, 토크나이저, 양자화된 텐서를 한 파일에 묶어서, 노트북의 단일 로더가 완전 정밀도로는 RAM에 안 들어가는 모델을 돌리게 해 줘. safetensors가 아카이브 마스터라면 GGUF는 휴대용 사본이야 — 그리고 이 두 역할을 혼동하는 곳에서 아카이브의 충실도 실수가 대부분 들어와.
GGUF 파일은 자기 서술적이야: 자기만의 메타데이터 KV 블록(아키텍처, 컨텍스트 파라미터, 정렬 규칙)과 텐서 데이터를 함께 담아. 양자화된 텐서는 평범한 dtype 배열이 아니라 블록 스킴으로 저장돼 — 유명한 Q4_K_M 식 rung들이지, 가중치 그룹이 계산된 스케일 팩터를 공유하는 구조야. 그게 크기 절감의 메커니즘이야: 가중치당 유효 비트를 줄이고, 절약한 예산을 가장 아프지 않은 곳에 쓰도록 보정 항을 설계하는 거지.
사다리를 정직하게 읽기
rung은 마케팅이 아니야. 크기와 충실도 사이의 실제 엔지니어링 트레이드 지점들이야:
- F16/BF16 (16비트) — 기준점. 사실상 마스터의 정밀도. 가장 크고, 변환 원본 대비 무손실이야.
- Q8_0 (유효 ≈8.5비트) — 출력 품질에서 기준점에 아주 가까워. 크기는 대략 절반. 보수적인 rung.
- Q6_K — 많은 런타임이 권장하는 실용적 스폿. 의미 있는 크기 절감에 작은 품질 양보.
- Q5_K_M / Q4_K_M — 로컬 추론의 일꾼 rung. 눈에 띄지만 보통 감수할 만한 저하에 큰 크기 이득, 평범한 하드웨어에 모델을 맞춰 줘.
- Q3 이하, 그리고 작은 -S 변형들 — 전문가 영역. 품질 비용이 케이스바이케이스, 태스크 의존적으로 돼.
정직한 경고 두 개. 첫째, 저하는 태스크 모양이야: 양자화된 모델은 캐주얼한 대화에서 멀쩡히 버티다가, 엣지 케이스 추론이나 코드, 소수 언어에서 측정 가능한 능력을 잃을 수 있어 — 감이 아니라 실제 워크로드를 벤치마크해. 둘째, rung은 합성되지 않아: Q4 파일을 Q8로 변환해도 아무것도 회복 안 돼. 이미 잃은 정보의 더 큰 그릇을 얻을 뿐이야. 사다리의 정보는 아래로만 흘러.
실행 없이 GGUF 검사하기
safetensors처럼 GGUF도 로드 없이 검사 가능해: 헤더와 메타데이터가 읽히고, 텐서 인벤토리(텐서별 양자화 타입 포함)가 거기 있어. 런타임들이 정확히 이걸 위한 검사 명령을 배포해 — 파일을 믿기 전에 하나 돌리고, 파일명이 주장하는 정밀도와 파일이 실제로 담은 정밀도를 비교해 봐.