본문으로 건너뛰기
페이지 목차
이 페이지에서 검색

로컬 LLM

이 페이지에 묻기

로컬 LLM · 현재 차시와 목차 본문에서만 찾아 답합니다. 답을 지어내지 않고 해당하는 대목을 그대로 보여 주며, 여기에 없으면 없다고 알려 드립니다.

생성형 AI가 아니라 이 페이지 본문을 찾아 그대로 보여 주는 방식입니다. 외부로 나가는 요청이 없습니다.

LOCAL · LLM

로컬 LLM

생성 수정

로컬 모델 실행과 GPU·메모리 이해부터 서빙·RAG·도구 호출·업무형 앱 구현까지 차례로 살펴봅니다.

42개 문서 · 1일차 · 6 / 42

5차시 · Ollama 설치 및 LLM 실행

지도 위치 : 1일차 · ③추론 엔진 층 (가장 쉬운 엔진) | 이전: 4차시 Hugging Face 오픈소스 LLM 활용 | 다음: 6차시 로컬 LLM 모델 및 Prompt 활용 키워드 : Ollama 설치, 환경 설정, LLM 다운로드, 모델 실행 및 관리

이 차시를 다 읽으면

  1. Ollama를 유와 종차로 정의하고, Transformers · vLLM과 무엇으로 갈리는지 말할 수 있다.
  2. pull · run · list · ps · show · rm · stop을 디스크 쪽 명령과 메모리 쪽 명령 으로 나눌 수 있다.
  3. 모델이 메모리에 올라갔다가 내려가는 과정(keep_alive)을 nvidia-smi로 확인할 수 있다.
  4. ollama ps의 PROCESSOR 열 을 읽고 "100% GPU"가 아닐 때 무엇을 의심할지 말할 수 있다.
  5. OLLAMA_HOST=0.0.0.0이 왜 위험한지 인증 이라는 단어로 설명할 수 있다.

0. 이 차시의 판별 축

#축왼쪽 (0)오른쪽 (1)이 축으로 갈리는 것큰 축 (README 5장)
1어디에 있는가디스크 (모델 파일)메모리 (VRAM에 로드된 모델)pull · list · rm ↔ run · ps · stop⭐ ① 디스크 ↔ 메모리
2어느 메모리인가VRAM (GPU)RAM (CPU)ollama ps의 100% GPU ↔ CPU/GPU 분할①의 파생
3어디에 있는가 (인터넷)로컬 엔진원격 레지스트리 (ollama.com)ollama pull ↔ docker pull④ 로컬 ↔ 원격
4누구에게 열려 있는가127.0.0.1 (나만)0.0.0.0 (네트워크 전체)기본값 ↔ 외부 노출④ 로컬 ↔ 원격의 파생 (4.2)

4차시에서는 Python 코드로 모델을 받고(다운로드), 메모리에 올려(로드) 실행했습니다. 이 차시는 같은 일을 명령 한 줄로 해 주는 도구 Ollama로 다시 합니다. 그리고 4차시 0절에서 경고한 한 문장 — "내려받은 모델은 디스크에 저장되고, 실행하는 순간 VRAM으로 로드된다" — 를 nvidia-smi로 눈으로 확인 합니다.


1. Ollama는 무엇의 한 종류인가

1.1 정의

Ollama — [서빙 프레임워크]인데, [ 설치 · 모델 다운로드 · 실행 · API 서버를 명령 한 줄로 묶어, 1인 개발 · 실험에 맞췄다 ]는 점에서 다수 동시 사용자 처리량에 맞춘 vLLM과 구별된다.

서빙 프레임워크 는 모델을 메모리에 올려 두고, 요청이 들어올 때마다 답을 계산해 돌려주는 상주 프로그램 입니다(17차시에서 자세히). 같은 범주의 형제들과 나란히 놓으면 이렇습니다.

