TRENDSHIFT 딥다이브 · ollama/ollama 분석

Ollama 딥다이브
— 내 컴퓨터에서 LLM을 한 줄로 돌리는 로컬 런타임

ollama run gemma3 한 줄이면 거대 언어 모델이 내 노트북에서 바로 뜬다. 그래픽카드 감지·모델 다운로드·채팅 템플릿을 전부 자동 처리하는 로컬 LLM 런타임. ⭐약 173,000(2026-06 기준 근사치) · Go로 작성, C/C++ 추론 엔진(llama.cpp)을 CGO로 호출. MIT 라이선스. (저장소: ollama/ollama)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

Ollama가 정확히 무엇을 하는 도구인가

Ollama거대 언어 모델(LLM)을 내 컴퓨터에서 한 줄 명령으로 다운로드·실행·관리하는 오픈소스 로컬 런타임이다. ollama run gemma3이라고 입력하면 모델이 자동으로 받아지고, 그래픽카드가 감지되고, 채팅이 바로 시작된다.

용어
런타임(runtime)
"어떤 프로그램을 실행해 주는 환경"을 뜻한다. 자바 코드를 돌리는 JVM처럼, LLM을 돌려주는 환경이 Ollama다. LLM 자체를 만드는 게 아니라, 이미 만들어진 모델을 띄우고 운영하는 인프라 도구다.
한 컷 비유

"LLM 세계의 Docker — 한 줄로 pull, 한 줄로 run"

Docker가 복잡한 서버 환경 구성을 docker run nginx 한 줄로 끝낸 것처럼, Ollama는 며칠 걸리던 로컬 LLM 셋업을 ollama run [모델명] 한 줄로 압축한다.

핵심은 친숙한 패러다임의 이식이다. 모델을 Docker 이미지처럼 레이어로 쪼개 저장하고, 매니페스트로 조합을 기록하고, 자체 레지스트리(registry.ollama.ai)까지 만들었다. 익숙한 개념을 새 영역으로 옮겨 진입 장벽을 무너뜨린 설계다.

2왜 주목받는가

트렌딩 이유와 경쟁 도구 대비 강점
기존 방식의 불편함
로컬 LLM 셋업은 원래 연구자 영역 — 설치만 며칠

NVIDIA CUDA·cuDNN·드라이버 버전을 전부 맞춰야 하고(한 곳만 어긋나도 로드 실패), Hugging Face의 safetensors 모델을 GGUF로 직접 변환해야 하며, 모델마다 다른 채팅 템플릿([INST] vs <start_of_turn>)을 손으로 짜야 했다.

Ollama의 해법
자동 감지 + 사전 변환 + 내장 템플릿

그래픽카드는 실행 시점에 알아서 감지하고, 자체 레지스트리엔 GGUF로 미리 변환된 모델만 올라가 있고, 채팅 템플릿은 모델별로 내장돼 배포된다. 사용자가 신경 쓸 게 ollama run [모델명] 한 줄로 줄었다.

왜 별 약 17만 개를 받았나

2023년 출시 이후 로컬 LLM 붐의 사실상 표준 진입점이 됐다. README 상단의 모델 목록(Gemma, Qwen, DeepSeek, gpt-oss 등)이 모델 출시 속도에 맞춰 끊임없이 갱신되는 것 자체가 생태계의 중심임을 보여준다. 프라이버시(데이터가 외부로 안 나감)·오프라인 동작·API 사용료 0원이라는 가치가 명령어 한 줄의 편의성과 만나 폭발적으로 퍼졌다.

경쟁 도구 비교

비교 대상Ollama의 차별점
llama.cppOllama의 추론 엔진이 사실상 llama.cpp다. Ollama는 그 위에 모델 관리·레지스트리·REST API·자동 GPU 감지를 얹어 "쓰기 쉽게" 만든 래퍼
LM StudioLM Studio는 GUI 중심. Ollama는 CLI/서버 네이티브라 스크립트·CI·다른 앱에서 호출하기 쉬움
vLLMvLLM은 대규모 서버 처리량(throughput) 최적화. Ollama는 개인 PC의 손쉬운 단일 사용자 경험에 초점
OpenAI API 직결OpenAI는 클라우드 종속·과금·데이터 외부 전송. Ollama는 로컬·무료·오프라인 + OpenAI 호환 API까지 제공

