tracks
양자화는 소비자용 GPU에서 대규모 언어 모델을 실행하는 가장 실용적인 방법 중 하나입니다. 많은 VRAM이 필요한 고정밀 가중치 대신, NVIDIA RTX 4090과 같은 GPU에 적합한 압축된 4비트 모델을 사용할 수 있습니다. Google의 Gemma 모델은 강력한 오픈 AI를 로컬에서 더 쉽게 실행하려는 이러한 흐름의 일환입니다.
이 튜토리얼에서는 Gemma 4 12B를 llama.cpp로 로컬 실행하고, 베이스 버전과 양자화 인지 학습(QAT)으로 파인튜닝된 다른 버전을 비교합니다.
Google의 모델에 대한 다른 튜토리얼도 함께 읽어 보세요. Gemma 4와 Ollama로 AI 에이전트 만들기, Gemma 4 파인튜닝 방법.
양자화란 무엇인가요?
양자화는 모델 가중치의 정밀도를 낮춰 압축하는 기법입니다.
대규모 언어 모델은 품질을 잘 보존하지만 메모리를 많이 요구하는 BF16 또는 FP16 같은 고정밀 형식으로 저장되는 경우가 일반적입니다. 양자화는 이러한 가중치를 8비트나 4비트와 같은 더 낮은 비트 폭으로 변환하여, 모델이 VRAM을 덜 사용하고 로컬 실행이 쉬워지도록 합니다. Hugging Face에 따르면 8비트 양자화는 메모리 사용량을 대략 절반으로 줄일 수 있고, 4비트는 그보다 더 줄일 수 있습니다.
대신 낮은 정밀도는 출력 품질을 떨어뜨릴 수 있으며, 특히 모델이 양자화를 고려해 최적화되지 않은 경우에 그렇습니다. 간단히 말해, BF16과 FP16은 보통 최고의 품질을 제공하지만 메모리를 더 사용합니다. 8비트 모델은 더 작으면서도 대체로 높은 품질을 유지하며, 4비트 모델은 훨씬 더 작지만 약간의 정확도나 안정성을 잃을 수 있습니다.
로컬 추론에서는 이 트레이드오프가 종종 가치가 있습니다. 더 큰 모델을 비싼 데이터센터 하드웨어 대신 소비자용 GPU에서 실행할 수 있게 해주기 때문입니다.
양자화 인지 학습(QAT)이란?
양자화 인지 학습(QAT)은 훈련 또는 파인튜닝 과정에서 저정밀 동작을 시뮬레이션하는 기법을 말합니다. 이를 통해 모델은 양자화 이후에도 더 안정적으로 동작할 수 있으며, 낮은 비트 폭에서의 로컬 추론 성능을 개선할 수 있습니다.
QAT의 차별점은 무엇인가요?
일반적인 방식인 사후 학습 양자화는 모델을 모두 학습한 뒤에 압축합니다. 간단하고 실용적이지만, 모델이 저정밀 가중치를 다루도록 학습되지 않았기 때문에 품질이 일부 저하될 수 있습니다.
Google AI Edge 문서에 따르면, 사후 학습 양자화는 모델 크기를 줄이고 지연 시간을 개선하는 변환 단계이며, 보통 정확도 손실이 적습니다. 다만 최종 품질은 모델과 양자화 수준에 따라 달라질 수 있습니다.
양자화 인지 학습은 서로 다른 접근을 취합니다. 학습이 끝난 뒤에만 양자화하는 대신, QAT는 학습 또는 파인튜닝 중에 저정밀 동작을 시뮬레이션합니다. 이를 통해 모델이 나중에 더 작은 형식으로 변환되더라도 안정적으로 동작하는 법을 학습합니다. 이 방식은 모델을 압축할 때 품질 손실을 최소화합니다.

