페이지 목차
이 페이지에서 검색
로컬 LLM
이 페이지에 묻기
로컬 LLM · 현재 차시와 목차 본문에서만 찾아 답합니다. 답을 지어내지 않고 해당하는 대목을 그대로 보여 주며, 여기에 없으면 없다고 알려 드립니다.
생성형 AI가 아니라 이 페이지 본문을 찾아 그대로 보여 주는 방식입니다. 외부로 나가는 요청이 없습니다.
LOCAL · LLM
로컬 LLM
생성 수정
로컬 모델 실행과 GPU·메모리 이해부터 서빙·RAG·도구 호출·업무형 앱 구현까지 차례로 살펴봅니다.
42개 문서 · 5일차 · 35 / 42
34차시 · LLM 모델 선정 및 최적화
지도 위치 : 5일차 · 프로젝트 2단계 · ①하드웨어 + ②모델 파일 층 | 이전: 33차시 프로젝트 요구사항 분석 | 다음: 35차시 LLM Serving 구축 키워드 : 모델 비교, GPU 자원 분석, 양자화 방식 선정 및 적용
이 차시를 다 읽으면
- 2일차(9~16차시)에서 배운 것을 프로젝트 절차 여섯 단계 로 다시 꿸 수 있다.
- 33차시 요구사항(동시 사용자 · 문의 길이)에서 VRAM 예산표 를 계산할 수 있다.
- 후보 모델 2~3개 × 양자화 2개의 비교 매트릭스 를 설계하고, 품질 하한부터 거르는 순서를 지킬 수 있다.
- 운영할 서빙 엔진에 맞는 양자화 형식 을 고를 수 있다(vLLM이면 AWQ · GPTQ · FP8, Ollama면 GGUF).
- 선정 결과를 결정 기록 (맥락 · 결정 · 검토한 대안 · 결과)으로 남길 수 있다.
0. 이 차시의 판별 축
| # | 축 | 왼쪽 (0) | 오른쪽 (1) | 이 축으로 갈리는 것 | 큰 축 (README 5장) |
|---|---|---|---|---|---|
| 1 | 문턱인가 순위인가 | 품질 하한 (통과 / 탈락) | 속도 · 메모리 (높을수록 좋음) | 무엇부터 거르는가 | ⑧ 구문 ↔ 의미 (의미 기준이 먼저) |
| 2 | 정밀도 | 높음 (FP16 · BF16) | 낮음 (8bit · 4bit) | 품질 ↔ 메모리 · 속도의 거래 | 정밀도 (① 파생) |
| 3 | 어디가 느린가 | 계산 병목 (Prefill) | 메모리 병목 (Decode) | 양자화가 어느 쪽을 빠르게 하는가 | 계산 ↔ 메모리 병목 (① 파생) |
| 4 | 어느 엔진의 형식인가 | GGUF (Ollama · llama.cpp) | AWQ · GPTQ · FP8 (vLLM) | 모델 파일 ↔ 엔진의 짝 | 큰 축이 아니라 층의 짝 — README 4장의 ③ 엔진 층이 ② 모델 파일 층의 형식을 정한다 |
앞에서 이어집니다 — 2일차는 두 문장에서 출발했습니다. "숫자를 외우지 말고 계산식 을 외우세요"(9차시, README 7장 문장 1), 그리고 "양자화는 메모리 · 속도를 얻고 품질을 조금 내주는 거래 다"(10차시). 2일차는 그 두 문장을 계산과 측정 으로 펼쳤고, README 7장의 문장 2 — "먼저 내 업무에 충분한 품질을 평가셋으로 정하고, 나머지를 최적화한다" — 로 닫았습니다. 34차시는 그 문장을 내 프로젝트에 한 번 실행 하는 시간입니다.
1. 2일차를 프로젝트 절차로 회수하기
1.1 여섯 단계 ⭐
| 단계 | 하는 일 | 회수하는 앞 차시 | 이 단계의 산출물 |
|---|---|---|---|
| ① 예산 | 33차시 요구에서 VRAM 예산을 계산 | 9차시 (KV 캐시 계산) | VRAM 예산표 (2절) |
| ② 후보 | 장비에 들어갈 후보 2~3개를 고름 | 4 · 6 · 16차시 | 후보 목록 + 라이선스 확인 |
| ③ 양자화 | 후보마다 양자화 2개를 정함 | 10 · 11 · 12차시 | 매트릭스의 행 (3절) |
| ④ 품질 문턱 | 평가셋으로 품질 하한을 넘는지 먼저 | 6차시, 33차시 평가셋 | 통과 / 탈락 표시 |
| ⑤ 성능 비교 | 통과한 것만 메모리 · TTFT · TPS 측정 | 14 · 15차시 | 매트릭스 완성 |
| ⑥ 결정 | 하나를 고르고 이유를 남김 | 16차시 | 결정 기록 (5절) |
⚠️ ④와 ⑤의 순서가 이 차시의 핵심입니다. 빠르고 가벼운 모델이 분류를 틀리면, 그 속도는 틀린 답을 빨리 내는 속도 입니다.
1.2 왜 34차시가 35차시보다 먼저인가
35차시의 vllm serve 명령에 들어갈 옵션 — 모델 이름, --max-model-len, --quantization, --kv-cache-dtype — 은 전부 34차시의 결정에서 나옵니다. 35차시에서 옵션마다 "왜 이 값인가?"를 물으면, 답은 이 차시의 예산표와 결정 기록에 있어야 합니다.
2. GPU 자원 분석 — VRAM 예산표
2.1 식 — README 7장 문장 1
필요한 VRAM ≈ 모델 가중치 + KV 캐시(요청당 토큰 수 × 동시 요청 수) + 오버헤드(1~2GB 이상)
앞에서 배운 9차시의 식입니다. 33차시 요구사항에서 두 숫자 를 가져옵니다.
| 33차시에서 가져올 것 | 문의봇 | 어디서 확인했나 |
|---|---|---|
| 동시 요청 수 | 10 (상담원 10명) | 시나리오 한 장 |
| 요청당 토큰 수 | 시스템 프롬프트 + 예시 + 메일 + 출력 | 평가셋의 가장 긴 메일 을 토크나이저로 세어 봄 (2차시 실습) |
2.2 KV 캐시 — 토큰 하나에 얼마인가
KV 캐시 / 토큰 = 2(K, V) × 층 수 × KV 헤드 수 × 헤드 차원 × 바이트
Qwen3-8B, FP16: 2 × 36 × 8 × 128 × 2 = 147,456 B ≈ 144KB / 토큰
🔍 읽는 포인트 : 층 수 · KV 헤드 수 · 헤드 차원은 모델의 config.json에서 num_hidden_layers, num_key_value_heads, head_dim을 찾아 직접 확인 합니다(9차시). 위 값은 Qwen3-8B 기준이고, 다른 후보는 다시 계산합니다.
2.3 ⭐ 예산표 — 문의봇, RTX 4090 24GB
요청당 토큰을 4K(평소 최대) 와 8K(긴 메일) 두 경우로 잡아 봅니다. 아래는 전부 계산값(이론) 입니다.
| 항목 | A. FP16, 4K × 10 | B. 4bit, 4K × 10 | C. FP16 + KV fp8, 4K × 10 | D. FP16, 8K × 10 |
|---|---|---|---|---|
| 가중치 | ≈ 16GB | ≈ 4GB + α ⚠️ | ≈ 16GB | ≈ 16GB |
| KV 캐시 | 40,960토큰 × 144KB ≈ 5.6GB | ≈ 5.6GB | ≈ 2.8GB (절반) | 81,920토큰 × 144KB ≈ 11.3GB |
| 오버헤드 | 1~2GB+ | 1~2GB+ | 1~2GB+ | 1~2GB+ |
| 합계 | ≈ 22.6~23.6GB | ≈ 10.6~11.6GB + α | ≈ 19.8~20.8GB | ≈ 28GB 이상 |
| 24GB에서 | 경계. 여유 없음 | 여유 있음 | 들어가나 빠듯 | ❌ 안 들어감 |
⚠️ 4bit 가중치의 "+ α" — 8B × 0.5바이트 = 4GB는 이론값입니다. 실제 양자화 파일은 일부 층(임베딩 등)을 양자화하지 않는 경우가 많아 더 큽니다. 파일 크기를 직접 확인하세요.
⚠️ vLLM의 --gpu-memory-utilization 0.9 는 24GB의 90%(≈ 21.6GB)만 씁니다(19차시). 그래서 A안은 "경계"가 아니라 사실상 부족 입니다.
💡 이 표를 읽는 법은 하나입니다. 예산이 모자라면 어느 칸을 줄일지 고르는 것 입니다.
| 줄일 칸 | 방법 | 대가 | 배운 곳 |
|---|---|---|---|
| 가중치 | 4bit 양자화 | 품질 손실 가능 → 평가셋으로 확인 | 10~12차시 |
| KV 캐시 (토큰) | --max-model-len 줄이기 | 긴 메일이 잘림 → 33차시의 긴 메일 묶음에서 실패 | 13 · 19차시 |
| KV 캐시 (정밀도) | --kv-cache-dtype fp8 | 품질 영향 가능 → 39차시 재확인 | 23차시 |
| KV 캐시 (동시 수) | 동시 요청 수 줄이기 | 33차시 NFR-01(동시 10명) 위반 | 33차시 |
앞으로 다시 만납니다 — vLLM은 KV 캐시를 PagedAttention으로 필요한 만큼만 나눠 씁니다(21차시). 그래서 예산이 빠듯하면 기동이 실패하기보다 기동 로그의 "Maximum concurrency" 숫자가 줄어드는 형태로 드러납니다. 35차시에서 그 숫자를 이 예산표와 대조합니다.
3. 모델 비교 — 후보 × 양자화 매트릭스
3.1 후보 고르기
| 후보 | 근거 | 이 장비에서 가능한 정밀도 | 확인할 것 |
|---|---|---|---|
| A. Qwen3-8B | 과정 기준 모델, 한국어 지원 언급 | FP16 · 8bit · 4bit | 모델 카드의 라이선스 |
| B. Qwen3-14B | 같은 계열의 더 큰 모델 | 4bit · 8bit만 (FP16은 ≈ 28GB로 초과) | 4bit에서 KV 여유 |
| C. 한국어 특화 계열 (예: EXAONE 계열) | 한국어 품질 | 크기에 따라 | ⚠️ 상업적 사용 조건 |
⚠️ 앞에서 배운 대로(1차시 실습) AI가 추천하는 모델 이름은 Hugging Face에서 실제로 있는지 열어 봅니다. 라이선스는 기술 판단이 아니라 사업 판단입니다.
💡 B를 넣는 이유: 2일차에서 본 경향 — 큰 모델의 4bit가 작은 모델의 FP16보다 나은 경우가 많다 — 을 내 평가셋으로 확인 하기 위해서입니다. "경우가 많다"는 "내 업무에서도 그렇다"가 아닙니다.
3.2 ⭐ 품질 하한 — 문턱부터
품질 하한 (Quality Floor) — [선정 기준]인데, [ 넘지 못하면 다른 장점이 아무리 커도 탈락시키는 문턱 ]이라는 점에서 높을수록 좋은 순위 기준(속도 · 메모리)과 구별된다.
33차시 요구사항표에서 가져옵니다.
| 품질 하한 (33차시 ID) | 통과선 (목표) |
|---|---|
| FR-01 분류 정확도 | 90% 이상 |
| FR-02 주문번호 정확도 / 지어낸 값 | 95% 이상 / 0건 |
| FR-01 · 02 형식 (스키마 통과) | 100% |
⚠️ 앞에서 배운 대로 한국어 · 숫자(주문번호) · 형식 준수 는 양자화에 더 민감할 수 있습니다. 그리고 4bit 미만(Q3 · Q2)은 품질이 급격히 떨어집니다 (10 · 12차시). 그래서 하한을 분류 정확도 한 줄로만 잡지 말고 주문번호 줄을 꼭 넣습니다.
3.3 비교 매트릭스 — 직접 채우는 표
이론값 칸만 채워 두었습니다. 나머지는 실측으로 채웁니다.
| 후보 · 양자화 | 가중치 (이론) | VRAM (실측) | 분류 정확도 | 주문번호 정확도 | 지어낸 값 | 스키마 통과 | 하한 통과? | TTFT 단일 (중앙값) | TPS 단일 (중앙값) |
|---|---|---|---|---|---|---|---|---|---|
| A · FP16 | ≈ 16GB | ||||||||
| A · 4bit | ≈ 4GB + α | ||||||||
| B · 8bit | ≈ 14GB | ||||||||
| B · 4bit | ≈ 7GB + α | ||||||||
| C · (크기에 맞게) |
채우는 규칙 (14차시 측정 규칙 그대로)
| 규칙 | 이유 |
|---|---|
| 모든 행을 같은 엔진 · 같은 프롬프트 · temperature 0 · 같은 max_tokens 로 | 한 번에 변수 하나만 바꾸기 |
| 하한에서 탈락한 행은 속도를 재지 않음 | 1.1절 ④ → ⑤ 순서 |
| 워밍업 1회 버리고, N회 반복 후 중앙값 | 첫 요청은 모델 로딩 포함 |
| 평가셋은 33차시 v1 그대로 , 중간에 고치지 않음 | 고치면 앞 행과 비교가 깨짐 |
4. 양자화 방식 선정 — 운영 엔진에 맞는 형식
4.1 엔진이 형식을 고른다
| 운영 엔진 | 맞는 양자화 형식 | 어떻게 받나 | 알아 둘 점 |
|---|---|---|---|
| vLLM | AWQ, GPTQ (사전 양자화 가중치), FP8 | Hugging Face의 사전 양자화 저장소 | 사전 양자화 모델은 대개 자동 인식. FP8은 최신 GPU에서 이득. 지원 범위는 공식 문서 확인 |
| Ollama · llama.cpp | GGUF (Q8_0, Q5_K_M, Q4_K_M 등) | ollama pull 태그, 또는 Modelfile FROM ./x.gguf | 태그별 양자화는 모델 페이지에서 확인 (5 · 12차시) |
| Transformers 실험 | bitsandbytes (로딩 시 즉석 8bit · NF4) | BitsAndBytesConfig | ⚠️ 8bit는 FP16보다 느린 경우가 많음 (11차시) |
4.2 반례 — 이렇게 고르면 안 됩니다
| ❌ 이렇게 | 왜 안 되나 | ⭕ 이렇게 |
|---|---|---|
| bitsandbytes 4bit로 평가셋을 돌리고, 운영은 vLLM AWQ로 | 다른 양자화 방식은 다른 결과 . 평가한 파일과 운영 파일이 다름 | 평가셋은 운영할 바로 그 파일 · 그 엔진 으로 |
| 개발용 Ollama Q4_K_M 결과로 운영 vLLM의 품질을 갈음 | 24차시에서 본 대로 엔진과 형식이 다르면 출력도 달라질 수 있음 | 개발은 Ollama로 하되, 최종 평가는 운영 형식으로 한 번 더 |
| "양자화하면 빨라진다"고 보고 속도 측정을 생략 | 양자화는 주로 Decode(메모리 병목) 를 돕고, 방식에 따라 오히려 느릴 수 있음 | 매트릭스의 TPS 칸을 실측 으로 |
⭐ 0절 축 3을 다시 봅니다. Decode는 토큰마다 가중치 전체를 메모리에서 읽으므로(2 · 15차시), 가중치가 가벼워지면 이론상 상한이 올라갑니다. RTX 4090(≈ 1TB/s)에서 16GB 모델은 이론 상한 약 60 tok/s, 5GB 모델은 약 200 tok/s입니다. 실제는 이보다 낮습니다. 이 이론값은 "얼마나 빨라질 수 있는가"의 천장일 뿐, 측정을 대신하지 않습니다.
5. 결정 기록 — 고른 이유를 남기기
5.1 정의
결정 기록 (Decision Record) — [프로젝트 문서]인데, [ 결정 그 자체보다 그때의 맥락과 버린 대안을 남긴다 ]는 점에서 결과값만 적힌 설정 파일과 구별된다.
설정 파일에는 --quantization awq만 남습니다. 3주 뒤에 누가 "왜 FP16이 아니냐"고 물으면, 설정 파일은 답하지 못합니다. 40차시 발표에서 받을 질문도 "무엇을 썼나"보다 "왜 그것을 골랐고, 무엇을 버렸나" 입니다. 그 답이 이 기록에 있습니다.
형식은 앞에서 배운 결정 기록(16차시 4절) 의 네 칸 그대로입니다. 맥락 (그때의 조건 · 제약), 결정 (무엇을 골랐나), 검토한 대안 (무엇을 왜 버렸나), 결과 (얻은 것과 치른 대가). 여기에 이 차시는 "다시 볼 조건" 한 칸을 더합니다.
5.2 양식
# DR-001 문의봇 모델 · 양자화 선정
- 날짜 / 작성자:
- 관련 요구사항: FR-01, FR-02, NFR-01
## 맥락
RTX 4090 24GB 1대. 상담원 10명 동시, 요청당 최대 4K 토큰(평가셋 최장 메일 기준 ___ 토큰).
예산표(2.3절)상 FP16은 KV 캐시 여유가 없음.
## 결정
모델: ______ 양자화: ______ 엔진: vLLM max-model-len: ______
## 검토한 대안
| 대안 | 탈락 이유 (숫자로) |
| A · FP16 | 예산 초과 (계산 ___GB > 21.6GB) |
| B · 4bit | 분류 정확도 ___% (하한 90% 미달) 또는 TPS ___ |
## 결과 (얻은 것 / 치른 대가)
얻은 것: 동시 10명 KV 여유, 평가셋 ___%
치른 대가: FP16 대비 분류 정확도 ___%p 차이
## 다시 볼 조건
평가셋이 바뀌면 / GPU가 바뀌면 / 39차시 부하 테스트에서 NFR-01 미달이면
🔍 읽는 포인트 : 검토한 대안의 탈락 이유가 숫자 여야 합니다. "품질이 아쉬워서"는 기록이 아니라 인상입니다. 다시 볼 조건은 이 결정이 언제 무효가 되는지 를 미리 적어 두는 칸입니다.
💡 이 파일을 저장소에 두면, 다음에 AI에게 35차시 작업을 맡길 때 맥락으로 그대로 줄 수 있습니다. AI에게 일을 맡길 때는 필요한 배경 정보를 골라 함께 넣어 주는 것 이 결과의 질을 정합니다. 그 배경을 대화창에 매번 다시 쓰지 않고 파일로 남겨 두는 것 이 이 결정 기록의 또 하나의 쓰임입니다.
6. 실습 — 맡기고 검수하기
지시
33차시 평가셋(eval_v1.jsonl)으로 모델 후보 비교 매트릭스를 채워줘.
목표: 아래 후보 × 양자화 조합마다 [품질 하한 통과 여부 → 통과한 것만 성능] 순서로 측정.
맥락: RTX 4090 24GB, 운영 엔진 vLLM. 후보 저장소 주소와 모델 카드는 아래에 붙임.
(각 후보의 config.json 값으로 KV 캐시/토큰도 계산해줘)
제약:
- 모든 조합을 같은 엔진, 같은 프롬프트 파일, temperature 0, max_tokens 고정으로.
- 품질 하한(분류 정확도 90%, 주문번호 정확도 95%, 지어낸 주문번호 0건, 스키마 통과 100%)에서
탈락한 조합은 성능 측정을 하지 말고 '탈락'이라고만 써.
- 성능은 워밍업 1회 버리고 5회 반복, 중앙값.
- 모델 다운로드나 드라이버 변경이 필요하면 실행 전에 나에게 먼저 물어봐.
- 추측하지 말고 실행 명령과 출력 원문을 붙여.
보고 형식:
[후보·양자화 | 가중치 파일 크기 | VRAM(nvidia-smi) | 분류 정확도 | 주문번호 정확도 | 지어낸 값 | 스키마 통과 | 하한 통과 | TTFT 중앙값 | TPS 중앙값] 표
+ 탈락 조합별로 틀린 평가셋 id 목록.
받을 증거
- 조합별 실행 명령 + 출력 원문 (평가 스크립트의 요약 줄,
nvidia-smi출력) - 틀린 평가셋 id 목록 (점수만이 아니라 무엇을 틀렸는지)
- 후보별
config.json값과 KV 캐시/토큰 계산
내가 직접 볼 것
| 볼 것 | 이걸로 아는 것 / 왜 내가 보는가 |
|---|---|
| 탈락 조합이 틀린 문의 원문 3~5개 | 점수 차이가 "주문번호 숫자 하나 틀림"인지 "분류 자체를 헷갈림"인지. 숫자만 보면 모릅니다 |
| 하한 탈락 조합의 속도 칸이 비어 있는가 | 비어 있지 않으면 순서를 어긴 것. 빠른 모델에 끌려 하한을 낮추고 싶어집니다 |
nvidia-smi의 메모리와 2.3절 예산표 | 이론과 실측이 크게 다르면 계산이나 설정 중 하나가 틀림 |
| 모델 카드의 라이선스 | 사업 판단. AI에게 맡기지 않습니다 |
산출물 체크리스트 (34차시)
- VRAM 예산표 (내 요청당 토큰 · 동시 수로 계산, 이론값 표시)
- 후보 2~3개 목록 (Hugging Face 주소 · 라이선스 확인)
- 비교 매트릭스 (하한 통과 여부 먼저, 통과한 행만 성능)
- 운영 엔진과 양자화 형식의 짝 (4.1절)
- 결정 기록 DR-001 (탈락 이유가 숫자로)
- 35차시에 넘길 값: 모델 저장소 이름, 양자화,
max-model-len, KV 캐시 dtype
부록 A. 스스로 확인하기
| # | 질문 | 답이 있는 곳 |
|---|---|---|
| 1 | 2일차를 프로젝트 절차로 꿴 여섯 단계는? | 1.1 |
| 2 | 품질 하한을 속도 비교보다 먼저 보는 이유는? | 1.1, 3.2 |
| 3 | Qwen3-8B FP16의 KV 캐시/토큰은? 그 값은 어디서 확인하나? | 2.2 |
| 4 | FP16으로 4K × 10을 잡으면 24GB에서 왜 사실상 부족한가? | 2.3 |
| 5 | 예산이 모자랄 때 줄일 수 있는 네 칸과 각각의 대가는? | 2.3 |
| 6 | 품질 하한을 유와 종차로 정의하면? | 3.2 |
| 7 | vLLM을 운영 엔진으로 쓸 때 맞는 양자화 형식은? Ollama라면? | 4.1 |
| 8 | 개발용 Ollama 결과로 운영 품질을 갈음하면 안 되는 이유는? | 4.2 |
| 9 | 결정 기록의 네 칸과 "다시 볼 조건"을 두는 이유는? | 5.2 |
부록 B. 자주 하는 실수
| 실수 | 바로잡기 |
|---|---|
| "제일 빠른 모델로 정하고 품질은 나중에" | ❌ 하한 탈락이면 틀린 답을 빨리 낼 뿐. 문턱부터 |
| "8B FP16은 16GB니까 24GB에 넉넉" | ❌ KV 캐시 × 동시 수 + 오버헤드, 그리고 0.9 활용률까지 계산 |
| "4bit 파일은 정확히 파라미터 × 0.5바이트" | ⚠️ 양자화하지 않는 층이 있어 더 큼 . 파일 크기로 확인 |
| "bitsandbytes로 평가했으니 AWQ도 같은 품질" | ❌ 방식이 다르면 결과도 다름. 운영 파일로 평가 |
| "큰 모델 4bit가 항상 작은 모델 FP16보다 낫다" | ⚠️ "경우가 많다"일 뿐. 내 평가셋 으로 확인 |
| "탈락 이유: 품질이 별로" | ❌ 결정 기록에는 숫자 로 |
| "max-model-len을 줄이면 공짜로 메모리가 생긴다" | ⚠️ 긴 메일이 잘립니다 . 평가셋의 긴 메일 묶음으로 확인 |
부록 C. NotebookLM 복습 프롬프트
이 34차시 노트만 근거로 6문제를 내줘. 비전공자 기준으로.
"VRAM 예산표 계산", "품질 하한을 먼저 보는 이유", "엔진에 맞는 양자화 형식", "결정 기록의 네 칸"은 반드시 포함해줘.
답은 내가 답한 다음에 채점하고, 틀린 이유를 노트의 절 번호를 근거로 설명해줘.
LangTailor