블로그로 돌아가기

ggml이란?

C로 작성된 머신러닝 텐서 연산 라이브러리다. Georgi Gerganov가 만들었고, 이름도 그의 이니셜(GG)에서 따왔다.

왜 존재하는가

PyTorch나 TensorFlow 같은 프레임워크는 무겁다. Python 런타임, CUDA 의존성, 수 GB의 라이브러리가 필요하다. ggml은 이런 의존성 없이 순수 C로 CPU에서 추론을 돌리는 것이 목표다.

  • 외부 의존성 없음 (순수 C)
  • CPU 최적화 (AVX, ARM NEON 등 SIMD 활용)
  • 모델을 양자화(quantization)해서 메모리 사용량을 크게 줄임
  • 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/ 디렉토리에 있는 변환 스크립트들이 이 작업을 해준다.

ggml 생태계

ggml을 기반으로 한 프로젝트들:

프로젝트용도
whisper.cpp음성 인식 (Whisper)
llama.cppLLM 추론 (LLaMA 등)
stable-diffusion.cpp이미지 생성

모두 같은 패턴이다: Python/PyTorch 모델을 ggml 포맷으로 변환하고, 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 소스도 함께 컴파일해야 한다. 이것이 todo 6-6에 "ggml-cpu 소스 추가"가 있었던 이유다.

댓글