OllamavLLM(참고) Transformers
상위 범주서빙 프레임워크서빙 프레임워크Python 라이브러리
목적간편한 로컬 실행고성능 서빙코드 안에서 한 번 실행
사용 감각ollama run 한 줄서버 프로세스를 띄워 운영Python 코드 작성
모델 형식GGUF (양자화된 한 파일, 12차시)Hugging Face 형식 그대로Hugging Face 형식
PyTorch필요 없음 (3차시 1.2)필요필요
어울리는 자리개발 · 실험 · 1인사내 다수 사용자연구 · 검증

⚠️ 반례 — 이건 Ollama가 아닙니다

대상왜 다른가
qwen3:8bOllama 위에 올라가는 모델 (내용물). Ollama는 런타임 (무대) — 모델 파일을 읽어 실제로 계산을 돌리는 실행 프로그램. 같은 Ollama에 모델을 바꿔 올릴 수 있음
Ollama Cloudollama.com이 호스팅하는 원격 서비스. 이름에 Ollama가 붙어 있어도 내 머신의 Ollama가 아니고, 데이터가 밖으로 나감 (1차시 0절 축 1)

1.2 설치와 서비스

curl -fsSL https://ollama.com/install.sh | sh     # Linux 공식 설치 스크립트
systemctl status ollama                            # 서비스로 등록되어 떠 있는지
curl http://localhost:11434                        # "Ollama is running" 이 나오면 정상

🔍 읽는 포인트 : 설치 스크립트가 Ollama를 systemd 서비스 로 등록합니다. 11434는 Ollama의 기본 포트 입니다. 두 단어를 정의합니다.

systemd — [리눅스의 서비스 관리자]인데, [ 프로그램을 부팅 때 자동으로 띄우고, 죽으면 다시 살리고, 로그를 모아 상시 실행되게 관리한다 ]는 점에서 터미널에서 내가 직접 실행했다가 창을 닫으면 같이 꺼지는 일반 실행과 구별된다. systemd가 관리하는 상시 실행 프로그램을 서비스 라고 부르고, systemctl이 그 관리 명령입니다.

명령하는 일
systemctl status ollama지금 떠 있는가, 최근 로그 몇 줄
sudo systemctl restart ollama내렸다 다시 띄움 (설정을 바꾼 뒤)
journalctl -u ollama이 서비스의 로그 전체

네트워크 포트 (Port) — [통신 창구 번호]인데, [ 한 컴퓨터 안에서 어느 프로그램에게 온 요청인지 가르는 번호(0~65535) ]라는 점에서 컴퓨터 자체를 가리키는 IP 주소와 구별된다. IP 주소가 건물 주소 라면 포트는 그 건물 안의 창구 번호 입니다. Ollama는 11434번 창구에서 요청을 기다리고, 3일차의 vLLM은 보통 8000번 창구를 씁니다. ⚠️ README 6장의 번역어 함정대로, 20차시에 나오는 아키텍처의 포트 (약속)와는 다른 뜻입니다.

⚠️ 설치 스크립트는 시스템 전체 를 바꿉니다(전역). 3차시 3.1의 원칙대로 실행 전 내용을 확인하고 사람이 승인합니다.

 [터미널] ollama run ...  ──┐
 [Python] ollama.chat()  ──┼──▶  Ollama 서버 (localhost:11434)  ──▶  GPU
 [curl]   /api/chat      ──┘       systemd가 띄워 둔 상주 프로세스

⭐ ollama run도 사실은 이 서버에 요청을 보내는 클라이언트 입니다. 서버 는 한자리에서 요청을 기다렸다가 처리해 돌려주는 쪽, 클라이언트 는 요청을 보내고 답을 받는 쪽입니다. 같은 프로그램 이름(ollama)이 두 역할을 다 하지만, 무거운 일(모델을 메모리에 들고 계산)은 서버만 합니다. 그래서 7차시에서 같은 서버에 HTTP로 직접 말을 걸 수 있습니다.


2. 명령을 축으로 가르기 ⭐

2.1 디스크 쪽 · 메모리 쪽

