13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

GPU 없이 로컬 LLM 돌리기 — i5 홈랩 + llama.cpp 실전 (설치부터 첫 구동, 실측 13토큰/초)

“로컬 LLM 돌리려면 그래픽카드부터 사야지” — 대부분 이렇게 알고 계실 겁니다. 그런데 제 홈랩엔 외장 그래픽카드가 없습니다. Intel i5-8500에 내장그래픽(UHD 630)뿐이라 CUDA는 애초에 못 씁니다. 그래서 직접 해봤습니다 — GPU 없이 CPU만으로 로컬 LLM을. 결론부터 숫자로 말하면, 3B 모델이 초당 13.85토큰으로 돌아갑니다. 읽는 속도보다 빠릅니다. 설치부터 첫 구동, 실측까지 그대로 공개합니다.

1. 왜 CPU인가 — GPU 없는 홈랩의 현실

홈랩용 미니 PC나 중고 서버엔 외장 GPU가 없는 경우가 훨씬 많습니다. 전력·발열·가격 때문이죠. 제 환경도 그렇습니다.

  • CPU: Intel i5-8500 (6코어) — AVX2 지원
  • GPU: Intel UHD 630 내장그래픽뿐 → NVIDIA/CUDA 경로 불가

많은 “로컬 LLM 설치” 글이 NVIDIA Driver + CUDA 설치부터 시작하는데, 그래픽카드가 없으면 그 글은 무용지물입니다. 다행히 llama.cpp는 순수 CPU 추론을 제대로 지원하고, 소형 양자화 모델이라면 CPU로도 충분히 쓸 만합니다. 이 글은 정확히 그 경우를 다룹니다.

2. 실제 구성 — LXC 컨테이너로 격리

호스트에 직접 깔지 않고 Proxmox LXC 컨테이너 하나를 새로 만들어 그 안에 구축했습니다. 이유는 단순합니다 — 빌드 도구·모델 파일이 호스트를 어지럽히지 않게 격리하고, 실험이 꼬이면 컨테이너째 버리면 되니까요.

항목 할당 비고
OS Debian 13 (trixie) gcc 14.2 / cmake 3.31
vCPU 4코어 추론 스레드 4개
RAM 8GB 3B 모델(1.8GB) + 여유 충분
디스크 24GB 빌드 + 모델 몇 개

3B 모델은 8GB면 넉넉합니다. 오히려 CPU 추론에서 진짜 자원은 메모리 대역폭이라, 코어를 무작정 늘린다고 비례해서 빨라지지 않습니다(뒤에서 실측).

3. llama.cpp 빌드 — AVX2 네이티브가 핵심

먼저 빌드 도구를 설치합니다.

apt-get update
apt-get install -y build-essential cmake git libcurl4-openssl-dev ccache wget

소스를 받아 빌드합니다. CPU 추론 속도를 좌우하는 건 -DGGML_NATIVE=ON입니다. 이 옵션이 현재 CPU의 명령어 확장(AVX2 등)을 최대한 활용하도록 컴파일해 줍니다. 이걸 빼면 체감 속도가 뚝 떨어집니다.

cd /root
git clone --depth 1 https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build -DGGML_NATIVE=ON -DLLAMA_CURL=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build -j4 --config Release

4코어에서 몇 분이면 끝납니다. 빌드가 끝나면 build/bin/ 아래에 실행 파일이 생깁니다. 우리가 쓸 건 세 개입니다.

  • llama-cli — 실제 대화·생성
  • llama-bench — 성능 측정 전용
  • llama-server — OpenAI 호환 API 서버(다음 편에서 활용)

4. 모델 선택 — 왜 Qwen2.5-3B Q4_K_M인가

CPU·소형 환경에서 한국어까지 쓸 만한 모델로 Qwen2.5-3B-Instruct를 골랐습니다. 파일명 뒤의 Q4_K_M이 중요한데, 이건 양자화(quantization) 방식입니다.

  • 원본 모델은 파라미터를 16비트로 저장 → 3B라도 6GB가 넘습니다.
  • Q4_K_M은 4비트로 압축한 버전 → 같은 모델이 1.8GB로 줄어듭니다.
  • 품질 손실은 체감상 미미하면서 CPU·메모리 부담을 크게 줄여, 홈랩 CPU 추론의 사실상 표준입니다.
