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가 만들었어요.

TEXT
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.cppLLM 추론 (LLaMA 등)
stable-diffusion.cpp이미지 생성

모두 같은 패턴이에요. Python/PyTorch 모델을 ggml 계열 포맷(whisper.cpp는 ggml .bin, llama.cpp는 GGUF)으로 변환하고, C/C++로 추론해요.

직접 빌드해 보면

whisper-sys/build.rs에서 ggml 소스를 직접 컴파일하고 있어요.

Rust
// 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 소스도 함께 컴파일해야 해요.