본문으로 바로가기
Lab

올라마(Ollama) 로컬 AI 사용법, 맥에서 직접 돌려 보니

맥에서 올라마로 gpt-oss:20b를 돌려 보니 첫 질문은 5.6초, 두 번째 질문은 1.6초가 걸렸습니다. 로컬 AI를 서버 켜기부터 메모리 확인, API 호출, 서버 끄기까지 실제 명령과 출력 순서대로 따라 할 수 있게 정리했습니다.

·

노트북 안에서 작은 서버와 AI 모델이 돌아가는 모습을 그린 삽화
올라마(Ollama) 로컬 AI 사용법, 맥에서 직접 돌려 보니 표지 삽화

Apple M5 Max(메모리 36 GB) 맥에서 올라마로 gpt-oss:20b에 질문해 봤습니다. 첫 질문은 5.6초, 바로 이어서 한 두 번째 질문은 1.6초가 걸렸습니다. 첫 질문 시간의 대부분은 모델을 메모리에 올리는 시간(load duration 4.567580666s)이었죠. 로컬 AI를 내 맥에서 돌려 보고 싶다면 서버 켜기부터 API 호출, 서버 끄기까지 실제 명령과 출력을 그대로 따라가 보세요.

올라마 사용법, 순서부터 보기

아래 아홉 단계를 한 번씩 차례로 실행했습니다. 모델은 미리 받아 둔 상태였습니다.

  1. 컴퓨터 사양과 올라마 버전 확인
  2. 올라마 서버 켜기
  3. 받아 둔 모델 목록 보기
  4. 모델 정보 보기
  5. 첫 질문(모델 불러오기 포함)
  6. 두 번째 질문(모델이 이미 올라간 상태)
  7. 메모리 사용 확인
  8. API로 부르기
  9. 서버 끄기

아홉 단계 모두 종료 코드 0으로 끝났습니다. 오래 걸린 단계는 첫 질문과 서버 켜기(3초 대기 포함), API 호출 정도였고, 목록·정보·메모리 확인은 0.0초로 찍혔습니다.

맥에서 올라마로 로컬 AI를 돌리기 단계별 걸린 시간을 비교한 막대그래프
단계별로 직접 실행해 잰 시간(열릴 때까지 기다린 시간 포함)
도식출처: 명령 실행 실측

그럼 시작 전에 올라마와 모델은 어떻게 준비할까요? 공식 문서가 안내하는 만큼만 먼저 짚고 넘어가겠습니다.

함께 읽을 글

맥에 올라마를 설치하고 모델 받는 방법

Quickstart에 따르면 macOS용 올라마는 Download Ollama에서 받습니다. 앱을 열거나 터미널에서 아래 명령으로 시작한 뒤 안내를 따르면 됩니다. 이때 로그인해서 클라우드 모델을 쓸지, 로컬 모델을 고를지 정하게 돼요.

shell
ollama

로컬 모델은 API 키 없이 내 컴퓨터에서 돌아갑니다. 이번 실습은 처음부터 끝까지 gpt-oss:20b 모델 하나만 씁니다. 모델은 CLI 레퍼런스의 ollama pull 명령으로 받습니다. 이 측정은 gpt-oss:20b를 미리 받아 둔 상태에서 시작했고, 받는 데 걸린 시간은 재지 않았습니다. 올라마는 Homebrew로 설치한 것을 썼습니다. 같은 조건으로 따라 하려면 실습 전에 아래 명령으로 모델부터 받아 두세요.

ollama pull gpt-oss:20b

다른 모델을 고를 때 참고할 정보도 있습니다. Quickstart의 로컬 예시 모델인 gemma4:e2b는 내려받는 용량이 약 7.2 GB이고, 맥에서는 8 GB의 통합 메모리(unified memory)를 권장합니다. 컨텍스트 창이 클수록 메모리가 더 필요하다고 안내하니, 메모리가 넉넉하지 않은 맥이라면 모델 크기부터 확인하는 편이 좋습니다.

메모리는 얼마나 있어야 할까요? 문서는 gemma4:e2b 기준으로 내려받기가 약 7.2 GB이고, 맥에서는 8 GB의 사용 가능한 통합 메모리를 권장합니다. 컨텍스트 창이 클수록 메모리가 더 필요하다고도 적혀 있습니다. 이 기준은 그 모델 기준이라, 다른 모델은 따로 확인해야 합니다.

서버를 켜고 받아 둔 모델 확인하기

먼저 칩과 메모리, 올라마 버전을 봅니다. 서버가 아직 꺼져 있어서 연결 경고가 함께 나왔습니다.

$ system_profiler SPHardwareDataType | grep -E "Chip|Memory" && ollama --version
Chip: Apple M5 Max
      Memory: 36 GB
Warning: could not connect to a running Ollama instance
Warning: client version is 0.40.8