3기술 스택 전체 지도

언어 구성 · 핵심 런타임 · 백엔드 · 인프라

언어 구성 (GitHub 기준, 근사치)

Go ███████████████████████████ 65.8% ← 서버, CLI, 모델 관리, API C ███████████ 27.4% ← 추론 커널 (llama.cpp / ggml) TypeScript █ 3.2% ← macOS/데스크톱 앱 UI C++ ▌ 1.1% ← 추론 엔진 일부 CMake ▏ 0.7% ← 네이티브 빌드 구성 Objective-C ▏ 0.5% ← Apple Metal 연동

※ 비율은 GitHub Linguist 집계 기준이며 커밋에 따라 변동한다.

핵심 런타임 / 백엔드

기술역할상세
Go 1.26본체 언어서버·CLI·모델 매니저. go.mod의 go 디렉티브 기준
GinHTTP 서버github.com/gin-gonic/gin — REST API 라우팅 (/api/chat 등)
CobraCLI 프레임워크github.com/spf13/cobrarun/pull/serve/ps 등 서브커맨드
CGO + llama.cpp추론 엔진Go에서 C/C++로 짠 추론 라이브러리(ggml/llama.cpp) 호출
GGUF모델 포맷양자화된 가중치를 담는 단일 파일 포맷. 레지스트리에 사전 변환되어 배포
go-sqlite3로컬 저장github.com/mattn/go-sqlite3 — 메타데이터 등 로컬 DB

가속 백엔드 (실행 시점 선택)

백엔드대상상세
CUDANVIDIA GPU가장 성숙. RTX 30/40/50, A100, H100. Linux/Windows
MetalApple SiliconM1~M4 Mac. 통합 메모리로 시스템 RAM이 그대로 VRAM
ROCmAMD GPUCUDA의 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 네이티브 바이너리

4아키텍처 심화 분석

클라이언트-서버 분리 · 추론 런너 격리 · 레이어 저장 · 하드웨어 추상화

시스템 구조도

┌─────────────────────────────────────────────────────────────┐ │ 클라이언트 계층 │ │ CLI(ollama run) | Python/JS SDK | VS Code 확장 | 타사 앱 │ └──────────────────────────┬──────────────────────────────────┘ │ HTTP (REST / NDJSON 스트림) ├──────────────────────────▼──────────────────────────────────┤ │ ollama serve (Go, Gin HTTP 서버) │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 라우터: /api/chat /api/generate /api/pull │ │ │ │ + OpenAI 호환 /v1/chat/completions │ │ │ └────────────────────────┬─────────────────────────────┘ │ │ │ │ │ ┌────────────────────────▼─────────────────────────────┐ │ │ │ 스케줄러: GPU/메모리 감지 → 모델 로드/언로드 결정 │ │ │ └──────────┬─────────────────────────┬─────────────────┘ │ │ │ 모델 없으면 pull │ runner spawn │ ├─────────────▼─────────────────────────▼──────────────────────┤ │ 레지스트리(registry.ollama.ai) │ runner (자식 프로세스) │ │ ~/.ollama/models/ (레이어+매니페스트) │ CGO → llama.cpp(C++)│ │ │ 백엔드: CUDA/Metal/ROCm/CPU│ └─────────────────────────────────────────────────────────────┘

핵심 설계 패턴 ①: 클라이언트-서버 분리

패턴
Client-Server (CLI는 그냥 HTTP 클라이언트)
ollama run은 직접 모델을 띄우지 않고, 백그라운드의 ollama serve에 HTTP 요청만 보낸다. 실제 일은 전부 서버가 한다. 덕분에 Python·JS·VS Code 확장 등 어디서든 같은 서버를 동일하게 호출한다.
ollama run gemma3 └─ POST http://localhost:11434/api/chat → 서버가 모든 작업 수행 응답은 NDJSON 스트림으로 토큰 하나씩 흘러나옴

핵심 설계 패턴 ②: 추론 런너 프로세스 격리

실제 모델 계산은 서버가 아니라 자식 프로세스 runner가 맡는다. runner 안에 C++ 추론 엔진(llama.cpp)이 들어 있다. 별도 프로세스로 띄우는 이유 — GPU 메모리 부족으로 runner가 죽어도 메인 서버는 살아남아 다음 요청을 받을 수 있게 하기 위함이다(장애 격리).