mkdir -p /root/models && cd /root/models
wget -O Qwen2.5-3B-Instruct-Q4_K_M.gguf \
  "https://huggingface.co/bartowski/Qwen2.5-3B-Instruct-GGUF/resolve/main/Qwen2.5-3B-Instruct-Q4_K_M.gguf"

5. 첫 구동 — 진짜 한국어가 나온다

바로 물어봤습니다.

./build/bin/llama-cli \
  -m /root/models/Qwen2.5-3B-Instruct-Q4_K_M.gguf \
  -p "홈랩에서 GPU 없이 CPU만으로 로컬 LLM을 돌릴 때의 장점 3가지를 간단히 알려줘." \
  -n 220 -t 4 -st

실제로 나온 답변입니다(가공 없음).

GPU 없이 CPU만으로 로컬 LLM을 실행할 때의 장점은 다음과 같습니다:

1. 비용 절감: GPU가 필요하지 않아 소프트웨어 구동에 필요한 비용을 줄일 수 있습니다.
2. 컴퓨팅 능력: CPU는 보통 GPU보다 더 저렴한 가격과 더 적은 부피를 가지고 있지만, 특정 작업에는 충분한 컴퓨팅 능력을 제공할 수 있습니다.
3. 편리성: CPU가 설치된 컴퓨터를 사용하면, 별도의 GPU 장치 구매나 설치 없이도 로컬 LLM을 실행할 수 있습니다.

마크다운 서식까지 알아서 잡아 줍니다. 3B 소형 모델이라 아주 복잡한 추론은 무리지만, 요약·번역·분류·간단한 글쓰기 같은 실무 자동화용으로는 충분한 품질입니다.

6. 실측 성능 — 초당 몇 토큰?

체감이 아니라 숫자로 재려고 llama-bench를 돌렸습니다.

./build/bin/llama-bench \
  -m /root/models/Qwen2.5-3B-Instruct-Q4_K_M.gguf \
  -t 4 -p 512 -n 128
테스트 속도 의미
pp512 (프롬프트 처리) 58.8 tok/s 입력을 읽어들이는 속도
tg128 (텍스트 생성) 13.85 tok/s 답변을 뱉는 속도

핵심은 생성 속도 13.85 tok/s입니다. 한국어 기준 사람이 눈으로 읽는 속도가 대략 초당 7~10토큰 남짓이니, 읽는 것보다 빠르게 답이 흘러나옵니다. 대화형으로 써도 답답하지 않고, 모델 파일이 1.8GB라 8GB 컨테이너에 메모리도 여유롭습니다. “GPU 없으면 로컬 LLM은 못 쓴다”는 편견이 3B급에서는 사실이 아닙니다.

7. CPU-only의 한계 — 정직하게

  • 큰 모델은 느립니다. 14B·32B급으로 가면 CPU에선 초당 1~3토큰으로 뚝 떨어져 실시간 대화엔 부적합합니다. CPU의 스윗스팟은 3B~8B입니다.
  • 코어 늘린다고 비례하지 않습니다. CPU 추론은 메모리 대역폭에 묶여서, 스레드를 물리 코어 이상으로 올리면 오히려 손해입니다. 코어 수보다 -DGGML_NATIVE=ON 빌드가 더 큰 차이를 냅니다.
  • 진짜 큰 모델·낮은 지연이 필요하면 그때 GPU를 고민하면 됩니다. 하지만 요약·번역·자동화 파이프라인 용도라면 3B CPU로 충분합니다.

다음 편 예고

1편은 “일단 돌린다”였습니다. 다음 편에서는 모델별 실측 비교(Qwen2.5-3B vs Gemma 2 vs Llama 3.2, 속도·한국어 품질)를 다루고, 그다음 편에서는 llama-server로 API를 띄워 n8n·자동화에 로컬 LLM을 연동하는 실전을 정리하겠습니다. GPU 없는 홈랩에서도 충분히 갈 수 있습니다.