sLLM을 로컬에서 테스트 해볼 때, 사용해볼 수 있는 도구들이 꽤 다양하단 걸 이번 기회에 알게 되었다. (ollama, llama-cpp, lm studio,...)
기존에 ollama를 사용해 embedding model을 사용했던터라, 기존에 설치 되어있던 ollama를 그대로 이번 테스트에 사용해보려고 했는데, 처리 속도가 생각보다 너무 느렸기에 대안이 필요했다!
STT로 전사된 텍스트를 LLM을 사용해 후처리로 실시간 수정하는 것을 목표로 , 어느 sLLM 모델을 사용해야할지 찾아보는 테스트였기 때문에, 추론 비용(속도, 메모리 사용량 등)이 중요한 이슈였다.
ollama가 llama.cpp를 래핑한 도구이기에 같은 모델을 로컬에서 돌리더라도, llama.cpp는 ollama보다 추론이 훨씬 빠르다는 글을 보고 llama.cpp를 사용해 테스트를 진행하게 되었다.
어떻게 llama.cpp를 사용해 sLLM을 로컬에서 테스트를 해보았는지 그 과정을 기록한다.
llama.cpp? llama.cpp-python?
llama.cpp를 python 라이브러리로 구현해놓은 llama.cpp-python도 존재한다.
llama.cpp: https://github.com/ggml-org/llama.cppllama.cpp-python: https://github.com/abetlen/llama-cpp-python
python을 주로 사용하는 사용자라면, 라이브러리 import로 간단히 llama.cpp-python을 불러와서 sLLM을 로드해 쓰는 것이 편하고 익숙한 방법일 수 있다. 나도 비슷하게 llama.cpp-python을 사용해 테스트를 하려 했으나, 결국엔 llama-cpp로 넘어오게 되었다.
- 왜냐하면..? llama-cpp-python에서는 모델 업데이트가 늦는 것인지, 비교적 최신 모델을 로드하려 하면 모델 구조 업데이트가 되지 않아 로드할 수 없다는 오류가 발생했다. (e.g.
exaone4) - 그러나 llama-cpp는 이런 문제 없이 새로운 LLM 모델들에 대한 업데이트가 빠르게 되어 있었으므로, llama.cpp-python이 아니라, llama-cpp를 최종적으로 사용하게 되었다.
llama.cpp는 그럼 어떻게 다운로드 받는데?
내가 사용한 PC는 Window OS / GPU RTX 3060 / CUDA12.4 였으므로, 이 조건에 맞는 llama.cpp를 사용해야 했다.
갖고 있는 GPU를 사용해야 했는데,,,, 어떻게 설치해야하는지 설치법을 올린 블로그들을 전전하면서 시키는대로 하니까 내 PC에서는 설치가 안되는거다!?!!!
(나 빼고 다 그러고 있겠지만..) 공식 github부터 살펴보길 바란다. . 익숙한 한국어로 어떻게 사용하는지 찾아봐야지~ 하며 요행을 바라다가 빙빙 돌아갔다.
llama.cpp github를 들어가보면 너무 친절하게도 Pre-built Binary 파일들이 있다.
바로 소스 코드를 직접 빌드하지 않아도 바로 실행할 수 있게 미리 컴파일해 둔 실행 파일들이다... 친절한 주인장..
여기서 조건에 맞는 zip 파일을 다운로드 받아서 압축 해제후 사용만 하면 된다.
나의 경우는, Windows x64 (CUDA 12) - CUDA 12.4 DLLs 를 다운로드 받아 압축 해제 후 사용했다.
압축 해제 후, 압축 해제 폴더 안에 models 폴더를 만들어서 내가 테스트 해주고 싶은 sLLM 모델의 gguf 버전 모델 파일들을 다운로드 해 두고 사용했다!



