TL;DR
이 글은 llama-server에서 로컬 LLM의 실제 context 한계와 실행 안정성을 측정하는 ctx-cliff 테스트를 소개합니다. GGML_CUDA_ENABLE_UNIFIED_MEMORY=1은 4 KB 또는 2 MB 페이지 단위의 CUDA 메모리 할당으로 VRAM 단편화에 따른 OOM을 줄이지만, RAM 오프로드로 wall 시간이 늘어날 수 있습니다. 기준 모델은 107,265 context까지 OK를 유지했지만, 같은 파라미터의 Thireus 모델은 ANOMALY와 잦은 STOP을 기록했고 KV cache 형식을 5_0/4_1로 바꿔도 약 107k context 부근의 VRAM 절벽은 사라지지 않았습니다. 따라서 prefill·decode 속도뿐 아니라 wall 시간, 생성 길이, 빈 응답과 비정상 속도를 함께 확인해야 실제 사용 가능한 모델과 설정을 가릴 수 있습니다.
실용적 조언
- llama-server에서 특정 모델이 실제로 사용할 수 있는 context 길이를 확인하려면 ctx-cliff.py처럼 context 크기를 일정 간격으로 늘리며 측정하는 방식이 유효합니다. prefill과 decode만 보지 말고 wall 시간, STOP 발생 지점, 빈 응답, ANOMALY를 함께 기록해야 VRAM 오프로드와 재처리로 인한 성능 저하를 구분할 수 있습니다. 글의 실행 예시는 2,000토큰대부터 109,000토큰까지 2,000토큰 간격으로 테스트하고 n-predict를 512로 설정했습니다.
- NVIDIA GPU에서 VRAM 할당 실패를 줄이려면 GGML_CUDA_ENABLE_UNIFIED_MEMORY=1을 적용한 결과와 적용하지 않은 결과를 비교할 수 있습니다. 이 설정은 작은 물리 페이지를 활용해 메모리 단편화에 대응하지만, 부족한 VRAM을 RAM으로 넘겨 wall 시간이 크게 늘어날 수 있습니다. 따라서 최대 context 값만 확보하는 대신, 처리 시간과 생성 안정성이 유지되는 지점을 실제 사용 한계로 삼아야 합니다.
섹션별 상세
용어 해설
- 통합 메모리(Unified Memory)
- — Unified Memory는 GPU와 CPU가 공유하는 주소 공간을 통해 메모리를 관리하는 방식입니다. 이 글에서는 GGML_CUDA_ENABLE_UNIFIED_MEMORY=1 설정이 cudaMallocManaged를 사용하게 하며, VRAM의 작은 빈 공간을 페이지 단위로 묶어 할당 실패를 줄이는 역할로 설명됩니다.
- VRAM 오프로드(VRAM Offload)
- — VRAM 오프로드는 GPU 메모리가 부족할 때 모델 데이터나 KV cache 일부를 시스템 RAM으로 이동하는 처리입니다. VRAM 용량 제약을 넘길 수 있지만 GPU와 RAM 사이의 이동이 발생해 처리 시간이 급증할 수 있으므로, 실제 사용 가능한 context 길이를 별도로 측정해야 합니다.
- KV 캐시(KV Cache)
- — KV Cache는 Transformer가 이전 토큰의 key와 value를 저장해 긴 대화에서 이미 계산한 어텐션 결과를 재사용하는 메모리 구조입니다. 글에서는 q4_0와 5_0/4_1 형식을 비교했지만, 후자의 변경만으로 VRAM 부족 지점이나 전체 성능 문제가 해소되지는 않았습니다.
- 컨텍스트 윈도(Context Window)
- — Context Window는 모델이 한 요청에서 처리할 수 있는 입력과 생성 토큰의 범위입니다. 이 테스트는 context 길이를 2,000토큰대부터 107,000토큰대까지 늘리면서 prefill, decode, wall 시간을 측정해 VRAM 한계와 장문 처리 안정성을 확인합니다.
- 양자화(Quantization)
- — Quantization은 모델 가중치나 KV cache를 낮은 비트 형식으로 저장해 메모리 사용량을 줄이는 기법입니다. 글에서는 비슷한 PPL과 동일한 파라미터를 가진 GGUF 모델을 비교하고, 비정상적으로 빠른 출력이나 빈 응답이 반복되면 양자화가 손상됐을 가능성이 있다고 판단합니다.
코드 예제
llama-server \
-m "$MODEL_PATH" \
-a Qwen3.6-27B \
--ctx-size 110000 \
--n-gpu-layers 99 \
--cache-type-k q4_0 \
--cache-type-v q4_0 \
--batch-size 512 \
--ubatch-size 128 \
--flash-attn on \
--host 0.0.0.0 \
--port 8081 \
--reasoning on \
--reasoning-format none \
--reasoning-budget 32000 \
-t 8 \
-tb 8 \
--parallel 1 \
--metrics \
--merge-qkv \
-khad \
-vhad \
--chat-template-kwargs '{"preserve_thinking": true, "reasoning_effort": "medium"}' \
--defrag-thold 0.1 \
--jinja \
--cont-batching \
--temp 1.0 \
--top-k 20 \
--min-p 0.00 \
--top-p 0.95 \
--presence-penalty 0.0 \
--repeat-last-n 512 \
--repeat-penalty 1.00110,000토큰 context와 GPU 레이어, KV cache 형식, reasoning, 배치 크기, 연속 배칭을 지정해 llama-server의 장문 처리 한계를 측정하는 실행 설정입니다.
언급된 도구
모델, GPU 레이어 수, KV cache, batch 크기, reasoning 및 연속 배칭을 설정해 로컬 LLM을 실행하는 서버입니다.
GGUF 모델을 생성하는 도구 모음으로, 글에서는 동일한 파라미터를 가진 비교 모델과 더 작은 MTP 모델을 만드는 데 사용됐습니다.
언급된 리소스
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.