그래서 서버를 백그라운드로 켜고 3초 기다렸습니다. 나중에 끌 수 있게 프로세스 번호를 serve.pid에 남겨 둔 점이 핵심이에요. 앱 대신 터미널로만 다루고 싶다면 이 방식이 편합니다.

$ ollama serve > serve.log 2>&1 & echo $! > serve.pid; sleep 3; ollama --version
ollama version is 0.40.8

이제 받아 둔 모델 목록과 상세 정보를 확인합니다.

$ ollama list
NAME           ID              SIZE     MODIFIED
gpt-oss:20b    f38aa0c53da5    13 GB    35 hours ago
$ ollama show gpt-oss:20b
Model
    architecture        gpt-oss
    parameters          20.9B
    context length      131072
    embedding length    2880
    quantization        MXFP4
    requires            0.30.0
    template source     harmony

  Capabilities
    completion
    tools
    thinking
        levels     low, medium, high
        default    medium

  Parameters
    temperature    1

  License
    Apache License
    Version 2.0, January 2004
    ...

눈여겨볼 곳은 Capabilities입니다. tools와 thinking이 있고, 생각 수준의 기본값은 medium입니다. 이 모델은 답하기 전에 생각을 거친다는 뜻이고, 뒤에서 토큰 수를 볼 때 이 점이 중요해집니다.

첫 질문과 두 번째 질문의 시간 차이

질문할 때는 생각을 숨기는 --hidethinking, 시간 통계를 찍는 --verbose를 붙였습니다.

$ ollama run gpt-oss:20b --hidethinking --nowordwrap --verbose "로컬 AI가 무엇인지 한 문장으로 설명해 줘"
로컬 AI는 인터넷 연결 없이도 컴퓨터나 모바일 기기 같은 로컬 장치 안에서 실행되는 인공지능 시스템을 말합니다.

total duration:       5.588319041s
load duration:        4.567580666s
prompt eval count:    81 token(s)
prompt eval duration: 83.934ms
prompt eval rate:     965.04 tokens/s
eval count:           84 token(s)
eval duration:        918.97ms
eval rate:            91.41 tokens/s
$ ollama run gpt-oss:20b --hidethinking --nowordwrap --verbose "로컬 AI의 단점 하나를 한 문장으로 말해 줘"
로컬 AI는 대규모 데이터와 최신 모델 업데이트를 지속적으로 제공하기 어려워서 성능이 떨어질 수 있습니다.

total duration:       1.5566475s
load duration:        567.583µs
prompt eval count:    83 token(s)
prompt eval duration: 78.124ms
prompt eval rate:     1062.41 tokens/s
eval count:           134 token(s)
eval duration:        1.475239s
eval rate:            90.83 tokens/s

두 출력을 나란히 놓으면 차이가 분명합니다.

항목첫 질문두 번째 질문
total duration5.588319041s1.5566475s
load duration4.567580666s567.583µs
eval count84 token(s)134 token(s)
eval rate91.41 tokens/s90.83 tokens/s

첫 질문이 왜 느렸을까요? 모델을 불러오는 load duration이 4초를 넘었고, 두 번째에는 마이크로초 단위로 줄었습니다. 반면 글자를 만드는 속도(eval rate)는 두 번 모두 90 tokens/s대로 비슷했죠. 에이전트나 앱에서 로컬 모델을 부른다면 첫 호출만 유난히 느릴 수 있다는 점을 염두에 두는 게 좋습니다.

그런데 두 번째 질문은 토큰이 더 많고 eval duration도 더 길었습니다. 이 측정만으로는 그 원인을 가를 수 없습니다. 같은 질문을 여러 번 돌려 eval count가 얼마나 흔들리는지 직접 확인해 보세요.

메모리를 얼마나 쓰는지 보는 방법

모델이 올라간 상태에서 ollama ps를 실행하면 실행 중인 모델을 볼 수 있습니다.

$ ollama ps
NAME           ID              SIZE     PROCESSOR    CONTEXT    RUNNER      UNTIL
gpt-oss:20b    f38aa0c53da5    12 GB    100% GPU     32768      llamacpp    4 minutes from now

36 GB 맥에서 이 모델은 12 GB를 차지했고 100% GPU로 표시됐습니다. CONTEXT 칸은 32768로, 모델 정보의 context length(131072)와 다르게 찍혔습니다. 다른 도구와 메모리를 나눠 써야 한다면 이 숫자부터 확인해 보세요. 다 쓴 모델은 문서의 ollama stop gemma4처럼 이름을 넣어 멈출 수 있습니다.

숨긴 생각은 API 응답에서 보여요

앱이나 스크립트에서 부를 때는 로컬 서버의 11434 포트로 요청합니다. 응답 중 생각, 답, 토큰 수만 골라 봤습니다.