ollama serve (Go, 항상 생존) │ fork / exec ▼ runner #1 (gemma3 로드) runner #2 (qwen 로드) └ CGO → llama.cpp └ CGO → llama.cpp runner가 죽어도 → 서버는 살아서 새 runner 재생성

핵심 설계 패턴 ③: 모델을 레이어로 저장 (Docker 매니페스트 이식)

모델 파일을 통째로 저장하지 않고 여러 조각(layer)으로 쪼갠다. 가중치·템플릿·시스템 프롬프트·파라미터·라이선스가 각각 별도 레이어이고, 매니페스트가 "이 모델 = 이 조각들의 조합"을 기록한다. 조각은 SHA256 해시로 식별된다.

레고 비유

"Gemma + 친절한 톤"과 "Gemma + 단호한 톤"의 차이는 작은 블록 몇 개뿐이다. Ollama는 큰 베이스 블록(가중치)은 한 번만 저장하고 다른 부분만 따로 보관한다. 같은 가중치를 쓰는 변형끼리 디스크를 공유해 공간이 크게 절약된다 — Docker 이미지 레이어 공유와 똑같다.

핵심 설계 패턴 ④: 하드웨어 추상화 (백엔드 다중 빌드)

같은 ollama run이 RTX 4090에서도, M3 맥에서도, AMD 라데온에서도 돈다. 비결은 "여러 백엔드를 모두 빌드해 두고 실행 시점에 골라 쓰기"다. 각 백엔드(CUDA/Metal/ROCm/Vulkan/CPU)는 같은 추론 인터페이스를 구현한 별개 라이브러리다.

핵심 설계 패턴 ⑤: OpenAI 호환 어댑터

자체 API(/api/chat)와 별개로 OpenAI와 똑같은 URL 구조(/v1/chat/completions)도 제공한다. 기존 ChatGPT 코드에서 base_urlapi_key 두 줄만 바꾸면 로컬 모델로 갈아끼울 수 있다. "더 좋은 새 API"를 정의하는 대신 기존 표준과 호환되게 만들어 채택 마찰을 없앤 전략이다.

5디렉토리 구조 해부

Go 표준 패키지 레이아웃 — 각 폴더가 한 가지 책임
ollama/ollama/ ├── api/ # Go 클라이언트 라이브러리 + 요청/응답 타입 정의 ├── cmd/ # CLI 진입점 (run/pull/serve 등 명령 구현) ├── server/ # ⭐ HTTP 서버 핵심 — 라우팅, 스케줄러, 모델 로드 │ └── routes.go # REST 엔드포인트 정의가 여기 모여 있음 ├── runner/ # ⭐ 추론 실행 자식 프로세스 (llama.cpp 구동) ├── llm/ # 추론 백엔드 추상화 계층 ├── llama/ # llama.cpp / ggml 바인딩 (CGO) ├── ml/ # 머신러닝 연산 추상화 ├── model/ # 모델 아키텍처별 처리 ├── convert/ # safetensors → GGUF 등 모델 변환 로직 ├── template/ # 모델별 채팅 템플릿 처리 ├── parser/ # Modelfile 파싱 ├── manifest/ # 모델 매니페스트(레이어 조합 기록) ├── discover/ # GPU/하드웨어 자동 감지 ├── openai/ # OpenAI 호환 API 어댑터 ├── auth/ # 레지스트리 인증 ├── tokenizer/ # 토큰화 ├── kvcache/ # KV 캐시 (추론 속도 핵심) ├── thinking/ # 사고(reasoning) 모델 처리 ├── tools/ # 툴 콜링(function calling) 처리 ├── app/ # 데스크톱/맥 앱 (Go + TypeScript UI) ├── docs/ # 공식 문서 ├── scripts/ # 빌드/릴리스 스크립트 ├── go.mod # Go 1.26, 의존성 정의 └── Dockerfile # 컨테이너 빌드

읽기 순서 추천: cmd/(명령이 어떻게 시작되나) → server/routes.go(요청이 어디로 가나) → runner/(실제 추론) → llm/·llama/(C++ 엔진 연결). 이 흐름만 따라가도 "한 줄 명령어 뒤에서 벌어지는 일"이 코드로 보인다.

6학습 포인트 (기술별)

이 레포에서 무엇을 배울 수 있는가

A. Go 서버 아키텍처 — 추상화 잘하는 코드의 표본