이 때문에 Gemma 4 QAT는 로컬 AI에 유용합니다. 애초에 양자화를 염두에 두고 만들어졌기 때문에, 메모리를 적게 사용하면서도 원래 모델의 품질을 더 많이 보존할 수 있습니다. 소비자용 GPU에서 모델을 실행하는 사용자에게는 저비트 안정성 향상, VRAM 사용량 감소, 더 실용적인 로컬 추론으로 이어질 수 있습니다.
1단계: 의존성 설치 및 llama.cpp 빌드
모델을 다운로드하기 전에 로컬 런타임을 먼저 준비해야 합니다. 이 튜토리얼은 NVIDIA RTX 4090 GPU와 24 GB VRAM이 장착된 머신에서 테스트했습니다. 추론 런타임으로 llama.cpp, 모델 형식으로 GGUF, 양자화 모델 파일로 UD-Q4_K_XL을 사용합니다.
테스트 환경:
- GPU: NVIDIA RTX 4090
- VRAM: 24 GB
- 런타임: llama.cpp
- 모델 형식: GGUF
- 양자화: UD-Q4_K_XL
다음 두 가지 Unsloth GGUF 모델을 비교합니다:
- unsloth/gemma-4-12B-it-GGUF
- unsloth/gemma-4-12B-it-qat-GGUF
먼저 GPU가 사용 가능한지 확인합니다.
nvidia-smi

다음으로 llama.cpp를 빌드하는 데 필요한 시스템 패키지를 설치합니다.
apt-get update
apt-get install pciutils build-essential cmake curl libcurl4-openssl-dev -y
공식 llama.cpp 리포지토리를 클론합니다.
git clone https://github.com/ggml-org/llama.cpp
이제 CUDA 지원을 활성화하여 llama.cpp를 빌드합니다. 이렇게 하면 모델 레이어를 CPU만이 아니라 GPU에서도 실행할 수 있습니다.
cmake llama.cpp -B llama.cpp/build \
-DBUILD_SHARED_LIBS=OFF \
-DGGML_CUDA=ON
필요한 바이너리를 컴파일합니다.
cmake --build llama.cpp/build \
--config Release \
-j \
--clean-first \
--target llama-cli llama-mtmd-cli llama-server llama-gguf-split

