페이지 목차
이 페이지에서 검색
로컬 LLM
이 페이지에 묻기
로컬 LLM · 현재 차시와 목차 본문에서만 찾아 답합니다. 답을 지어내지 않고 해당하는 대목을 그대로 보여 주며, 여기에 없으면 없다고 알려 드립니다.
생성형 AI가 아니라 이 페이지 본문을 찾아 그대로 보여 주는 방식입니다. 외부로 나가는 요청이 없습니다.
LOCAL · LLM
로컬 LLM
생성 수정
로컬 모델 실행과 GPU·메모리 이해부터 서빙·RAG·도구 호출·업무형 앱 구현까지 차례로 살펴봅니다.
42개 문서 · 2일차 · 14 / 42
13차시 · LLM 추론 파라미터 최적화
지도 위치 : 2일차 · ③추론 엔진의 설정 손잡이 | 이전: 12차시 GGUF와 경량 LLM | 다음: 14차시 LLM 추론 성능 측정 키워드 : Context Length, Batch Size, KV Cache, Sampling Parameter, GPU Memory 설정
이 차시를 다 읽으면
- 추론 파라미터를 품질 파라미터 ↔ 자원 파라미터 두 무리로 가를 수 있다.
- 각 자원 파라미터가 9차시 VRAM 예산식의 어느 항 을 건드리는지 표로 말할 수 있다.
- 같은 손잡이가 Ollama · llama.cpp · vLLM · OpenAI API에서 어떤 이름으로 불리는지 대응표에서 찾을 수 있다.
- 문의봇의 업무별(분류 · 추출 · 요약 · 초안) 시작값 을 정하고, 그것이 "정답"이 아니라 "출발점"인 이유를 말할 수 있다.
- 파라미터를 바꿀 때 한 번에 하나만 바꿔야 하는 이유를 말할 수 있다.
0. 이 차시의 판별 축
| # | 축 | 왼쪽 (0) | 오른쪽 (1) | 이 축으로 갈리는 것 | 큰 축 (README 5장) |
|---|---|---|---|---|---|
| 1 | ⭐ 무엇을 바꾸는가 | 출력의 내용 (품질 파라미터) | 메모리 · 속도 (자원 파라미터) | temperature · top_p ↔ num_ctx · 병렬 수 · KV 타입 | — (이 차시에서 세우는 축) |
| 2 | 누가 값을 정하는가 | 학습이 정함 (모델 파라미터) | 사람이 실행 전에 정함 (추론 파라미터) | 8B의 가중치 ↔ 이 차시의 모든 손잡이 | 누가 값을 정하는가 (파생 축) |
| 3 | 어디에 거는가 | 요청마다 (options) | 서버 전체에 (환경변수 · 기동 옵션) | num_ctx ↔ OLLAMA_NUM_PARALLEL | — (이 차시에서 세우는 축) |
| 4 | 결정론 ↔ 확률론 | temperature 0 | temperature > 0 | 분류 · 추출 ↔ 초안 | 결정론 ↔ 확률론 (파생 축) |
앞에서 이어집니다 — README 6장의 번역어 함정에서 "파라미터"는 세 가지였습니다. 이 차시는 그중 ② 추론 파라미터 만 다룹니다. 6차시에서 temperature · top_p를 품질의 눈 으로 만졌다면, 이번에는 같은 목록에 섞여 있던 자원 손잡이들을 분리 해 9차시 예산식에 연결합니다.
1. ⭐ 두 무리로 가르기
엔진 문서의 파라미터 목록은 한 줄로 쭉 나열되어 있어서 다 같은 종류처럼 보입니다. 0절 축 1로 가르면 이렇게 나뉩니다.
품질 파라미터 — [추론 파라미터]인데, [ 다음 토큰을 고르는 방식과 생성의 끝을 정해 출력 내용을 바꾼다 ]는 점에서 자원 파라미터와 구별된다.
자원 파라미터 — [추론 파라미터]인데, [ 메모리를 얼마나 잡고 몇 개를 함께 계산할지 정해 VRAM과 속도를 바꾼다 ]는 점에서 품질 파라미터와 구별된다.
| 무리 | 파라미터 | 바꾸면 달라지는 것 | 걸리는 곳 (0절 축 3) |
|---|---|---|---|
| 품질 | temperature, top_p, top_k, repeat_penalty | 답의 다양성 · 반복 | 요청마다 |
| 품질 | num_predict / max_tokens | 답의 최대 길이 (잘림) | 요청마다 |
| 품질 | seed | 같은 설정에서 재현 가능성 | 요청마다 |
| 품질 | stop | 생성을 멈출 문자열 | 요청마다 |
| 자원 | num_ctx / max-model-len (컨텍스트 길이) | KV 캐시 크기 , 긴 입력 잘림 여부 | 요청마다 또는 서버 |
| 자원 | num_parallel / max-num-seqs (동시 요청 수) | KV 캐시 배수 , 처리량 | 서버 |
| 자원 | batch (num_batch / max-num-batched-tokens) | Prefill 속도, 활성값 메모리 | 서버 |
| 자원 | KV 캐시 타입 (f16 / q8_0 / fp8) | KV 캐시 바이트 | 서버 |
| 자원 | GPU 메모리 비율 (vLLM) | 엔진이 미리 잡는 전체 예산 | 서버 |
⚠️ 경계에 걸친 것이 하나 있습니다. num_predict 는 품질(잘림)이지만, 길게 생성할수록 KV 캐시가 자라고 시간이 늘어나 자원에도 영향 을 줍니다. 그래서 "넉넉히 4096"이 아니라 업무에 맞게 짧게 잡습니다(4절).
1.1 품질 파라미터 — 6차시 회수
6차시에서 다룬 내용이라 한 줄씩만 정리합니다.
| 파라미터 | 한 줄 | 문의봇에서 |
|---|---|---|
| temperature | 확률 분포를 뾰족하게(0) ↔ 평평하게(↑) | 분류는 0, 초안은 약간 ↑ |
| top_p / top_k | 후보를 상위 몇 %/몇 개로 자름 | 대개 모델 카드 권장값 유지 |
| repeat_penalty | 이미 나온 토큰에 벌점 | 같은 문장 반복이 보일 때만 조금 ↑ |
| seed | 난수 고정 | 평가 · 측정 때 고정 (14차시) |
| stop | 이 문자열이 나오면 멈춤 | 분류 답 뒤 군더더기 방지 |
⚠️ 반례 — 품질 파라미터는 VRAM을 거의 바꾸지 않습니다. "temperature를 낮췄더니 메모리가 줄었다"는 일어나지 않습니다. 메모리 문제가 생기면 2절의 손잡이를 봅니다.
2. ⭐ 자원 파라미터 ↔ VRAM 예산식
9차시 3절의 예산식입니다.
필요한 VRAM ≈ 가중치 + KV 캐시(토큰당 크기 × 컨텍스트 × 동시 요청) + 나머지(활성값 · CUDA 컨텍스트 …)
| 자원 파라미터 | 예산식의 어느 항 | 올리면 | 내리면 |
|---|---|---|---|
| 컨텍스트 길이 | KV 캐시의 × 컨텍스트 | 긴 문의 메일을 받을 수 있음, 메모리 ↑ | ⚠️ 긴 입력이 조용히 잘림 |
| 동시 요청 수 | KV 캐시의 × 동시 요청 | 처리량 ↑, 메모리 ↑, 한 건 지연은 늘 수 있음 | 줄 서서 기다림 |
| KV 캐시 타입 | KV 캐시의 토큰당 크기(바이트) | (f16) 기준 | (q8_0 · fp8) KV 약 절반, 품질 소폭 손실 가능 |
| batch 크기 | 나머지 (활성값) | 긴 입력의 Prefill이 빨라질 수 있음, 순간 메모리 ↑ | Prefill 느려짐 |
| GPU 메모리 비율 | 엔진이 쓰는 전체 예산의 상한 | KV 캐시 자리 ↑ | 같은 GPU의 다른 프로세스에 자리 양보 |
| (참고) 양자화 | 가중치 | — | 10~12차시 |
⭐ 이 표 하나로 "메모리가 부족하다"는 증상을 어느 손잡이로 풀지 고를 수 있습니다. 9차시 3.1의 문의봇 계산(FP16, 8K, 약 5명)을 예로 들면 다음 조합이 가능합니다.
| 조합 | 계산 방향 (계산값, 측정 아님) |
|---|---|
| KV 캐시를 q8_0으로 | 토큰당 144KB → 약 72KB. 같은 6GB에 약 10개 |
| 컨텍스트를 8K → 4K로 | 요청당 1.1GB → 0.56GB. 단, 긴 메일이 잘림 → 평가셋의 긴 메일로 확인 필수 |
| 가중치를 Q8로 | 16GB → 약 8.5GB. KV에 쓸 자리 약 14GB (24 − 8.5 − 1.5) |
2.1 ⚠️ "배치"라는 단어의 두 뜻
README 6장의 번역어 함정입니다. 이 차시에서는 같은 단어가 두 가지로 쓰입니다.
| 한 요청 안의 배치 | 여러 요청의 배치 | |
|---|---|---|
| 무엇을 묶나 | 긴 입력의 토큰들 을 몇 개씩 묶어 Prefill할지 | 여러 사람의 요청 을 GPU 한 번에 같이 계산 |
| 이름 예 | Ollama num_batch, llama.cpp -b | vLLM --max-num-seqs, Ollama OLLAMA_NUM_PARALLEL |
| 영향 | TTFT, 순간 메모리 | 처리량, KV 캐시 총량 |
vLLM의 --max-num-batched-tokens는 한 스텝에 처리할 토큰 총량 이라 두 뜻에 걸쳐 있습니다. 21차시 연속 배칭에서 정확히 봅니다.
3. 엔진별 이름 대응표
같은 손잡이가 엔진마다 다른 이름입니다. ⚠️ 이름과 기본값은 버전에 따라 바뀌니 공식 문서로 확인합니다.
3.1 품질 파라미터
| 손잡이 | Ollama (options / Modelfile) | llama.cpp | vLLM (SamplingParams) | OpenAI 호환 API |
|---|---|---|---|---|
| 온도 | temperature | --temp | temperature | temperature |
| 상위 확률 | top_p | --top-p | top_p | top_p |
| 상위 개수 | top_k | --top-k | top_k | (표준에 없음, 엔진별 확장) |
| 반복 벌점 | repeat_penalty | --repeat-penalty | repetition_penalty | (frequency_penalty · presence_penalty는 다른 방식 ) |
| 최대 생성 | num_predict | -n | max_tokens | max_tokens |
| 시드 | seed | --seed | seed | seed |
| 멈춤 | stop | (요청 시 지정) | stop | stop |
3.2 자원 파라미터
| 손잡이 | Ollama | llama.cpp | vLLM (서버 옵션) |
|---|---|---|---|
| 컨텍스트 길이 | num_ctx (요청 options 또는 Modelfile PARAMETER) | -c | --max-model-len |
| 동시 요청 수 | 환경변수 OLLAMA_NUM_PARALLEL | -np (llama-server) | --max-num-seqs |
| KV 캐시 타입 | 환경변수 OLLAMA_KV_CACHE_TYPE=q8_0 + OLLAMA_FLASH_ATTENTION=1 | -ctk · -ctv (+ 플래시 어텐션 옵션) | --kv-cache-dtype fp8 |
| batch | num_batch | -b | --max-num-batched-tokens |
| GPU 메모리 | (자동) | -ngl (층 단위, 12차시) | --gpu-memory-utilization 0.9 |
앞으로 다시 만납니다 — vLLM 열은 19차시(서버 구축)에서 처음 켜고, 23차시(성능 최적화)에서 이 표의 손잡이를 하나씩 돌립니다.
3.3 Ollama 쪽에서 조심할 것
systemd — [리눅스의 서비스 관리자]인데, [ 프로그램을 백그라운드 서비스로 상시 실행하고, 꺼지면 다시 띄우고, 부팅 때 자동으로 켠다 ]는 점에서 사람이 터미널에서 직접 실행하는 방식과 구별된다. 리눅스에 Ollama를 설치하면 대개 ollama라는 systemd 서비스로 등록됩니다. 서비스는 사람이 연 터미널(셸)과 따로 돌기 때문에, 셸에서 정한 환경변수를 보지 못합니다.
| 설정 | 주의 |
|---|---|
num_ctx | ⚠️ 기본값이 모델 최대치보다 훨씬 작을 수 있음 (버전에 따라 다름). 긴 문의가 조용히 잘림 (2차시 3절). 요청마다 또는 Modelfile에 명시 |
OLLAMA_NUM_PARALLEL | 병렬 수만큼 KV 자리를 더 잡을 수 있음 → ollama ps SIZE가 커지고 CPU 분할 이 생기면 줄임 (12차시 4.4) |
OLLAMA_KV_CACHE_TYPE | 플래시 어텐션이 켜져 있어야 적용. 둘을 같이 설정 |
| 환경변수 전반 | systemd 서비스라면 systemctl edit ollama로 Environment= 추가 후 재시작. 셸에서 export만 하면 서비스에는 안 먹음 |
# systemctl edit ollama 로 여는 파일
[Service]
Environment="OLLAMA_NUM_PARALLEL=4"
Environment="OLLAMA_FLASH_ATTENTION=1"
Environment="OLLAMA_KV_CACHE_TYPE=q8_0"
🔍 읽는 포인트 : 세 줄 모두 서버 전체 에 걸리는 자원 파라미터입니다(0절 축 3). 품질 파라미터는 여기에 없습니다.
4. 업무별 시작값 — 문의봇
⚠️ 아래는 출발점 입니다. 정답이 아니라 "여기서 시작해 평가셋으로 조정할 값"입니다. 먼저 모델 카드의 권장 샘플링 값 을 확인하세요. Qwen3처럼 생각 모드 여부에 따라 권장값을 따로 적어 둔 모델도 있고, 생각 모드에서 온도 0(greedy)을 권하지 않는 경우도 있습니다(모델 카드 확인).
| 업무 | temperature | num_predict | 그 밖에 | 근거 |
|---|---|---|---|---|
| 분류 | 0 | 짧게 (수십 토큰) | stop, 형식 강제 (29차시) | 같은 문의 → 같은 분류여야 함 (결정론) |
| 정보 추출 | 0 | 필드 수에 맞게 | JSON 스키마 (29차시) | 주문번호에 "창의성"은 필요 없음 |
| 요약 | 0 ~ 0.3 | 요약 길이 규칙 + 여유 | 사실 보존 우선 | |
| 답변 초안 | 0.5 ~ 0.7 | 초안 길이 + 여유 | top_p는 모델 카드 값 | 표현이 약간 다양해도 됨. 사람 검토 전제 |
| (공통 자원) | — | — | num_ctx는 평가셋에서 가장 긴 메일 토큰 수 + 출력 + 여유 | 2차시 5절 실습에서 잰 토큰 수 |
💡 컨텍스트 길이를 정하는 순서: ① 평가셋 메일의 토큰 수 분포를 잰다 → ② 상위 몇 %까지 받을지 정한다 → ③ 시스템 프롬프트 + 그 길이 + num_predict + 여유 → ④ 9차시 예산식에 넣어 동시 요청 수가 나오는지 본다. "넉넉히 32K"는 예산식을 무시한 선택 입니다.
5. ⭐ 한 번에 하나만 바꾸기
| ❌ | ⭕ |
|---|---|
| "temperature 0.2, num_ctx 16384, KV q8_0, 병렬 4로 바꿨더니 좋아졌습니다" | "기준 → KV q8_0 만 바꿈 → 평가셋 · 메모리 · 속도 기록 → 다음 하나" |
| 무엇 덕분인지, 무엇이 품질을 깎았는지 모름 | 손잡이마다 효과와 대가가 따로 기록 됨 |
AI에게 맡길 때도 마찬가지입니다(README 9장). AI가 "최적화했습니다"라고 말해도, 판정은 측정 숫자와 평가셋 이 합니다. 한 번에 하나만 바꾸게 해야 그 숫자가 어느 손잡이의 효과인지 읽을 수 있습니다. 변경 기록은 14차시 측정표에 조건 한 줄 로 남깁니다.
5.1 비유 (기억 보조)
품질 파라미터는 요리사의 간 맞추기 , 자원 파라미터는 주방의 화구 수와 냉장고 크기 입니다. 간을 바꿔도 주방이 넓어지지 않고, 화구를 늘려도 음식 맛이 좋아지지 않습니다. 둘을 동시에 바꾸면 맛이 변한 이유를 모릅니다.
6. 실습 — 맡기고 검수하기
지시
목표: 문의봇용 Ollama 모델의 자원 파라미터를 하나씩 바꾸며 메모리 변화를 기록하고, 업무별 품질 파라미터 시작값을 Modelfile로 고정한다.
맥락: ollama.com의 Ollama 문서(Modelfile 파라미터, FAQ의 환경변수)와 Qwen3-8B 모델 카드의 권장 샘플링 값을 먼저 인용해.
설치된 Ollama 버전과 기본 num_ctx 값을 확인해서 보고해.
작업:
1. 기준: qwen3:8b, num_ctx 4096, 병렬 1, KV f16.
2. 한 번에 하나만 바꾸기: (a) num_ctx 8192 (b) num_ctx 16384 (c) OLLAMA_KV_CACHE_TYPE=q8_0 + FLASH_ATTENTION=1 (d) OLLAMA_NUM_PARALLEL=4
환경변수는 systemctl edit ollama로 설정하고 재시작(실행 전 변경 내용을 나에게 보여줘).
3. 각 단계에서 같은 프롬프트로 한 번 요청 후 ollama ps, nvidia-smi 기록.
4. 분류용/초안용 Modelfile 두 개를 만들어 ollama create (temperature, num_predict, num_ctx 포함).
보고 형식:
| 단계 | 바꾼 것 하나 | ollama ps SIZE | PROCESSOR | nvidia-smi used | 9차시 계산과 비교 |
추측하지 말고 실행 명령과 출력 원문을 붙여.
받을 증거
- Ollama 버전, 기본
num_ctx확인 출력 - 단계별
ollama ps,nvidia-smi출력 원문 systemctl edit내용, 두 Modelfile 원문,ollama show --modelfile출력
내가 직접 볼 것
| 볼 것 | 이걸로 아는 것 |
|---|---|
| 단계마다 바꾼 것이 정말 하나인가 | 5절 — 둘 이상이면 그 행은 해석 불가 |
| num_ctx를 두 배로 할 때 SIZE 증가량 ≈ 9차시 계산의 KV 증가량인가 | 예산식의 둘째 항이 실제로 움직임 |
| q8_0 적용 후 KV 몫이 대략 절반 으로 줄었는가 | 환경변수가 서비스에 실제로 적용됐는가 (FLASH_ATTENTION 누락 시 안 줄 수 있음) |
| 병렬 4에서 PROCESSOR가 CPU 분할로 바뀌는가 | 이 GPU에서 감당할 동시 수의 한계 → 3일차 vLLM로 이어지는 이유 |
| 분류용 Modelfile의 temperature가 0인가 | 업무와 설정이 맞는가 |
부록 A. 스스로 확인하기
| # | 질문 | 답이 있는 곳 |
|---|---|---|
| 1 | 품질 파라미터와 자원 파라미터를 유와 종차로 가르면? | 1 |
| 2 | num_predict가 두 무리의 경계에 걸치는 이유는? | 1 |
| 3 | temperature를 바꾸면 VRAM이 바뀌는가? | 1.1 |
| 4 | 컨텍스트 · 동시 요청 · KV 타입 · batch는 예산식의 어느 항인가? | 2 |
| 5 | "배치"의 두 뜻은? | 2.1 |
| 6 | Ollama의 num_ctx, OLLAMA_NUM_PARALLEL에 해당하는 vLLM 이름은? | 3.2 |
| 7 | OLLAMA_KV_CACHE_TYPE이 적용되지 않는 흔한 이유 두 가지는? | 3.3 |
| 8 | 분류와 답변 초안의 temperature 시작값과 그 근거는? | 4 |
| 9 | 컨텍스트 길이를 정하는 네 단계는? | 4 |
| 10 | 파라미터를 한 번에 하나만 바꿔야 하는 이유는? | 5 |
부록 B. 자주 하는 실수
| 실수 | 바로잡기 |
|---|---|
| 메모리가 부족해서 temperature를 조정 | ❌ 품질 파라미터는 VRAM과 무관. 자원 파라미터 를 봄 |
| "num_ctx는 넉넉히 32K" | ❌ KV 캐시 × 동시 요청. 평가셋의 최장 메일 기준 으로 |
셸에서 export OLLAMA_NUM_PARALLEL=4 후 효과 없다고 판단 | ⚠️ systemd 서비스는 systemctl edit ollama로 설정 |
| KV q8_0만 설정하고 플래시 어텐션은 안 켬 | ⚠️ 둘 다 필요 |
| 여러 손잡이를 한꺼번에 바꿈 | ❌ 무엇이 효과였는지 모름. 하나씩 |
| 4절 시작값을 정답으로 고정 | ⚠️ 출발점일 뿐. 모델 카드 권장값 + 평가셋 으로 조정 |
부록 C. NotebookLM 복습 프롬프트
이 13차시 노트만 근거로 6문제를 내줘. 비전공자 기준으로.
"품질 파라미터 vs 자원 파라미터", "각 자원 파라미터가 VRAM 예산식의 어느 항인가", "Ollama와 vLLM 이름 대응", "한 번에 하나만 바꾸기"는 반드시 포함해줘.
답은 내가 답한 다음에 채점하고, 틀린 이유를 노트의 절 번호를 근거로 설명해줘.
LangTailor