llama.cpp — 모든 기기에서 돌아가는 로컬 AI의 심장

llama.cpp — 모든 기기에서 돌아가는 로컬 AI의 심장

Ollama를 깔고 터미널에서 채팅을 하거나, LM Studio의 예쁜 UI 버튼을 누를 때마다 백그라운드에서는 사실 하나의 엔진이 땀을 뻘뻘 흘리며 돌아가고 있다. 바로 llama.cpp다.

2편과 3편에서 다룬 도구들이 "포르쉐의 예쁜 가죽 시트와 핸들"이라면, 4편에서 다룰 llama.cpp"자동차 후드를 열면 보이는 V8 엔진" 그 자체다. 로컬 AI 생태계를 이해하려면 반드시 이 엔진을 알아야 한다.

1. 왜 파이썬(Python)이 아니라 C/C++ 인가?

보통 AI 프로그래밍 하면 Python과 PyTorch를 떠올린다. 실제로 메타(Meta)나 오픈AI 연구원들은 전부 파이썬으로 모델을 만든다. 그런데 이 무거운 파이썬 코드를 내 맥북이나 스마트폰에서 돌리려고 하면 무겁고 느리며 의존성이 심하게 꼬인다.

Georgi Gerganov라는 개발자가 이 파이썬 코드를 의존성(Dependency)이 단 하나도 없는 순수 C/C++ 코드로 밑바닥부터 다시 짜버린 프로젝트가 바로 llama.cpp다.

  • 파이썬 런타임 불필요: 파이썬, 쿠다(CUDA), 파이토치 등 무거운 라이브러리를 깔지 않아도 된다. C++ 컴파일러만 있으면 어디서든 돌아간다.
  • 미친 이식성: 인텔 CPU, 애플 실리콘(M1/M2/M3), 안드로이드 스마트폰, 심지어 라즈베리파이 위에서도 돌아간다.
  • 최적화: 애플의 Metal API, 엔비디아의 CUDA, AMD의 ROCm 등을 네이티브로 직접 호출하여 영혼까지 끌어모은 속도를 낸다.

이 압도적인 이식성 때문에 Ollama나 LM Studio도 내부적으로는 이 엔진을 가져다 포장만 해서 쓰는 것이다.


2. 모델 다이어트의 핵심: GGUF 포맷

llama.cpp 생태계의 또 다른 천재적인 발명품이 바로 GGUF 모델 파일 포맷이다.

텐서와 양자화(Quantization)

1편에서 잠깐 언급했듯, 모델의 가중치(Weight)는 원래 소수점 16자리(FP16) 같은 정밀한 숫자로 저장된다. 이를 4비트(Q4)나 8비트(Q8) 같은 거친 숫자로 깎아내려 용량을 확 줄이는 기술이 양자화다.

GGUF는 이 양자화된 모델 데이터를 하나의 단일 파일(.gguf)로 묶어놓은 규격이다. 옛날에 윈도우에서 프로그램 하나 깔려면 .exe 파일 하나만 더블클릭하면 되듯이, 로컬 AI를 돌리려면 수십 개의 폴더 대신 .gguf 파일 하나만 다운받으면 되게 만든 것이다.


3. llama.cpp 직접 돌려보기 (하드코어 모드)

"엔진 껍데기를 씌운 Ollama가 편한데, 굳이 내가 llama.cpp를 직접 컴파일해서 돌려야 하나요?"

물론 대부분의 사용자는 그럴 필요가 없다. 하지만 극단적인 하드웨어 커스텀이 필요한 상황(예: GPU 메모리가 4GB밖에 없는 구형 노트북에서 모델을 절반만 GPU에 올리고 나머지는 CPU에 올리고 싶을 때)에서는 llama.cpp의 직접 제어가 빛을 발한다.

맥(Apple Silicon)에서 컴파일하고 실행하기

# 1. 저장소 클론
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

# 2. Apple Metal 최적화를 켜고 컴파일 (1분이면 끝난다)
make LLAMA_METAL=1

# 3. 모델 다운로드 (Hugging Face에서 GGUF 파일 다운로드)
wget https://huggingface.co/.../llama-3-8b.Q4_K_M.gguf

# 4. 모델 실행 (터미널 채팅)
./main -m ./llama-3-8b.Q4_K_M.gguf -n 256 --repeat_penalty 1.1 --color -i -r "User:" -f prompts/chat-with-bob.txt

오프로딩(Offloading): 멱살 잡고 모델 돌리기

명령어 뒤에 -ngl (Number of GPU Layers) 옵션을 줄 수 있다. 내 그래픽 카드 VRAM이 모자라서 모델이 안 들어간다면 -ngl 20이라고 주면 된다. 총 40개의 레이어 중 20개만 GPU에 욱여넣고, 남는 20개는 메인보드의 CPU와 RAM에게 강제로 연산을 떠넘기는 기법이다. 속도는 느려지겠지만, 메모리 부족(OOM)으로 뻗지 않고 어떻게든 대답을 뱉어내게 만든다.


📝 정리

  • [x] 순수 C/C++의 위력: 파이썬 환경의 늪에서 벗어나, 어떤 구형/엣지 디바이스에서도 컴파일 한 번으로 AI를 돌리게 만든 혁명적인 프로젝트다.
  • [x] GGUF 포맷: 양자화된 거대 모델을 하나의 압축 파일처럼 깔끔하게 관리하게 해 준 일등 공신.
  • [x] 하드웨어 커스텀: -ngl 옵션을 통한 VRAM과 RAM의 하이브리드 연산(오프로딩)으로 극한의 최적화가 가능하다.

이제 왜 Ollama와 LM Studio가 내부적으로 이 녀석을 쓰는지 이해했을 것이다. 개인과 엣지(Edge) 환경에서는 llama.cpp가 천하통일을 했다.

그런데 한 가지 문제가 남는다. 만약 내 로컬 컴퓨터가 아니라, 동시에 100명이 접속하는 상용 서비스용 서버를 띄워야 한다면 어떨까? llama.cpp는 동시 접속자가 많아지면 줄을 서서 기다리느라 뻗어버린다.

이 "동시 접속(Concurrency)" 문제를 해결하며 엔터프라이즈 시장을 제패한 도구, vLLM을 다음 5편에서 파헤쳐 본다.