본문 바로가기
C.W.K.
Stream
Lesson 06 of 06 · published

MLX 형식과 GGUF — 언제 무엇을 고르나

~12 min · gguf, format-comparison, interop

Level 0호기심
0 XP0/51 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

같은 목적, 다른 배경

llama.cpp나 Ollama를 썼다면 가중치, 설정, 토크나이저, 정보를 바이너리 하나에 담은 GGUF를 봤을 거야. mlx-lm은 레슨 1에서 본 표준 파일 폴더인 MLX 형식을 써. 둘 다 양자화한 LLM을 추론할 수 있게 배포하지만 선택의 기준은 배포 장소야.

형식의 모양

GGUF는 모든 것을 담은 바이너리 하나야. llama.cpp의 CPU 세계에서 자라 여러 운영체제의 CPU와 GPU 추론을 겨냥해. 파일 하나를 복사해 실행하기 쉬운 대신 내용을 보거나 바꾸려면 전용 도구가 필요해. llama.cpp, Ollama, LM Studio 생태계에 잘 맞아.

MLX 형식은 safetensors, JSON 설정, 토크나이저를 나눈 폴더야. Apple Silicon의 통합 메모리에 맞아 파일을 예상 메모리 배치에 곧바로 연결하므로 불러올 때 번역이 필요 없어. 여러 파일이라 배포는 조금 번거롭지만 편집기로 열고 바꾸기 쉬워.

선택표

  • Apple 전용 생태계 — mlx-lm, mlx-vlm, mlx-audio, MLX Swift, v0.19 이후 Mac용 Ollama라면 MLX 형식이야. 변환 비용 없이 표준 설정을 직접 읽어.
  • Mac, Linux, Windows가 섞인 팀 — GGUF가 좋아. 파일 하나가 어느 플랫폼의 llama.cpp와 Ollama에서도 돌아.
  • 파인튜닝하거나 수정할 모델 — MLX 형식이 좋아. 층 교체, 설정 수정, 트랙 5의 어댑터 결합이 쉬워.
  • 아주 작은 칩과 엄격한 메모리 — GGUF가 CPU용 극저비트 양자화에서 역사적으로 조금 앞섰어. 격차는 줄고 있고 Mac의 GPU 경로에서는 MLX가 유리해.
  • Mac의 Ollama — 둘 다 되지만 v0.19 이후 MLX 위에서 동작하므로 MLX 형식이 기본 경로고 GGUF는 이전 방식으로 남아 있어.

형식 사이를 왕복하지 마

MLX와 GGUF 사이 변환은 가능하지만 한 줄 명령이 아니고 보통 Hugging Face transformers 표현을 거치는 중간 도구가 필요해. 원하는 형식을 먼저 정하고 원본 PyTorch 모델에서 직접 변환하는 편이 깨끗해. 형식 사이 변환은 이미 한쪽만 있는데 다른 쪽이 꼭 필요한 예외에 남겨둬.

Mac 전용이라면 고민도 끝이야

이 퀘스트처럼 Apple Silicon에서만 작업한다면 MLX 형식을 기본으로 골라. 다른 운영체제에 배포하지 않는다면 GGUF를 고민할 이유가 없어. 이질적인 팀이나 llama.cpp 기반 흐름처럼 GGUF가 맞는 상황만 알아보면 충분해.

Code

디스크에서 형식 차이 알아보기·bash
# MLX-format model: directory of standard files
ls ~/.cache/huggingface/hub/models--mlx-community--Llama-3.2-1B-Instruct-4bit/snapshots/*/
# config.json  model.safetensors  tokenizer.json  tokenizer_config.json  ...

# GGUF model: single binary file (path varies by uploader)
find ~/.cache/huggingface/hub -name "*.gguf" 2>/dev/null | head -3
# /Users/.../models--Qwen--Qwen2-0.5B-Instruct-GGUF/snapshots/.../qwen2-0_5b-instruct-q8_0.gguf
가중치를 불러오지 않고 GGUF 파일 메타데이터 살피기·python
# Requires `pip install gguf` — it's a small package separate from llama.cpp.
# (Don't install in your `mlx` env unless you want it; this is illustrative.)
from gguf import GGUFReader

# Path to any .gguf file you have
path = "/path/to/some-model.gguf"
reader = GGUFReader(path)

print(f"Architecture: {reader.fields.get('general.architecture').contents()}")
print(f"Quantization: {reader.fields.get('general.file_type').contents()}")
print(f"Tensors:      {len(reader.tensors)}")

External links

Exercise

GGUF 모델이 있다면 같은 모델의 GGUF와 MLX 버전을 나란히 살펴봐. 없다면 Hugging Face에서 두 형식이 모두 있는 작은 모델을 골라. 바이너리 하나와 파일 폴더라는 구조, 보통 약 10% 안에서 비슷한 디스크 크기, Apple Silicon에서 mmap하는 MLX가 흔히 더 빠른 불러오기 시간을 비교해. 평소 작업에는 어느 형식이 더 자연스러운지 두 문장으로 적어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.