명령하는 일0절 축 1
ollama pull qwen3:8b원격에서 디스크로 내려받기원격 → 디스크
ollama list디스크에 있는 모델 목록디스크
ollama show qwen3:8b모델 정보 (구조 · 파라미터 수 · 컨텍스트 · 양자화 · 라이선스)디스크 (파일의 메타데이터)
ollama rm qwen3:8b디스크에서 지우기디스크
ollama run qwen3:8b메모리에 올리고 대화 시작 (없으면 pull부터)디스크 → 메모리
ollama ps지금 메모리에 올라가 있는 모델메모리
ollama stop qwen3:8b메모리에서 내리기 (파일은 그대로)메모리 → 디스크만 남음

⚠️ stop과 rm을 헷갈리지 마세요. 디스크는 물건을 오래 쌓아 두는 창고 , 메모리는 지금 일하는 물건만 올려 두는 작업대 입니다(README 5.1 축 ①). stop은 작업대(메모리)를 치우는 것이고, rm은 창고(디스크)에서 버리는 것입니다. list에는 있는데 ps에는 없는 것이 정상 상태 입니다.

2.2 태그 — 이름:변형

qwen3:8b의 : 뒤가 태그 입니다. 레지스트리 (이름을 붙여 올려 두고 내려받게 하는 원격 저장소)에서 흔히 쓰는 이름:변형 형식입니다. Docker Hub의 python:3.13-slim(파이썬 3.13의 가벼운 판)도 같은 구조입니다.

태그 예뜻
qwen3:8b8B 크기의 기본 변형 (대개 4bit 계열 양자화 — ollama show로 확인)
qwen3:8b-q8_0 같은 꼴양자화 방식을 명시한 변형 (8bit)
...-fp16 같은 꼴양자화하지 않은 16bit

⚠️ 어떤 양자화 태그가 있는지는 모델마다 다릅니다. 지어내지 말고 ollama.com의 모델 페이지 Tags 목록에서 확인합니다. 양자화 이름(q4_K_M, q8_0)의 뜻은 10 · 12차시에서 풉니다.

2.3 Docker Hub와의 대칭

4차시 1.1에서 Hugging Face Hub를 Git ↔ GitHub, Docker ↔ Docker Hub와 같은 모양으로 놓았습니다. 여기서 Docker를 짧게 정의해 둡니다.

Docker 이미지 (Image) — [배포 단위]인데, [ 프로그램과 그것이 도는 데 필요한 OS 파일 · 라이브러리 · 설정을 한 덩어리로 얼려 둔 읽기 전용 꾸러미 ]라는 점에서 파이썬 패키지만 격리하는 가상환경(3차시 3.1)과 구별된다.

Docker 컨테이너 (Container) — [실행 단위]인데, [ 이미지를 바탕으로 실제로 떠서 돌고 있는 격리된 프로세스 ]라는 점에서 디스크에 놓여 있는 이미지와 구별된다. 이미지 하나로 컨테이너를 여러 개 띄울 수 있습니다.

가상환경 (3차시)Docker 컨테이너
격리하는 범위파이썬 패키지 만OS 파일 · 시스템 라이브러리 · 프로그램 전부
다른 컴퓨터로 옮기면그 컴퓨터의 파이썬 · 드라이버에 기대야 함이미지째 옮기면 같은 환경이 그대로 뜸
GPU시스템 드라이버를 그대로 씀호스트의 드라이버를 빌려 써야 함 (별도 설정 필요)

이미지 ↔ 컨테이너가 바로 ① 디스크 ↔ 메모리 축이고, Ollama의 모델 파일 ↔ 로드된 모델과 같은 모양입니다. 명령 이름까지 닮았습니다.

Docker ↔ Docker HubOllama ↔ ollama.com 레지스트리
내리기docker pull 이름:태그ollama pull 이름:태그
올리기docker pushollama push (계정 필요)
로컬 목록docker imagesollama list
실행 중 목록docker psollama ps
실행 단위이미지(디스크) → 컨테이너 (실행 중)모델 파일(디스크) → 로드된 모델 (VRAM)

⭐ 4차시 1.1의 세 쌍의 대칭 (코드 · 실행 환경 · 모델)에 한 줄이 더 붙은 것입니다. 새 도구를 만나면 "이건 어느 쌍과 같은 모양인가"부터 물으면, pull · push · list · ps가 무엇을 할지 설명서를 보기 전에 추론 할 수 있습니다.