$ curl -s http://localhost:11434/api/generate -d '{"model":"gpt-oss:20b","prompt":"올라마 API로 부른 질문입니다. 한 문장으로 인사해 줘","stream":false}' | jq '{thinking, response, eval_count, eval_duration}'
{
  "thinking": "The user says: \"올라마 API로 부른 질문입니다. 한 문장으로 인사해 줘\"\n\nThey are speaking Korean: \"올라마 API로 부른 질문입니다. 한 문장으로 인사해 줘\". This means: \"This is a question called via Olama API. Please greet me in one sentence.\" So I should greet them in one sentence. Possibly \"안녕하세요! Olama API에서 호출해 주셔서 감사합니다.\"\n\nWe need to respond in Korean. Let's produce a polite greeting in one sentence. The user might expect a greeting. We can say: \"안녕하세요! Olama API로 호출해 주셔서 반갑습니다.\"\n\nThe requirement: \"한 문장으로 인사해 줘\" means \"Please greet me in one sentence\". So we produce one sentence greeting. So something like: \"안녕하세요! Olama API를 통해 문의 주셔서 감사합니다.\"\n\nLet's provide that.",
  "response": "안녕하세요! Olama API로 호출해 주셔서 반갑습니다.",
  "eval_count": 218,
  "eval_duration": 2444197000
}

response는 인사 한 문장뿐입니다. 그런데 thinking 필드에는 질문을 영어로 풀어 보고 후보 문장을 여러 개 고른 긴 생각이 담겨 있고, eval_count는 218이었죠.

모델 상자 뒤에서 긴 생각 두루마리가 만들어지고 앞으로는 짧은 답 카드 하나만 나오는 개념 삽화
생각을 화면에서 숨겨도 모델은 생각을 먼저 만든 뒤 답을 내놓는다는 점을 그린 개념도입니다.

터미널 질문도 마찬가지였습니다. 생각을 숨겨 화면엔 한 문장만 나왔지만 eval count는 84, 134로 잡혀, 보이는 답보다 많은 토큰이 생성됐습니다. 그래서 응답 속도나 토큰 예산을 잴 때는 답의 길이만 보지 말고, 생각까지 포함된 eval count를 기준으로 삼는 편이 정확합니다.

첫 질문 84, 두 번째 질문 134, API 호출 218 토큰을 비교한 막대그래프
세 답 모두 한 문장이었지만 생성 토큰 수는 84, 134, 218로 잡혔습니다.
도식출처: 근거를 바탕으로 코드가 그린 도식

서버를 끄는 방법

처음에 남겨 둔 프로세스 번호로 서버를 끕니다. 첫 단계와 같은 연결 경고가 다시 나오면 서버가 꺼진 것입니다.

$ kill $(cat serve.pid) && sleep 1 && ollama --version
Warning: could not connect to a running Ollama instance
Warning: client version is 0.40.8

대화형으로 ollama run을 띄웠다면 /bye를 입력해 나오면 됩니다.

코딩 에이전트에도 붙일 수 있을까요?

Quickstart는 프로젝트 폴더에서 코딩 에이전트를 올라마 모델로 띄우는 명령을 안내합니다. 필요하면 올라마가 Claude Code 설치도 제안하고, 실행 중 모델을 고르게 됩니다.

shell
ollama launch claude

Codex CLI는 먼저 설치한 뒤 ollama launch codex를 실행합니다. OpenCode는 ollama launch opencode로 시작하며, 필요하면 올라마가 설치를 제안합니다. 다만 이 글의 측정은 에이전트 연결까지 다루지 않았습니다. 에이전트처럼 호출이 잦은 작업이라면 앞의 첫 호출 지연과 메모리 사용량을 먼저 확인해 보세요.

측정 조건과 한계

단계걸린 시간
1. 컴퓨터와 올라마 확인0.1초
2. 서버 켜기3.0초
3. 받아 둔 모델 보기0.0초
4. 모델 정보 보기0.0초
5. 첫 질문(모델 불러오기 포함)5.6초
6. 두 번째 질문1.6초
7. 메모리 확인0.0초
8. API로 부르기2.6초
9. 서버 끄기1.0초
  • 맥 한 대(Apple M5 Max, 메모리 36 GB, darwin arm64), 올라마 0.40.8, 모델 gpt-oss:20b 하나로 측정했습니다.
  • 새 임시 폴더에서 각 명령을 한 번씩만 실행했습니다. 반복 측정의 평균이 아닙니다.
  • 서버 켜기의 3.0초에는 일부러 기다린 3초가 들어 있습니다.
  • 모델을 받는 시간은 재지 않았습니다.
  • 속도는 컴퓨터 사양과 모델에 따라 크게 달라집니다. 메모리가 적거나 다른 모델을 쓴다면 같은 순서로 직접 실행해 숫자를 다시 확인해 보세요.

참고 자료