llama.cpp를 어떻게 사용했나?
llama-server 사용해 llm 로컬에 서빙하기
모델을 http 서버로 띄워 놓고, 요청하는 식으로 사용했다. 이 때 사용하는게 `llama-server` 이다. 아래 처럼 원하는 모델 파일을 llama-server로 띄워놓고 Python Script에서 서버에 요청을 보내 응답을 받아오는 식으로 사용했다.
llama-server.exe \
-m ".\models\Qwen3-4B-Q4_K_M.gguf" \
-ngl 99 \
-c 4096
| 인자 | 설명 | 추천 값 | 이유 및 결정 기준 |
| -ngl N | GPU 레이어 수 (Number of GPU Layers) | 99 또는 -1 | Qwen3-4B 모델의 레이어 전체를 VRAM (GPU 메모리)에 올려서 실행 속도를 극대화합니다. 99(혹은 -1)는 "가능한 모든 레이어"를 의미합니다. 가장 중요한 성능 인자입니다. |
| -c N | 컨텍스트 크기 (Context Size) | 4096 | Qwen3-4B 모델이 공식적으로 지원하는 최대 컨텍스트 길이는 32K이지만, 이 값을 설정하면 KV 캐시가 그만큼 커지므로 VRAM/RAM 사용량이 증가합니다. 따라서 기본적으로 4096 정도의 크기로 설정해놓고 시작했습니다. |
| -t N | CPU 스레드 수 (Number of Threads) | 8 | 모델의 나머지 계산이나 CPU 영역 처리에 사용할 스레드 수입니다. 일반적으로 시스템의 논리 코어 수의 절반이나 전체 수를 설정합니다. (예: 8코어 CPU라면 8 또는 16) |
| --port N | 서버 포트 번호 | 8080 | 서버가 리스닝할 포트 번호입니다. |
떠있는 llama-server에 요청 보내고 응답 받아오기
from openai import OpenAI
# 1. 서버 설정 (llama-server의 기본 포트 8080 사용)
client = OpenAI(
base_url="http://localhost:8080/v1",
api_key="not-needed" # 로컬 실행 시 인증키는 필요 없으나 형식상 입력
)
# 2. 질문 보내기
# - model: 서버가 로딩 중인 모델명을 자동으로 인식하므로 아무 이름이나 써도 됩니다.
# - max_tokens: 실행 시 설정한 -c 4096 범위 내에서 적절히 조절하세요.
response = client.chat.completions.create(
model="qwen3-4b",
messages=[
{"role": "system", "content": "당신은 친절한 AI 어시스턴트입니다."},
{"role": "user", "content": "오늘 날씨에 어울리는 노래 하나 추천해줘."}
],
temperature=0.7,
max_tokens=1024
)
# 3. 결과 출력
print("AI 답변:", response.choices[0].message.content)
Instruct? Q4? K? M? gguf? 암호같은 LLM 모델명을 알아보자
- 예: Qwen3-4B-Instruct-2507-Q4_K_M.gguf 모델

- Qwen3
- 모델 시리즈 이름
- 4B
- 모델 크기 (뇌 용량)
- B = Billion (십억)
- 4B = 약 40억 개의 파라미터
- 4B는 경량 모델의 축에 속한다.
- Instruct
- 지시를 잘 따르도록 훈련된 버전의 모델
- 2507
- 모델 버전 / 릴리스 시점 (YYMM)
- Q4 / Q2 ~ Q8
- 양자화(압축) 정도
- 원래 모델은 숫자를 아주 정밀하게 기억함 (예: 16비트)
- 그걸 4비트/5비트/8비트 로 간단하게 압축
- 용량 ↓, 속도 ↑, 대신 약간의 성능 손실
- 숫자별 느낌
Q2 아주 작음 품질 많이 손해 Q3 작음 실험용 Q4 ⭐ 균형 가장 많이 씀 Q5 안정적 품질 우선 Q6 거의 원본 메모리 큼 Q8 원본에 매우 가까움 서버급
- K / S / M ← 양자화 방식
- K = K-Quant 양자화 방식
- llama.cpp 계열에서 가장 최신 & 똑똑한 압축
- 레이어별로 중요한 부분은 더 정밀하게 저장
- 같은 Q4라도 품질이 더 좋음
- Q4_K > Q4_S > Q4 (구형)
- M / S 차이 ← 압축 스타일
- S vs M vs L
M Medium 품질/속도 균형 S Small 더 작고 빠름 L Large 품질 우선 (덜 쓰임)
- S vs M vs L
- K = K-Quant 양자화 방식
- 즉, Q4_K_M 란?
- Q4 비트로, K-Quant 방식, 중간 균형 타입
- 용량 ↓ / 속도 ↑ / 품질 손실 최소화
- .gguf 파일 포맷
- llama.cpp, koboldcpp, LM Studio 등에서 쓰는 표준 파일 포맷
- 메타데이터 + 양자화 정보 포함
- 요즘 로컬 LLM 표준
참고
llama.cpp로 gguf 모델 서빙하기
뭣?! GPU 없이도 LLM 서브가 가능하다고? 이거 진짜예요?
velog.io
'LLM' 카테고리의 다른 글
| 느린 LLM을 위한 해법, Speculative Decoding (1) | 2025.05.28 |
|---|