빌드가 끝나면 우리가 사용할 주요 바이너리는 llama-server입니다. 이를 통해 GGUF 모델을 로컬에서 실행하고, curl로 질의할 수 있는 OpenAI 호환 API 엔드포인트를 노출합니다.
2단계: Gemma 4 12B 일반/ QAT 모델 다운로드
이제 llama.cpp 준비가 끝났으므로, Hugging Face에서 Gemma 4 12B의 두 가지 변형을 다운로드합니다. GGUF 형식의 일반 지시문 튜닝 모델과 QAT 버전을 받겠습니다.
먼저 더 빠른 다운로드를 위해 Hugging Face Hub CLI를 설치합니다.
pip install -U "huggingface_hub[hf_xet]" hf-xet hf_transfer
고성능 Xet 다운로드를 활성화합니다.
export HF_XET_HIGH_PERFORMANCE=1
GGUF 형식의 일반 Gemma 4 12B 지시문 모델을 다운로드합니다.
hf download unsloth/gemma-4-12B-it-GGUF \
--local-dir models/gemma-4-12B-it-GGUF \
--include "*mmproj-BF16*" \
--include "*UD-Q4_K_XL*"
다음으로 같은 양자화 형식을 사용한 QAT 버전을 다운로드합니다.
hf download unsloth/gemma-4-12B-it-qat-GGUF \
--local-dir models/gemma-4-12B-it-qat-GGUF \
--include "*mmproj-BF16*" \
--include "*UD-Q4_K_XL*"
--include 플래그는 전체 리포지토리를 받는 대신, 이 튜토리얼에 필요한 파일만 다운로드하도록 보장합니다. 여기서는 UD-Q4_K_XL GGUF 모델 파일과 모델 패키지에서 사용하는 mmproj-BF16 파일을 다운로드합니다.
다운로드가 끝나면 두 모델 폴더가 존재하는지 확인하세요.
ls models
예상 출력:
gemma-4-12B-it-GGUF
gemma-4-12B-it-qat-GGUF
이 시점에서 일반 모델과 QAT 모델이 모두 로컬에 준비되었으며, llama-server로 제공을 시작할 수 있습니다.
3단계: 비 QAT 모델을 llama-server로 실행
먼저 일반 Gemma 4 12B 지시문 모델을 실행합니다. 이는 동일한 설정으로 이후 QAT 버전과 비교하기 위한 기준선을 제공합니다.
비 QAT 모델을 llama-server로 시작합니다.
./llama.cpp/llama-server \
-m models/gemma-4-12B-it-GGUF/*UD-Q4_K_XL*.gguf \
--host 0.0.0.0 \
--port 8001 \
--ctx-size 8192 \
--n-gpu-layers 99 \
--temp 1.0 \
--top-p 0.95 \
--top-k 64

이 명령은 http://localhost:8001에서 로컬 OpenAI 호환 서버를 시작합니다.
다른 터미널을 열고 로컬 서버에 요청을 보냅니다.
time curl http://localhost:8001/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gemma-4-12B-it",
"messages": [
{
"role": "system",
"content": "You are a helpful local AI assistant."
},
{
"role": "user",
"content": "Explain why quantization-aware training is useful for running LLMs on consumer GPUs."
}
],
"temperature": 1.0,
"top_p": 0.95,
"max_tokens": 512
}'
이 명령에서는 OpenAI 호환 API 형식을 따르는 로컬 /v1/chat/completions 엔드포인트를 사용합니다. 프롬프트는 모델에 양자화 인지 학습을 설명하도록 요청하며, 두 모델 변형이 동일한 출력 길이로 테스트되도록 max_tokens를 512로 설정했습니다.
RTX 4090 테스트에서 비 QAT 모델은 다음과 같은 타이밍 결과를 보였습니다.
- 프롬프트 토큰: 40
- 완료 토큰: 512
- 프롬프트 속도: 510.22 tokens/sec
- 생성 속도: 94.65 tokens/sec
- 총 시간: 5.516 sec
GPU 메모리 사용량:
9247 MiB / 24564 MiB
이는 일반 Gemma 4 12B 모델의 기준 성능을 제공합니다. 다음 단계에서는 동일한 구성으로 QAT 버전을 실행하고 결과를 비교합니다.
4단계: QAT 모델 실행 및 테스트
이제 동일한 llama-server 설정으로 Gemma 4 12B의 QAT 버전을 실행합니다. 두 명령이 같은 포트를 사용하므로, 시작하기 전에 이전 비 QAT 서버를 반드시 중지하세요.
QAT 모델을 시작합니다.
./llama.cpp/llama-server \
-m models/gemma-4-12B-it-qat-GGUF/*UD-Q4_K_XL*.gguf \
--host 0.0.0.0 \
--port 8001 \
--ctx-size 8192 \
--n-gpu-layers 99 \
--temp 1.0 \
--top-p 0.95 \
--top-k 64
이렇게 하면 동일한 로컬 OpenAI 호환 엔드포인트 http://localhost:8001에서 QAT 모델이 시작됩니다.

이제 동일한 테스트 프롬프트를 QAT 모델에 전송합니다.
time curl http://localhost:8001/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "gemma-4-12B-it-qat",
"messages": [
{
"role": "system",
"content": "You are a helpful local AI assistant."
},
{
"role": "user",
"content": "Explain why quantization-aware training is useful for running LLMs on consumer GPUs."
}
],
"temperature": 1.0,
"top_p": 0.95,
"max_tokens": 512
}'
RTX 4090 테스트에서 QAT 모델은 다음과 같은 타이밍 결과를 보였습니다.
- 프롬프트 토큰: 40
- 완료 토큰: 512
- 프롬프트 속도: 593.93 tokens/sec
- 생성 속도: 101.65 tokens/sec
- 총 시간: 5.114 sec
GPU 메모리 사용량:
8627 MiB / 24564 MiB
로컬 서버 URL(http://localhost:8001)을 복사해 브라우저에 붙여넣을 수도 있습니다.

이렇게 하면 내장된 llama.cpp 웹 UI가 열리며, 로컬 모델을 테스트할 수 있는 ChatGPT 유사 인터페이스를 제공합니다. 브라우저에서 QAT 모델과 직접 대화하고, 프롬프트를 실험하며, 일상적인 로컬 AI 어시스턴트로 사용할 수 있습니다.
QAT vs 비 QAT 결과 비교
동일한 프롬프트와 서버 설정으로 두 모델을 테스트한 후, RTX 4090에서 성능을 직접 비교할 수 있습니다.
|
지표 |
Gemma 4 12B 비 QAT |
Gemma 4 12B QAT |
|
양자화 |
UD-Q4_K_XL |
UD-Q4_K_XL |
|
컨텍스트 크기 |
8192 |
8192 |
|
프롬프트 토큰 |
40 |
40 |
|
완료 토큰 |
512 |
512 |
|
프롬프트 속도 |
510.22 tokens/sec |
593.93 tokens/sec |
|
생성 속도 |
94.65 tokens/sec |
101.65 tokens/sec |
|
총 시간 |
5.516 sec |
5.114 sec |
|
VRAM 사용량 |
9247 MiB |
8627 MiB |
이 런에서 QAT 모델은 일반 비 QAT 모델보다 빠르고 가벼웠습니다. VRAM을 620 MiB 적게 사용하여 메모리 사용량을 약 6.7% 줄였습니다. 대형 모델을 소비자용 GPU에서 실행할 때는 VRAM 절감이 매우 중요하므로 로컬 추론에 유용합니다.
QAT 모델은 토큰 생성 속도도 더 빨랐습니다. 94.65 tokens/sec에서 101.65 tokens/sec로 개선되어, 생성 속도가 약 7.4% 증가했고, 총 시간은 5.516초에서 5.114초로 줄었습니다.
일상적인 사용에서 QAT 모델은 더 매끄럽고 반응성이 좋게 느껴졌습니다. 응답 품질도 이 테스트에서는 더 안정적으로 보였습니다. 이것이 QAT의 핵심 이유입니다. 저비트 양자화에서도 품질 손실을 줄이면서, 압축 모델의 메모리 및 속도 이점을 그대로 유지하도록 돕기 때문입니다.
마무리
Google은 로컬 AI 커뮤니티를 위해 놀라운 작업을 이어가고 있습니다. Gemma 4 같은 모델과 QAT 같은 기법 덕분에 강력한 AI 모델을 완전히 오프라인으로, 심지어 소비자용 하드웨어에서도 로컬로 실행하려는 꿈이 현실이 되고 있습니다.
가장 흥미로운 점은 단순히 모델 크기를 줄이는 문제가 아니라는 것입니다. QAT를 통해 우리는 모델을 맞추기 위해 품질을 희생하는 것이 아니라, 저비트 형식에서 더 잘 동작하도록 설계된 모델을 얻고 있습니다. 이번 테스트에서 QAT 모델은 비 QAT 버전보다 더 빠르고, 더 가벼우며, 사용감도 더 부드러웠습니다.
이제 모델의 MTP 버전을 테스트해 보는 것이 기대됩니다. 속도가 2배까지 늘어날 수 있어, 워크플로의 더 많은 부분을 로컬 AI로 전환하기가 훨씬 쉬워질 것입니다. 모델을 로컬에서 실행하고, OpenCode 같은 도구와 연결해, 개인 로컬 어시스턴트로 프로젝트 파일을 직접 편집하는 작업을 시작할 수 있을 것입니다.
이 새로운 로컬 AI의 물결은 우리가 AI 시스템을 사용하는 방식을 바꾸고 있습니다. 텍스트, 이미지, 비디오 입력을 아우르는 멀티모달 워크플로처럼, 예전에는 대규모 클라우드 환경이 필요했던 작업들이 점차 로컬 머신에서도 가능해지고 있습니다. 프라이버시, 속도, 통제를 중시하는 개발자, 연구자, 빌더에게 매우 고무적인 방향입니다.