본문 바로가기

ML&DL/LLM

Linux에서 Ollama 사용법 On-premise 오픈소스 LLM 사용해보기

 

Ollama는 무엇인가?

Ollama는 복잡한 환경설정이나 코드작성 없이도 터미널 명령 한 줄만으로 로컬 환경(On-premise)에서 최신 오픈소스 LLM을 즉시 다운로드하고 실행할 수 있게 해주는 LLM 실행 및 관리 솔루션이다. 대규모 트래픽용 상용 서빙툴로는 vLLM이더 적합하지만 개발용이나 개인 연구목적으로는 Ollama가 가볍고 간편해서 입문용으로 선택했다.

 

On-premise는 내 서버나 컴퓨터의 실물장비 즉 로컬 GPU로 직접 모델을 돌리는 것을 말한다. 이는 클라우드 API를 활용해 개인 장비 없이 모델의 출력값만 받아오는 방식과 대조된다. 개인적으로 보안관련으로 On-premise에 대한 니즈가 있어서 Ollama를 써보게 되었는데 이것저것 해보면서 얻은 활용법이나 경험을 소개해보려고 한다! 아무것도 몰라도 해볼 수 있을만큼 쉽게 설명하는 것을 목표로 해보겠다.

 

Ollama Quick Start! : CLI로 채팅하기

먼저 Ollama를 설치한다. 나는 리눅스환경이라 command line으로 깔았다. mac, windows는 공홈에서 다운받아 사용하면 된다. (링크)

 

# ollama 설치
curl -fsSL https://ollama.com/install.sh | sh

 

제일 쉽게 사용할 수 있는 방법은 command run을 하는 것이다. 로컬서버를 열고 원하는 모델을 선택 후 실행하면 바로 chat이 가능하다. 모델은 처음 run을 한다면 모델을 load하는 시간이 있어 약간 더 오래 걸린다.

 

  # 서버 연결
  ollama serve
  
  # 새창 열고 -> 원하는 모델 실행
  ollama run smollm2:1.7b

 

모델을 run했을때 아래와 같이 작동한다. 처음이라 모델을 load하고 사용자가 query를 날리면 답을 주고 새로운 query를 기다린다. 대화를 끝내고 싶다면 /bye 나 /exit

 

 

pulling manifest 
pulling 4d2396b16114: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████▏ 1.8 GB                         
pulling fbacade46b4d: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████▏   68 B                         
pulling dfebd0343bdd: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████▏ 1.8 KB                         
pulling 58d1e17ffe51: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████▏  11 KB                         
pulling f02dd72bb242: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████▏   59 B                         
pulling 6c6b9193c417: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████▏  559 B                         
verifying sha256 digest 
writing manifest 
success 
>>> 오늘 서울 날씨 알려줘.
I'm sorry for any confusion, but as an AI text-based model, I don't have real-time capabilities or access to current data such as weather forecasts in 
specific locations. I suggest checking a reliable local weather website or app for the most accurate and up-to-date information.

>>> 너는 누구야?
I'm SmolLM, an AI created by Hugging Face, specifically designed to assist with text translation tasks using DeepL or Google Translate's interface. I 
can translate Spanish into English and vice versa for you. However, I don't have real-time capabilities like weather updates. For that, please use a 
local weather website or app.

>>> 한국어로 말해줘.
I'm sorry for the confusion but as an AI, I don't have the capability to translate text into Korean. Please use a translation tool or language learning 
platform for your request.

>>> exit 
Thank you for understanding. If you need assistance with anything else in the future, feel free to ask. Have a great day!

 

일단 돌리는 건 매우 쉽다. 근데 1.7B 모델을 돌렸더니 너무 멍청해서 쓸 수가 없다.

 

  ollama run mistral:7b

 

자 이제 조금 더 큰 모델인 mistral:7b를 써보자!

 

