ggml이란?
ggml은 C/C++로 작성된 머신러닝 텐서 연산 라이브러리예요. Georgi Gerganov가 만들었고, 이름도 그의 이니셜(GG)에서 따왔어요.
왜 존재하는가
PyTorch나 TensorFlow 같은 프레임워크는 무거워요. Python 런타임, CUDA 의존성, 수 GB의 라이브러리가 필요해요. ggml은 README에 따르면 설정이 거의 필요 없는, 간단하고 이식성 좋은 텐서 라이브러리를 목표로 해요.
- 외부 의존성 없음 (C/C++)
- SIMD 최적화 (x86의 AVX, ARM의 NEON 등)
- 모델을 양자화(quantization)해서 메모리 사용량을 크게 줄임
- CPU뿐 아니라 GPU 등 여러 백엔드 지원, GPU 없이도 로컬에서 LLM, 음성 모델 등을 실행 가능
whisper.cpp와의 관계
whisper.cpp는 OpenAI Whisper 모델을 ggml 위에서 돌리는 프로젝트예요. 둘 다 Georgi Gerganov가 만들었어요.
OpenAI Whisper (Python/PyTorch)
↓ 모델 변환
ggml 포맷 모델 파일 (.bin)
↓
whisper.cpp (C/C++ 추론 엔진)
└── ggml (텐서 연산 라이브러리)
즉 ggml은 whisper.cpp의 연산 백엔드예요. 행렬 곱셈, 컨볼루션, attention 등 신경망에 필요한 저수준 연산을 맡아요.
ggml 모델 포맷
PyTorch의 .pt 파일은 그대로 쓸 수 없어요. ggml 자체 바이너리 포맷으로 변환해야 해요.
- 모델 가중치를 ggml 텐서 구조로 저장해요
- 16-bit, 8-bit, 4-bit 등으로 양자화할 수 있어요
- 양자화하면 모델 크기가 크게 줄어요 (예: fp16 → 4bit이면 약 1/4)
whisper.cpp의 models/ 디렉토리에 있는 변환 스크립트가 이 작업을 해 줘요. 참고로 llama.cpp는 지금 GGUF라는 별도 파일 포맷을 써요.
ggml 생태계
ggml을 기반으로 한 프로젝트들이에요.
| 프로젝트 | 용도 |
|---|---|
| whisper.cpp | 음성 인식 (Whisper) |
| llama.cpp | LLM 추론 (LLaMA 등) |
| stable-diffusion.cpp | 이미지 생성 |
모두 같은 패턴이에요. Python/PyTorch 모델을 ggml 계열 포맷(whisper.cpp는 ggml .bin, llama.cpp는 GGUF)으로 변환하고, C/C++로 추론해요.
직접 빌드해 보면
whisper-sys/build.rs에서 ggml 소스를 직접 컴파일하고 있어요.
// ggml C 파일 컴파일
cc::Build::new()
.files(&[
"whisper.cpp/ggml/src/ggml.c",
"whisper.cpp/ggml/src/ggml-alloc.c",
"whisper.cpp/ggml/src/ggml-quants.c",
])
.compile("ggml");
// ggml C++ 파일 컴파일
cc::Build::new()
.cpp(true)
.files(&[
"whisper.cpp/ggml/src/ggml-backend.cpp",
// ...
])
.compile("ggml-cpp");
whisper.cpp가 ggml에 의존하기 때문에, whisper.cpp를 빌드하려면 ggml 소스도 함께 컴파일해야 해요.