배울 것: Gin 기반 REST 서버를 어떻게 모듈로 쪼개는가. server/routes.go의 라우팅, 스케줄러의 모델 로드/언로드 결정 로직, NDJSON 스트리밍 응답 구현. 패키지 경계가 명확한 Go 프로젝트의 좋은 예시다.

B. CGO — Go와 C++을 잇는 다리

배울 것: Go의 깔끔한 서버 코드 + C++의 빠른 수치 연산을 한 프로그램에 합치는 법. llama/ 패키지가 어떻게 llama.cpp 함수를 CGO로 호출하는지. 두 언어를 섞을 때의 메모리·빌드 관리 패턴.

C. 프로세스 격리 설계

배울 것: 왜 추론을 별도 runner 프로세스로 분리했는가. 장애 격리 — 자식이 죽어도 부모(서버)는 생존하는 패턴은 안정적인 시스템 설계의 핵심 기법이다.

D. 콘텐츠 주소화 저장 (Content-Addressable Storage)

배울 것: 모델을 SHA256 해시로 식별되는 레이어로 쪼개 저장하는 방식. 같은 내용은 한 번만 저장하고 여러 매니페스트가 참조하는 구조는 Docker·Git이 쓰는 바로 그 아이디어다.

E. 하드웨어 추상화 계층

배울 것: 같은 인터페이스를 여러 백엔드(CUDA/Metal/ROCm/CPU)로 구현하고 런타임에 고르는 패턴. discover/의 자동 감지 + llm/의 추상화가 어떻게 "한 명령어, 모든 하드웨어"를 만드는지.

F. 호환 어댑터 전략

배울 것: openai/ 패키지가 OpenAI 엔드포인트를 흉내내는 방식. 새 도구를 만들 때 기존 표준과 호환되게 만들어 마찰을 없애는 것이 종종 "더 좋은 새 API"보다 강력하다는 교훈.

7하드웨어 / 시스템 요구사항

메모리가 거의 모든 걸 결정한다

대략 모델 크기 × 0.6 GB ≒ 필요 메모리(기본 4비트 양자화 기준). 핵심 공식은 모델 크기 ≤ 메모리 크기 — 모델이 메모리에 통째로 안 들어가면 스왑이 끼어 끔찍하게 느려진다.

모델 크기권장 RAM/VRAM예시 / 비고
1~3BRAM 4GBGemma3 1B, Qwen 1.5B. 노트북 CPU만으로도 실용적
7~8BRAM 8GB / VRAM 6~8GBLlama 3 8B, Mistral 7B. 가장 보편적
13~14BRAM 16GB / VRAM 10GBRTX 3060(12GB)으로 돌아가는 상한선
30~34BVRAM 24GB+RTX 4090, 또는 Apple Silicon 32GB 통합메모리
70B+RAM/VRAM 64GB+서버 영역. 멀티 GPU 필요. 일반 PC 거의 불가
OS가속 백엔드비고
macOS (Apple Silicon)Metal통합 메모리로 가성비 최고. M1+ 권장
LinuxCUDA / ROCm / VulkanNVIDIA가 가장 안정적
WindowsCUDA / ROCm / Vulkan네이티브 지원. WSL 없이도 동작
모든 OSCPU (AVX2)GPU 없어도 작은 모델은 실용적

8직접 해볼 수 있는 실습 과제

난이도별 5가지 과제
과제 1

30분 안에 첫 모델 띄우기 ★ 초급 30분

공식 설치 스크립트로 Ollama를 깔고, 가장 작은 모델부터 띄워본다. 1B는 거의 모든 노트북에서 돈다.

# 설치 (macOS/Linux)
curl -fsSL https://ollama.com/install.sh | sh

# 가장 작은 모델 실행
ollama run gemma3:1b

> 안녕? 자기소개 해줘   # 첫 응답을 받아보면 끝
과제 2

Modelfile로 나만의 캐릭터 모델 ★ 초급 1시간

Dockerfile과 닮은 문법으로 system prompt가 박힌 커스텀 모델을 만든다.

# Modelfile
FROM gemma3:1b
SYSTEM "너는 항상 사투리로 답하는 친절한 비서다."
PARAMETER temperature 0.8
빌드: ollama create 사투리봇 -f Modelfile → 실행: ollama run 사투리봇
과제 3