3. ⭐ 메모리에 올라갔다 내려간다 — keep_alive

3.1 저장 위치 (디스크)

설치 방식기본 저장 위치
Linux (systemd 서비스)/usr/share/ollama/.ollama/models
macOS · 사용자 실행홈 아래 .ollama/models
바꾸고 싶으면OLLAMA_MODELS 환경변수

💡 모델 하나가 수 GB입니다. 시스템 디스크가 작으면 처음부터 OLLAMA_MODELS를 큰 디스크로 잡습니다.

3.2 로드 · 유지 · 언로드

 ollama run / API 요청        요청 없이 시간이 지나면            다음 요청
        │                            │                          │
 [디스크] ──로드──▶ [VRAM] ── keep_alive(기본 약 5분) 유지 ──▶ 언로드 ──▶ 다시 로드 (느림)
                   nvidia-smi                                 nvidia-smi
                   Memory-Usage ↑                             Memory-Usage ↓

keep_alive — [모델 수명 설정]인데, [ 마지막 요청 뒤 모델을 메모리에 얼마나 더 남겨 둘지 정한다 ]는 점에서 디스크의 파일 보관과 구별된다.

설정효과어울리는 때
기본 (약 5분)한동안 안 쓰면 VRAM을 돌려줌여러 모델을 번갈아 실험
길게 / 무기한 (-1)계속 메모리에 상주문의봇처럼 항상 응답해야 하는 서비스
0응답 직후 바로 내림VRAM을 다른 작업에 써야 할 때

전역으로는 OLLAMA_KEEP_ALIVE, 요청마다는 API의 keep_alive(7차시)로 정합니다.

⚠️ 첫 요청이 유난히 느린 이유 가 여기 있습니다. 디스크 → VRAM 로드 시간이 포함되기 때문입니다. 14차시에서 성능을 잴 때 첫 요청(워밍업)을 버리는 이유입니다.

3.3 ⭐ ollama ps의 PROCESSOR 열

NAME        ID        SIZE     PROCESSOR          UNTIL
qwen3:8b    xxxxxxx   7.5 GB   100% GPU           4 minutes from now

(숫자는 예시 · 실측 아님 . 버전에 따라 CONTEXT 열이 더 있을 수 있음)

PROCESSOR 값뜻판단
100% GPU모델 전체가 VRAM에 있음⭕ 정상
48%/52% CPU/GPU 같은 분할일부 층이 RAM에서 CPU로 계산됨⚠️ 크게 느려짐 . RAM 쪽이 병목
100% CPUGPU를 못 씀❌ 드라이버 · 설치 문제 (3차시 3.3)

분할이 생기는 흔한 원인:

원인확인
모델이 VRAM보다 큼ollama show의 크기 · 양자화
컨텍스트를 크게 잡아 KV 캐시가 커짐6차시 num_ctx — KV 캐시 자리는 컨텍스트 길이에 비례해 잡히므로(2차시 3절), 컨텍스트를 올리면 같은 모델이라도 VRAM 사용량이 늘어남
다른 모델 · 프로세스가 VRAM을 차지ollama ps에 여러 개? nvidia-smi Processes

앞으로 다시 만납니다 — 12차시에서 이 분할을 일부러 만들어(CPU · GPU 혼합 추론) 속도가 얼마나 떨어지는지 잽니다.


4. 환경 설정 — 그리고 ⚠️ 0.0.0.0

4.1 자주 쓰는 환경변수

변수뜻기본
OLLAMA_HOST서버가 어느 주소 · 포트에 바인딩 하는가127.0.0.1:11434 (이 컴퓨터만)
OLLAMA_MODELS모델 저장 위치3.1 표
OLLAMA_KEEP_ALIVE메모리 유지 시간약 5분
OLLAMA_CONTEXT_LENGTH기본 컨텍스트 길이버전에 따라 다름 (6차시)
OLLAMA_NUM_PARALLEL · OLLAMA_MAX_LOADED_MODELS동시 요청 수 · 동시에 올릴 모델 수버전에 따라 다름 (13 · 24차시)

