ollama run gemma3 한 줄이면 거대 언어 모델이 내 노트북에서 바로 뜬다. 그래픽카드 감지·모델 다운로드·채팅 템플릿을 전부 자동 처리하는 로컬 LLM 런타임. ⭐약 173,000(2026-06 기준 근사치) · Go로 작성, C/C++ 추론 엔진(llama.cpp)을 CGO로 호출. MIT 라이선스. (저장소: ollama/ollama)Ollama는 거대 언어 모델(LLM)을 내 컴퓨터에서 한 줄 명령으로 다운로드·실행·관리하는 오픈소스 로컬 런타임이다. ollama run gemma3이라고 입력하면 모델이 자동으로 받아지고, 그래픽카드가 감지되고, 채팅이 바로 시작된다.
Docker가 복잡한 서버 환경 구성을 docker run nginx 한 줄로 끝낸 것처럼, Ollama는 며칠 걸리던 로컬 LLM 셋업을 ollama run [모델명] 한 줄로 압축한다.
핵심은 친숙한 패러다임의 이식이다. 모델을 Docker 이미지처럼 레이어로 쪼개 저장하고, 매니페스트로 조합을 기록하고, 자체 레지스트리(registry.ollama.ai)까지 만들었다. 익숙한 개념을 새 영역으로 옮겨 진입 장벽을 무너뜨린 설계다.
NVIDIA CUDA·cuDNN·드라이버 버전을 전부 맞춰야 하고(한 곳만 어긋나도 로드 실패), Hugging Face의 safetensors 모델을 GGUF로 직접 변환해야 하며, 모델마다 다른 채팅 템플릿([INST] vs <start_of_turn>)을 손으로 짜야 했다.
그래픽카드는 실행 시점에 알아서 감지하고, 자체 레지스트리엔 GGUF로 미리 변환된 모델만 올라가 있고, 채팅 템플릿은 모델별로 내장돼 배포된다. 사용자가 신경 쓸 게 ollama run [모델명] 한 줄로 줄었다.
2023년 출시 이후 로컬 LLM 붐의 사실상 표준 진입점이 됐다. README 상단의 모델 목록(Gemma, Qwen, DeepSeek, gpt-oss 등)이 모델 출시 속도에 맞춰 끊임없이 갱신되는 것 자체가 생태계의 중심임을 보여준다. 프라이버시(데이터가 외부로 안 나감)·오프라인 동작·API 사용료 0원이라는 가치가 명령어 한 줄의 편의성과 만나 폭발적으로 퍼졌다.
| 비교 대상 | Ollama의 차별점 |
|---|---|
| llama.cpp | Ollama의 추론 엔진이 사실상 llama.cpp다. Ollama는 그 위에 모델 관리·레지스트리·REST API·자동 GPU 감지를 얹어 "쓰기 쉽게" 만든 래퍼 |
| LM Studio | LM Studio는 GUI 중심. Ollama는 CLI/서버 네이티브라 스크립트·CI·다른 앱에서 호출하기 쉬움 |
| vLLM | vLLM은 대규모 서버 처리량(throughput) 최적화. Ollama는 개인 PC의 손쉬운 단일 사용자 경험에 초점 |
| OpenAI API 직결 | OpenAI는 클라우드 종속·과금·데이터 외부 전송. Ollama는 로컬·무료·오프라인 + OpenAI 호환 API까지 제공 |
※ 비율은 GitHub Linguist 집계 기준이며 커밋에 따라 변동한다.
| 기술 | 역할 | 상세 |
|---|---|---|
| Go 1.26 | 본체 언어 | 서버·CLI·모델 매니저. go.mod의 go 디렉티브 기준 |
| Gin | HTTP 서버 | github.com/gin-gonic/gin — REST API 라우팅 (/api/chat 등) |
| Cobra | CLI 프레임워크 | github.com/spf13/cobra — run/pull/serve/ps 등 서브커맨드 |
| CGO + llama.cpp | 추론 엔진 | Go에서 C/C++로 짠 추론 라이브러리(ggml/llama.cpp) 호출 |
| GGUF | 모델 포맷 | 양자화된 가중치를 담는 단일 파일 포맷. 레지스트리에 사전 변환되어 배포 |
| go-sqlite3 | 로컬 저장 | github.com/mattn/go-sqlite3 — 메타데이터 등 로컬 DB |
| 백엔드 | 대상 | 상세 |
|---|---|---|
| CUDA | NVIDIA GPU | 가장 성숙. RTX 30/40/50, A100, H100. Linux/Windows |
| Metal | Apple Silicon | M1~M4 Mac. 통합 메모리로 시스템 RAM이 그대로 VRAM |
| ROCm | AMD GPU | CUDA의 AMD 대응. RX 7000, Instinct |
| Vulkan | 크로스 | AMD/Intel GPU 폭넓게. ROCm 설치 까다로울 때 대안 |
| CPU (AVX2) | 최후의 보루 | GPU 없어도 동작. 7B+ 모델은 매우 느림 |
| 기술 | 역할 | 상세 |
|---|---|---|
| 자체 레지스트리 | 모델 배포 | registry.ollama.ai — Docker Hub 구조를 모델에 적용 |
| OpenAI 호환 API | 마이그레이션 | /v1/chat/completions 등 OpenAI 엔드포인트 흉내 |
| Docker 이미지 | 컨테이너 배포 | ollama/ollama 공식 이미지 제공 |
| 크로스 플랫폼 | OS 지원 | macOS · Windows · Linux 네이티브 바이너리 |
ollama run은 직접 모델을 띄우지 않고, 백그라운드의 ollama serve에 HTTP 요청만 보낸다. 실제 일은 전부 서버가 한다. 덕분에 Python·JS·VS Code 확장 등 어디서든 같은 서버를 동일하게 호출한다.실제 모델 계산은 서버가 아니라 자식 프로세스 runner가 맡는다. runner 안에 C++ 추론 엔진(llama.cpp)이 들어 있다. 별도 프로세스로 띄우는 이유 — GPU 메모리 부족으로 runner가 죽어도 메인 서버는 살아남아 다음 요청을 받을 수 있게 하기 위함이다(장애 격리).
모델 파일을 통째로 저장하지 않고 여러 조각(layer)으로 쪼갠다. 가중치·템플릿·시스템 프롬프트·파라미터·라이선스가 각각 별도 레이어이고, 매니페스트가 "이 모델 = 이 조각들의 조합"을 기록한다. 조각은 SHA256 해시로 식별된다.
"Gemma + 친절한 톤"과 "Gemma + 단호한 톤"의 차이는 작은 블록 몇 개뿐이다. Ollama는 큰 베이스 블록(가중치)은 한 번만 저장하고 다른 부분만 따로 보관한다. 같은 가중치를 쓰는 변형끼리 디스크를 공유해 공간이 크게 절약된다 — Docker 이미지 레이어 공유와 똑같다.
같은 ollama run이 RTX 4090에서도, M3 맥에서도, AMD 라데온에서도 돈다. 비결은 "여러 백엔드를 모두 빌드해 두고 실행 시점에 골라 쓰기"다. 각 백엔드(CUDA/Metal/ROCm/Vulkan/CPU)는 같은 추론 인터페이스를 구현한 별개 라이브러리다.
자체 API(/api/chat)와 별개로 OpenAI와 똑같은 URL 구조(/v1/chat/completions)도 제공한다. 기존 ChatGPT 코드에서 base_url과 api_key 두 줄만 바꾸면 로컬 모델로 갈아끼울 수 있다. "더 좋은 새 API"를 정의하는 대신 기존 표준과 호환되게 만들어 채택 마찰을 없앤 전략이다.
읽기 순서 추천: cmd/(명령이 어떻게 시작되나) → server/routes.go(요청이 어디로 가나) → runner/(실제 추론) → llm/·llama/(C++ 엔진 연결). 이 흐름만 따라가도 "한 줄 명령어 뒤에서 벌어지는 일"이 코드로 보인다.
배울 것: Gin 기반 REST 서버를 어떻게 모듈로 쪼개는가. server/routes.go의 라우팅, 스케줄러의 모델 로드/언로드 결정 로직, NDJSON 스트리밍 응답 구현. 패키지 경계가 명확한 Go 프로젝트의 좋은 예시다.
배울 것: Go의 깔끔한 서버 코드 + C++의 빠른 수치 연산을 한 프로그램에 합치는 법. llama/ 패키지가 어떻게 llama.cpp 함수를 CGO로 호출하는지. 두 언어를 섞을 때의 메모리·빌드 관리 패턴.
배울 것: 왜 추론을 별도 runner 프로세스로 분리했는가. 장애 격리 — 자식이 죽어도 부모(서버)는 생존하는 패턴은 안정적인 시스템 설계의 핵심 기법이다.
배울 것: 모델을 SHA256 해시로 식별되는 레이어로 쪼개 저장하는 방식. 같은 내용은 한 번만 저장하고 여러 매니페스트가 참조하는 구조는 Docker·Git이 쓰는 바로 그 아이디어다.
배울 것: 같은 인터페이스를 여러 백엔드(CUDA/Metal/ROCm/CPU)로 구현하고 런타임에 고르는 패턴. discover/의 자동 감지 + llm/의 추상화가 어떻게 "한 명령어, 모든 하드웨어"를 만드는지.
배울 것: openai/ 패키지가 OpenAI 엔드포인트를 흉내내는 방식. 새 도구를 만들 때 기존 표준과 호환되게 만들어 마찰을 없애는 것이 종종 "더 좋은 새 API"보다 강력하다는 교훈.
대략 모델 크기 × 0.6 GB ≒ 필요 메모리(기본 4비트 양자화 기준). 핵심 공식은 모델 크기 ≤ 메모리 크기 — 모델이 메모리에 통째로 안 들어가면 스왑이 끼어 끔찍하게 느려진다.
| 모델 크기 | 권장 RAM/VRAM | 예시 / 비고 |
|---|---|---|
| 1~3B | RAM 4GB | Gemma3 1B, Qwen 1.5B. 노트북 CPU만으로도 실용적 |
| 7~8B | RAM 8GB / VRAM 6~8GB | Llama 3 8B, Mistral 7B. 가장 보편적 |
| 13~14B | RAM 16GB / VRAM 10GB | RTX 3060(12GB)으로 돌아가는 상한선 |
| 30~34B | VRAM 24GB+ | RTX 4090, 또는 Apple Silicon 32GB 통합메모리 |
| 70B+ | RAM/VRAM 64GB+ | 서버 영역. 멀티 GPU 필요. 일반 PC 거의 불가 |
| OS | 가속 백엔드 | 비고 |
|---|---|---|
| macOS (Apple Silicon) | Metal | 통합 메모리로 가성비 최고. M1+ 권장 |
| Linux | CUDA / ROCm / Vulkan | NVIDIA가 가장 안정적 |
| Windows | CUDA / ROCm / Vulkan | 네이티브 지원. WSL 없이도 동작 |
| 모든 OS | CPU (AVX2) | GPU 없어도 작은 모델은 실용적 |
공식 설치 스크립트로 Ollama를 깔고, 가장 작은 모델부터 띄워본다. 1B는 거의 모든 노트북에서 돈다.
# 설치 (macOS/Linux)
curl -fsSL https://ollama.com/install.sh | sh
# 가장 작은 모델 실행
ollama run gemma3:1b
> 안녕? 자기소개 해줘 # 첫 응답을 받아보면 끝
Dockerfile과 닮은 문법으로 system prompt가 박힌 커스텀 모델을 만든다.
# Modelfile
FROM gemma3:1b
SYSTEM "너는 항상 사투리로 답하는 친절한 비서다."
PARAMETER temperature 0.8
OpenAI 호환 API를 이용해 base_url 두 줄만 바꿔 로컬 모델로 돌리고 답변 품질을 비교한다.
# Python
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama" # 아무 값이나 OK
)
r = client.chat.completions.create(
model="gemma3", messages=[{"role":"user","content":"안녕"}])
print(r.choices[0].message.content)
VS Code에 Continue 또는 Cline 확장을 깔고 백엔드를 로컬 Ollama로 지정. 코딩 특화 모델로 자동완성을 돌린다.
ollama pull qwen2.5-coder:7b → 확장 설정에서 provider를 ollama, model을 qwen2.5-coder로 지정. Copilot 비용 없이 비슷한 경험.Go를 조금이라도 안다면 cmd/ → server/routes.go → runner/ 순으로 "한 줄 명령어 뒤에서 벌어지는 일"을 코드로 따라간다.
# 레포 클론 후
git clone https://github.com/ollama/ollama
# routes.go에서 /api/chat 핸들러를 찾아
# 스케줄러 → runner spawn 경로를 추적
# 빌드: go generate ./... && go build .
| 요일 | 학습 내용 | 실습 |
|---|---|---|
| 월 | Ollama 설치 & 기본 명령 | run / pull / list / ps 직접 실행 |
| 화 | 모델 크기와 양자화 이해 | 1B/7B/13B 모델 속도 비교 |
| 수 | Modelfile 문법 | SYSTEM/PARAMETER로 커스텀 모델 빌드 |
| 목 | REST API 직접 호출 | curl로 /api/chat 스트리밍 받기 |
| 금 | OpenAI 호환 API | Python OpenAI SDK로 로컬 모델 연결 |
| 요일 | 학습 내용 | 실습 |
|---|---|---|
| 월 | 클라이언트-서버 분리 | serve를 따로 띄우고 run으로 붙기 |
| 화 | 모델 레이어 & 매니페스트 | ~/.ollama/models 디렉토리 직접 탐색 |
| 수 | GPU/메모리 자동 감지 | OLLAMA_DEBUG=1로 감지 로그 관찰 |
| 목 | runner 프로세스 격리 | 실행 중 프로세스 트리 확인 |
| 금 | NDJSON 스트리밍 | 스트림 응답을 줄 단위로 파싱 |
| 요일 | 학습 내용 | 실습 |
|---|---|---|
| 월 | Go 프로젝트 구조 파악 | cmd/ server/ runner/ 폴더 역할 정리 |
| 화 | routes.go 라우팅 분석 | 각 엔드포인트 핸들러 따라가기 |
| 수 | CGO와 llama.cpp 바인딩 | llama/ 패키지의 C 호출부 읽기 |
| 목 | 소스 빌드 | 로컬에서 go build로 직접 빌드 |
| 금 | convert/ 모델 변환 | safetensors→GGUF 변환 흐름 이해 |
| 요일 | 학습 내용 | 실습 |
|---|---|---|
| 월 | 임베딩 & RAG | /api/embeddings로 검색 시스템 맛보기 |
| 화 | 툴 콜링(function calling) | tools/ 기능으로 함수 호출 실험 |
| 수 | 코딩 어시스턴트 통합 | Continue/Cline + Ollama 백엔드 |
| 목 | Docker 배포 | ollama/ollama 이미지로 서버 운영 |
| 금 | 종합 프로젝트 | 로컬 모델 + RAG + API를 묶은 앱 |
| 키워드 | 설명 |
|---|---|
| LLM | Large Language Model. 수십억~수조 개 파라미터로 글을 이어쓰는 신경망 |
| 런타임 | 프로그램을 실행해 주는 환경. Ollama는 LLM을 띄워주는 런타임 |
| GGUF | 양자화된 모델 가중치를 담는 단일 파일 포맷. 로컬 추론용 표준 |
| 양자화 | 32비트 가중치를 4비트 등으로 압축. 메모리를 1/4~1/8로 줄임 (기본 Q4_K_M) |
| llama.cpp | C/C++로 짠 LLM 추론 엔진. Ollama가 CGO로 호출하는 실제 계산기 |
| CGO | Go에서 C/C++ 함수를 호출하게 해주는 다리. Go 서버 + C++ 연산 결합 |
| runner | 추론을 전담하는 자식 프로세스. 죽어도 메인 서버는 생존(장애 격리) |
| 레이어 / 매니페스트 | 모델을 조각으로 쪼개 저장하고, 매니페스트가 그 조합을 기록 (Docker 방식) |
| 레지스트리 | 모델을 보관·배포하는 서버. registry.ollama.ai가 Docker Hub 역할 |
| Modelfile | FROM/SYSTEM/PARAMETER로 커스텀 모델을 정의하는 텍스트 파일 (Dockerfile 닮음) |
| NDJSON | 줄바꿈으로 구분한 JSON. 토큰 단위 스트리밍에 적합한 포맷 |
| 통합 메모리 | Apple Silicon에서 시스템 RAM이 그대로 GPU 메모리가 되는 구조 |
| CUDA / Metal / ROCm | 각각 NVIDIA / Apple / AMD GPU를 가속하는 백엔드 |
| KV 캐시 | 이미 계산한 토큰의 중간값을 저장해 추론 속도를 높이는 기법 |
| OpenAI 호환 API | /v1/chat/completions 등 OpenAI 엔드포인트를 흉내낸 어댑터 |
| Gin / Cobra | 각각 Go의 HTTP 서버 / CLI 프레임워크. Ollama의 서버·명령 골격 |
| safetensors | Hugging Face 표준 모델 포맷. 로컬 실행엔 GGUF로 변환 필요 |