기존 ChatGPT 코드 로컬로 갈아끼우기 ★★ 중급 2시간

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)
과제 4

코딩 도우미 셋업 (Copilot 대체) ★★ 중급 2시간

VS Code에 Continue 또는 Cline 확장을 깔고 백엔드를 로컬 Ollama로 지정. 코딩 특화 모델로 자동완성을 돌린다.

모델: ollama pull qwen2.5-coder:7b → 확장 설정에서 provider를 ollama, model을 qwen2.5-coder로 지정. Copilot 비용 없이 비슷한 경험.
과제 5

소스 코드 읽고 추론 흐름 추적 ★★★ 고급 4시간

Go를 조금이라도 안다면 cmd/server/routes.gorunner/ 순으로 "한 줄 명령어 뒤에서 벌어지는 일"을 코드로 따라간다.

# 레포 클론 후
git clone https://github.com/ollama/ollama
# routes.go에서 /api/chat 핸들러를 찾아
# 스케줄러 → runner spawn 경로를 추적
# 빌드: go generate ./... && go build .

9관련 기술 심화 학습 로드맵

4주 학습 플랜

1주차: 로컬 LLM 기초 체험

요일학습 내용실습
Ollama 설치 & 기본 명령run / pull / list / ps 직접 실행
모델 크기와 양자화 이해1B/7B/13B 모델 속도 비교
Modelfile 문법SYSTEM/PARAMETER로 커스텀 모델 빌드
REST API 직접 호출curl로 /api/chat 스트리밍 받기
OpenAI 호환 APIPython OpenAI SDK로 로컬 모델 연결

2주차: 내부 동작 이해

요일학습 내용실습
클라이언트-서버 분리serve를 따로 띄우고 run으로 붙기
모델 레이어 & 매니페스트~/.ollama/models 디렉토리 직접 탐색
GPU/메모리 자동 감지OLLAMA_DEBUG=1로 감지 로그 관찰
runner 프로세스 격리실행 중 프로세스 트리 확인
NDJSON 스트리밍스트림 응답을 줄 단위로 파싱

3주차: 소스 코드 & 빌드

요일학습 내용실습
Go 프로젝트 구조 파악cmd/ server/ runner/ 폴더 역할 정리
routes.go 라우팅 분석각 엔드포인트 핸들러 따라가기
CGO와 llama.cpp 바인딩llama/ 패키지의 C 호출부 읽기
소스 빌드로컬에서 go build로 직접 빌드
convert/ 모델 변환safetensors→GGUF 변환 흐름 이해

4주차: 응용 & 통합

요일학습 내용실습
임베딩 & RAG/api/embeddings로 검색 시스템 맛보기
툴 콜링(function calling)tools/ 기능으로 함수 호출 실험
코딩 어시스턴트 통합Continue/Cline + Ollama 백엔드
Docker 배포ollama/ollama 이미지로 서버 운영
종합 프로젝트로컬 모델 + RAG + API를 묶은 앱

10핵심 키워드 사전

이 레포를 이해하는 데 꼭 필요한 용어들
키워드설명
LLMLarge Language Model. 수십억~수조 개 파라미터로 글을 이어쓰는 신경망
런타임프로그램을 실행해 주는 환경. Ollama는 LLM을 띄워주는 런타임
GGUF양자화된 모델 가중치를 담는 단일 파일 포맷. 로컬 추론용 표준
양자화32비트 가중치를 4비트 등으로 압축. 메모리를 1/4~1/8로 줄임 (기본 Q4_K_M)
llama.cppC/C++로 짠 LLM 추론 엔진. Ollama가 CGO로 호출하는 실제 계산기
CGOGo에서 C/C++ 함수를 호출하게 해주는 다리. Go 서버 + C++ 연산 결합
runner추론을 전담하는 자식 프로세스. 죽어도 메인 서버는 생존(장애 격리)
레이어 / 매니페스트모델을 조각으로 쪼개 저장하고, 매니페스트가 그 조합을 기록 (Docker 방식)
레지스트리모델을 보관·배포하는 서버. registry.ollama.ai가 Docker Hub 역할
ModelfileFROM/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의 서버·명령 골격
safetensorsHugging Face 표준 모델 포맷. 로컬 실행엔 GGUF로 변환 필요

11참고 링크

더 깊이 파고들 때 유용한 자료들