systemd 서비스라면 서비스 설정에 넣고 재시작합니다.

sudo systemctl edit ollama
#   [Service]
#   Environment="OLLAMA_MODELS=/data/ollama/models"
#   Environment="OLLAMA_KEEP_ALIVE=30m"
sudo systemctl daemon-reload && sudo systemctl restart ollama

🔍 읽는 포인트 : Environment="이름=값" 한 줄이 환경변수 하나. ⚠️ 터미널에서 export만 하면 서비스로 떠 있는 Ollama는 모릅니다. 환경변수는 프로그램이 시작될 때 한 번 읽히고, export는 그 터미널과 거기서 새로 띄운 프로그램 에만 적용되기 때문입니다. 서비스는 systemd가 따로 띄운 프로그램이라 내 터미널의 값을 보지 못하고, 설정을 바꿔도 재시작해서 다시 읽히기 전까지는 옛 값 그대로입니다. "바꿨는데 안 바뀐다"의 대부분이 이것입니다.

4.2 ⚠️ OLLAMA_HOST=0.0.0.0 = 인증 없는 외부 노출

상담원 10명이 다른 PC에서 쓰게 하려고 OLLAMA_HOST=0.0.0.0으로 열고 싶어집니다. 이 한 줄을 읽으려면 단어 세 개가 필요합니다.

바인딩 (Binding) — 서버가 " 어느 주소로 들어온 요청을 받겠다 "고 자리를 잡는 것. 한 컴퓨터에는 주소(네트워크 인터페이스)가 여러 개 있습니다.

바인딩 주소뜻누가 접근할 수 있나
127.0.0.1 (= localhost)자기 자신 을 가리키는 특수 주소(루프백). 네트워크 밖으로 나가지 않음이 컴퓨터 안의 프로그램만
0.0.0.0" 이 컴퓨터의 모든 주소 에서 받겠다"는 뜻같은 네트워크의 누구나 서버IP:11434로

인증 (Authentication) — [접근 통제 단계]인데, [ "너는 누구냐"를 확인한다 ](비밀번호 · API 키 · 로그인)는 점에서, 확인된 사람이 " 무엇을 해도 되는가 "를 정하는 인가(Authorization) 와 구별된다. 인증이 먼저, 인가가 그다음입니다.

그런데 Ollama API에는 인증 장치가 없습니다. 누구냐고 묻지 않습니다. 그래서 127.0.0.1에 있을 때는 "이 컴퓨터 안의 프로그램만"이라는 위치 가 문지기 역할을 하지만, 0.0.0.0으로 여는 순간 그 문지기가 사라집니다. 문의봇 앱에 로그인을 붙여 두었더라도, Ollama가 직접 열려 있으면 앱을 거치지 않는 뒷문 이 하나 더 생기는 것입니다.

그래서 아무나 할 수 있게 되는 것:

  • 우리 GPU로 아무 프롬프트나 실행 (자원 도용)
  • pull · rm 같은 관리 API 호출 (모델을 지우거나 받음)
  • 앱이 거는 시스템 프롬프트 · 로그 · 개인정보 마스킹을 전부 건너뜀

⭐ 올바른 구조 : Ollama는 127.0.0.1에 그대로 두고, 앞에 인증이 있는 앱 · 리버스 프록시 를 세웁니다. 리버스 프록시 는 바깥 요청을 대신 받아 검사한 뒤 안쪽 서버로 넘겨 주는 중계 서버입니다. 바깥에서는 이 문 하나만 보이고, Ollama는 그 뒤에 숨어 있습니다.

 상담원 PC ──▶ [앱 · 리버스 프록시] ──(127.0.0.1)──▶ Ollama
              인증 · 기록 · 마스킹        이 컴퓨터 안에서만

8차시의 앱, 25 · 32차시의 API 서버가 그 자리입니다.


5. 실습 — 맡기고 검수하기

지시