pulling manifest 
pulling f5074b1221da: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████▏ 4.4 GB                         
pulling 43070e2d4e53: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████▏  11 KB                         
pulling 1ff5b64b61b9: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████▏  799 B                         
pulling ed11eda7790d: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████▏   30 B                         
pulling 1064e17101bd: 100% ▕████████████████████████████████████████████████████████████████████████████████████████████████▏  487 B                         
verifying sha256 digest 
writing manifest 
success 
>>> 한국어 할 수 있어?
 네, 저는 한국어로도 대화를 나눌 수 있습니다. 당신이 물어보고 싶은 것이 있다면 말씀하세요!

예: 저는 서울에서 온 거예요. (I'm from Seoul.)

>>> 오늘 날씨 알려줘.
  현재 날씨는 5월 2일 수요일에 대해 알려드리겠습니다.

서울의 기온은 13 ~ 20도가 예상됩니다. 비가 내리지 않을 것이며, 구름량은 50%입니다.

(Today's weather in Seoul on May 2nd is expected to be from 13 to 20 degrees Celsius. There will be no rain and the cloud cover is estimated at 50%.)

>>> 베이지안 러닝에 대해 설명해줄래?
   네, 저는 베이지안 machine learning (BML)에 대해 설명할 수 있습니다.

BML은 분류나 회귀와 같은 supervised learning 문제를 해결하기 위한 방법론입니다. 이 방법론에서는 우리가 가지고 있는 현재의 데이터(training data)를 통해 새
로운 데이터에 대한 예측을 할 수 있습니다.

BML은 베이지안 정보학의 원리를 기반으로 합니다. 이 방법론에서는 가설과 데이터 간의 불확실성을 수학적으로 표현하고, 이를 통해 우리가 가지고 있는 데이터로부
터 새로운 데이터에 대한 예측을 할 수 있습니다.

BML에서는 가설의 확률분포(posterior probability)를 구하기 위해 贝叶스 정리를 사용합니다. 이는 조건부 확률을 기반으로 할 수 있는 다양한 방법이 있습니다.

예: 이미지 분류, 스팸 필터링, 시계열 데이터 예측, 신뢰도 추정 등에서 BML을 사용할 수 있습니다.

(BML is a method for solving supervised learning problems such as classification and regression using the principles of Bayesian inference. With this 
approach, we can make predictions about new data based on the data we currently have. The basis of BML is Bayesian information theory. By mathematically 
expressing the uncertainty between hypotheses and data, we can use our current data to make predictions for new data. In BML, the posterior probability 
distribution of the hypothesis is computed using Bayes' theorem. There are several methods available for doing this based on conditional probabilities. 
For example, image classification, spam filtering, time series data prediction, confidence estimation, etc. can use BML.)

 

한국어도 하고 설명도 어느정도 한다. 근데 중간에 이상한 한자도 나오긴함 (???) 오늘 날씨는 모르네.. 1월인데 5월날씨.....

Ollama의 자원활용

Ollama는 어디에 모델을 올려서 돌리는지 따로 설정을 안해줘도 자동으로 잡아서 돌린다. GGUF라는 최적화된 format을 활용해서 CPU, GPU간 유연한 메모리 매핑을 해준다. 만약 multi-gpu가 감지되면 별도의 설정없이 분산처리를 한다. 만약 VRAM (GPU)이 부족하더라도 RAM (CPU)으로 오프로딩하여 CPU연산으로 전환한다 (단, 느려짐). 근데 쓰다보니 GPU를 좀 신기하게 써서 gemini한테 물어봤더니 아래처럼 한다고 한다. 참고 바람!

Ollama의 GPU 선택 메커니즘

① 기본 원칙: "다 내꺼야" (Multi-GPU Sharding)

질문자님 서버에 GPU가 2장(GPU 0, GPU 1)이 꽂혀 있다고 가정해 봅시다.

  • Ollama의 행동: "오, GPU가 두 개네? VRAM이 넉넉하니까 모델을 반으로 쪼개서 양쪽에 다 태워야지!"
  • 결과: 자동으로 레이어를 분할해서 두 GPU를 동시에 사용합니다. (속도가 빨라짐)
  • 오해: 한 개만 쓸 줄 알았는데 둘 다 팬이 도니까 "아무거나 막 쓰나?"라고 생각하실 수 있습니다.

② VRAM 부족 시: "빈 자리 찾기"

만약 GPU 0에서 다른 무거운 작업(학습 등)을 돌리고 있어서 VRAM이 꽉 찼다면?

  • Ollama의 행동: "GPU 0은 자리가 없네. 그럼 한가한 GPU 1에만 모델을 올려야겠다."
  • 결과: 이때는 사용 가능한 GPU만 골라서 씁니다.

③ 최후의 수단: "CPU라도 써야지"

모든 GPU가 꽉 찼거나, 모델이 너무 커서 GPU들에 다 안 들어가면?

  • Ollama의 행동: "넘치는 부분은 어쩔 수 없다. CPU(RAM)로 넘기자(Offloading)."
  • 결과: 느려지지만 죽지는 않습니다.

특정 GPU만 쓰게 하려면?

서버 켤때 visible device 제한 하면 된다.

 

# GPU 0번과 1번이 있을 때, 1번만 쓰게 하려면:
CUDA_VISIBLE_DEVICES=1 ollama serve

Ollama 주요 파라미터

  • num_ctx: 2048, 4096, 8192, 32k, 128k 등으로 한세션에서 기억할 수 있는 총 대화량에 대한 제한을 걸 수 있다. 대화량을 길게 잡으면 메모리를 처음부터 많이 잡기때문에 vRAM이 모자라서 RAM까지 넘친다면 CPU 병목으로 속도가 느려질 수 있다. 속도가 느릴 때는 이걸 한번 설정해보면 좋을 것 같다.
  • temperature: 0~1 로 창의적 답변을 원한다면 값을 크게, 안정적 답변이 요구되면 값을 작게 설정하면된다.
  • seed: 아무리 temperature를 고정해도 매번 답변이 다르게 나올 수 있으므로 같은 답변을 원한다면 시드 고정이 필요하다.
  • num_predict: -1이면 무한대(기본), 128,512,1024등 설정하면 된다. 무한루프에 빠지지 않게 넉넉하게 주는게 좋다.
  • repeat_penalty: 기본 1.1, 같은 말을 반복하는 것을 막기위해 쓴다. 앵무새처럼 반복하면 이 값을 높임 

Ollama 파라미터 설정 방법

한 세션 내에서 임시설정

/set parameter {바꾸고싶은 파라미터} {바꾸고싶은 값}

 

ollama run glm-4.7-flash:latest

>>/set parameter num_ctx 4096 # 사람 질문
Set parameter 'num_ctx' to '4096' # AI 답변

영구 설정

모델 파일에서 직접 수정해줘야함

Modelfile이라는 파일을 하나 만듬 (어디에 둬도 상관 X)

 

# 나의 경로: /workspace/Modelfile

FROM glm-4.7-flash:latest

# 시스템 프롬프트
SYSTEM """당신은 도움이 되는 AI 어시스턴트입니다. 사용자의 질문에 정확하고 친절하게 답변합니다."""

# 파라미터 설정
PARAMETER temperature 0.7
PARAMETER top_p 0.9
PARAMETER top_k 40
PARAMETER num_ctx 8192
PARAMETER repeat_penalty 1.1

 

쓰고싶은 모델로 FROM뒤에 설정하고 파라미터 쭉 써주면 된다. system prompt도 쓸 수 있다!

해당 model file로 customize된 glm을 만들어보자. 이름은 my-glm으로 했고 마음대로 지어주면 된다.

 

ollama create my-glm -f /workspace/Modelfile

 

성공적으로 완료되면 이렇게 뜬다.

 

ollama run my-glm

 

그러면 run만 해주면 사용 가능!

어떤 모델을 선택해야할까? 모델명 해석법

Models tab에 들어가면 다양한 모델들이 있다.(링크) 모델카드를 보고 나에게 적합한 모델 (크기나 용도)을 찾아서 쓰면 되고 검색도 가능하다. 근데 모델명을 읽다보면 암호같아서 어떤 모델을 골라야할 지 모를 때가 있다. 그래서 모델명 해석하는 법을 낋여왔다. 아래 예시들을 통해서 괴랄한 모델이름을 읽는 법을 알려주겠다.

Quantization


최근에 나온 glm-4.7-flash 모델을 검색하여 모델카드로 들어갔다. 모델이름은 같은데 버전이 매우 많다. 뭐가 다른걸까?

 

차이점은 모델 사이즈다 !

 

근데 glm-4.7-flash 30B로 파라미터 수가 같은 모델인데 왜 모델 용량이 달라지는 것일까? 그것은 quantization 때문이다. 로컬서버의 경우 용량이 작기때문에 큰 모델을 직접 올리려고 하면 용량이 부족하거나 속도가 너무 느리다. 그래서 많은 LLM quantization 방법들이 나왔고 같은 모델이지만 bit수를 줄여서 (즉 해상도를 낮춘다) 모델 사이즈를 줄이는 방식을 택했다. 기본 bf16(16bit)에서 q8(8bit)로 낮추면 대략 반으로 용량이 줄고 q4(4bit)로 낮추면 거기서 대략 또 반이 좀 안되게 줄어든다.

 

  • glm-4.7-flash:q8_0 = 8bit quantization
  • glm-4.7-flash:q4_K_M = 4bit quantization

 

근데 q4뒤에는 K_M이 붙어있는데 이건 뭘까? 4bit 안에서도 어떤 방식/강도로 양자화를 했는지를 의미한다.  K는 llama.cpp/GGUF 쪽에서 많이 쓰는 K-quants 방식으로 블록 단위로 양자화하는 방식이다. M은 K-quants 안에서도 용량/속도간 trade-off를 어디에 두냐에 따른 등급을 나타낸다. K=S,M,L 가 있고 small, medium, large를 뜻한다. small 일수록 속도는 빠르지만 품질이 안좋다. 아까 봤던 모델을 다시 설명해보자.

 

  • glm-4.7-flash:q8_0 = 8bit quantization
  • glm-4.7-flash:q4_K_M = 4bit quantization, K-quants 양자화 중간정도 적용

 

최대한 최신방식을 쓰는 방향으로 모델을 선택하자. 아래와 같이 요약 가능하다.

  • q4_0 (Legacy): 옛날 방식. 빠르지만 멍청해질 확률이 높음
  • q4_K_M (Recommended): 최신 방식(K-quants). 모델의 중요한 부분은 정밀하게 남기고, 덜 중요한 부분만 압축해서 성능 저하가 거의 없음

Mixture-of-Expert (MoE)

 

 

이번에는 qwen3-coder. 여긴 더 많은 모델이름이 있는데 glm에서는 못보던 용어들이 등장한다.

 

먼저 latest를 살펴보자. latest가 붙은 모델은 최신 모델로 계속 업데이트가 될 수도 있다는 뜻이다. 근데 기본 모델인 qwen3-coder:30b-a3b-q4_K_M보다 size가 작은데 어떤 처리가 된 모델인거냐 싶을 수 있다. 그때는 모델의 해시를 보면 된다. 모델명 아래의 06c1097efce0 해시가 같은 qwen-coder-30b-a3b-q4_K_M과 같은 모델임을 알 수 있다.

 

그 다음으로는 a3b는 무엇을 의미할까? activation 3 billion의 줄임말로 30b중 3b만 활성화한다는 뜻이다. qwen3-coder는 MoE(Mixture-of-experts)가 적용된 모델이라 모델안에 expert subnet들을 가지고 있다. 그래서 모델은 30b 파라미터를 가지고 있지만 inference 단계에서는 매 토큰 일부 expert만 선택적으로 활성화한다.

 

그렇다면 이제 모델명을 다 해석할 수 있게 되었다!

  • qwen3-coder:latest = qwen3-coder:30b-a3b-fp16
  • qwen3-coder:30b-a3b-fp16 = 30b중 3b만 activation되는 MoE구조, 4bit quantization을 하는데 K-quants 양자화 중간정도 적용

Instruction tunning

 

 

gemma3모델인데 한가지 모델명 gemma3:270m-it-qat만 보고 넘어가자.

여기는 it라는게 달려있다. it는 instruction tunning의 약자이다. 이게 달려있는 모델은 어떤 형식에 맞게 대답을 하거나 요약, 코딩등의 사람의 지시에 따르도록 학습한 모델이라 base모델보다 말을 잘들을 확률이 더 높다. 또 qat가 달려있는데 이는 기존 모델 학습 후 양자화를 하는 디폴트 방식과 달리 quantization-aware training으로 학습때부터 양자화를 고려한 방식이다. 아무래도 270m으로 모델사이즈가 작다보니 합축될 것을 미리 대비해서 빡세게 훈련시킨 모델이라고 보면 될 것 같다. 명령을 잘 알아듣는데, 압축해도 멍청해지지 않게 특훈 받은 친구...라고 보면 된다.

 

  • gemma3:270m-it-qat = 270m 파라미터를 가졌는데 instruction tunning되었고 학습시 quantize를 고려

Summary

 

Ollama에 있는 모델로 agent 만들어보기

Opencode 에 ollama 모델 넣어서 무료 coding agent로 활용하기

Coding agent는 내가 짜는거보다 누가 짜놓은걸 쓰는게 훨~~~씬 좋다. 너무나도 잘짜진 open source coding agent로 opencode가 있다. api모델도 돌릴 수 있지만 opensource모델도 돌려볼 수 있는 아주 좋은 친구다. 여기에 ollama model을 추가해보려고 한다.

 

 

기본적으로 opencode에서는 free model들을 지원하고 있지만 최근에 나온 glm-4.7-flash는 아직 없기때문에 ollama에 있는 모델로 models에 추가해보겠다. 

 

방법은 간단한데, 나는 /root/.config/opencode/ 여기가 opencode 경로였는데 여기에 opencode.json을 만들고 아래와 같이 넣었다. (공식문서 참고함)

 

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "ollama": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Ollama (local)",
      "options": {
        "baseURL": "http://localhost:11434/v1"
      },
      "models": {
        "glm-4.7-flash:latest": {
          "name": "GLM 4.7 Flash"
        }
      }
    }
  }
}

 

이렇게 하고 opencode를 껐다 켜면? Ollama tab에 GLM 4.7 flash 가 생겼다. qwen3 coder 넣어서 쓰면 좋을 것 같다.

 

 

Langgraph로 custom agent 만들기

langchain에서도 Ollama를 지원한다. 아래와 같이 불러서 llm모델로 활용하면 된다. 

 

from langchain_ollama import ChatOllama

# 중략...

MODEL_NAME = "gpt-oss:20b"
llm = ChatOllama(
            model=MODEL_NAME,
            temperature=0.7,
        )
agent = create_agent(llm, ALL_TOOLS)

 

나는 notion에 올려줄 글 작성하고 notion에 실제로 발행해주는 agent 만들었는데 잘동작한다. 다들 자신만의 agent를 만드는 즐거운 시간에 활용해보길 바란다. 무려 공짜니깐~

'ML&DL > LLM' 카테고리의 다른 글

LangSmith 간단 사용법  (0) 2026.01.22