목표: Ollama를 설치하고 qwen3:8b를 받아 실행한 뒤, 모델이 메모리에 올라갔다 내려가는 과정을 기록해줘.
맥락: Linux 설치는 ollama.com의 공식 설치 안내를 따르고, 명령 옵션은 `ollama --help`와
      공식 문서로 확인해. 기억하는 옵션을 지어내지 마.
제약: - 설치 스크립트 실행 전에 무엇을 바꾸는지 먼저 설명하고 내 승인을 받아.
      - OLLAMA_HOST는 바꾸지 마 (127.0.0.1 유지).
      - 모델 저장 위치는 OLLAMA_MODELS=/data/ollama/models 로, systemctl edit으로 설정해.
보고 형식: [단계 | 명령 | nvidia-smi Memory-Usage | ollama ps 출력] 표
      단계: ① 설치 직후 ② pull 직후 ③ run으로 질문 1개 직후 ④ ollama stop 직후
      그리고 ollama show qwen3:8b 원문, ollama list 원문.
추측하지 말고 실행 출력 원문을 붙여.

받을 증거

  • 네 단계 각각의 nvidia-smi와 ollama ps 원문
  • ollama show 원문 (양자화 · 컨텍스트 길이 줄이 보이도록)
  • systemctl cat ollama 원문 (환경변수가 서비스에 들어갔는지)

내가 직접 볼 것

볼 것이걸로 아는 것
②에서 Memory-Usage가 그대로 인가pull은 디스크 까지만 (축 1)
③에서 늘고 ④에서 줄었는가run = 로드, stop = 언로드
③의 PROCESSOR가 100% GPU 인가VRAM에 다 들어갔는가
ollama show의 양자화 줄기본 태그가 몇 bit인가 → 4차시의 16GB와 왜 다른가
OLLAMA_HOST가 바뀌지 않았는가외부 노출이 없는가

부록 A. 스스로 확인하기

#질문답이 있는 곳
1Ollama를 유와 종차로 정의하면? vLLM과 무엇이 다른가?1.1
2ollama run은 서버인가 클라이언트인가? systemd와 포트는 각각 무엇인가?1.2
3일곱 명령을 디스크 쪽과 메모리 쪽으로 나누면?2.1
4stop과 rm의 차이는?2.1
5태그 qwen3:8b의 구조는 Docker의 무엇과 같은가? Docker 이미지와 컨테이너는 어느 축으로 갈리는가?2.2, 2.3
6keep_alive가 끝나면 무슨 일이 생기고, 다음 요청은 왜 느린가?3.2
7PROCESSOR가 CPU/GPU로 나뉘면 무엇을 의심하나?3.3
8터미널에서 export한 환경변수가 서비스에 안 먹는 이유는?4.1
9127.0.0.1과 0.0.0.0의 차이, 인증과 인가의 차이는? OLLAMA_HOST=0.0.0.0이 위험한 세 가지 이유는?4.2

부록 B. 자주 하는 실수

실수바로잡기
"Ollama가 모델이다"❌ Ollama는 런타임 , 모델은 내용물 (1.1)
"ollama list에 있으니 메모리에 있다"❌ list는 디스크 , ps가 메모리
"공간 확보하려고 ollama stop"❌ stop은 VRAM 만 비움. 디스크는 rm
"느리지만 돌아가니 괜찮다"⚠️ ollama ps가 CPU/GPU 분할 인지 먼저 확인
"export OLLAMA_HOST=... 했는데 안 바뀐다"⚠️ systemd 서비스는 systemctl edit → 재시작
"상담원도 쓰게 0.0.0.0으로 열자"❌ 인증 없는 노출 . 앱 · 프록시 뒤에 둠
"기본 태그 = 원본 정밀도"❌ 대개 양자화된 변형 . ollama show로 확인

부록 C. NotebookLM 복습 프롬프트

이 5차시 노트만 근거로 6문제를 내줘. 비전공자 기준으로.
"디스크 쪽 명령과 메모리 쪽 명령", "ollama ps의 PROCESSOR 열", "OLLAMA_HOST=0.0.0.0의 위험"은 반드시 포함해줘.
답은 내가 답한 다음에 채점하고, 틀린 이유를 노트의 절 번호를 근거로 설명해줘.