Ollama - local sLLM

wldbs._.·2025년 9월 24일

LLM

목록 보기
1/6
post-thumbnail

참고

로컬 vscode에서 Ollama 서버를 띄워보고, 그 위에 다수 sLLM을 띄워보자.

  • Ollama는 Llama 3, Mistral, Gemma 등 최첨단 LLM을 로컬에서 다운로드, 설정 및 실행하는 과정을 단순화하도록 설계된 도구이다.

🧑‍💻 사용 Script

# Linux 환경

# 0-1) Ollama 설치
curl -fsSL https://ollama.com/install.sh | sh

# 0-2) 서비스 기동
ollama serve  # <- 새 터미널에서 계속 켜두기 (기본 포트: 11434)

# Qwen2.5 7B
ollama pull qwen2.5:7b-instruct # Qwen 모델 가중치(및 실행 레시피)가 로컬에 내려옴
ollama run  qwen2.5:7b-instruct # Ollama 서버가 그 Qwen 모델을 로드해서 CPU/GPU로 추론

# -- 프롬프트를 바로 입력해 대화 가능

# 설치되어있는 (pull받은) 모델 목록에서 qwen 확인
# grep -i: 대소문자 구분하지 않고 문자열 탐색
ollama serve
ollama list | grep -i qwen
  • Qwen은 모델이고, Ollama는 그 모델을 내려받아 실행하는 서버 + CLI → ollama가 qwen을 실행해주는 도구

✅ Linux - Ollama 설치

리눅스 상에 Ollama 서버를 설치해보자.

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

대부분의 Linux 배포판에 가장 편리한 방법은 공식 설치 스크립트를 사용하는 것이다.
이 명령은 스크립트를 다운로드하고 sh를 사용하여 실행한다.

  • ollama 서비스를 활성화하고 시작하여 부팅 시 및 백그라운드에서 자동으로 실행되도록 한다!
  • Linux의 Ollama(사용자 설치/수동): macOS와 유사하게 일반적으로 ~/.ollama/models에 저장된다.

  • ollama 서버 설치: 127.0.0.1:11434 (local)

  • 127.0.0.1:11434 접속 결과

✨ 서버 가동

모델을 실행하기 위해서는, 우선 서버를 가동시켜야 한다.

ollama serve

  • 새 터미널을 열어 계속 켜두자! (기본 포트: 11434)

✅ 모델 받기

사용할 sLLM 모델을 받아보자.

아래 페이지에서 사용 가능한 모델의 리스트를 확인할 수 있다.
: 사용 가능한 모델은 Ollama 웹사이트의 라이브러리 페이지에서 찾아볼 수 있다.

Ollama - Search models

아래는 gpt-oss 모델에 대한 리드미 및 사용 방법 일부를 캡처한 것이다.
형광펜으로 표시해둔 것을 리눅스 터미널에서 실행하면 바로 활용할 수 있다.

🎯 나는 qwen2.5:7b-instruct 모델을 사용해보겠다!

# Qwen2.5 7B
ollama pull qwen2.5:7b-instruct # Qwen 모델 가중치(및 실행 레시피)가 로컬에 내려옴
ollama run  qwen2.5:7b-instruct # Ollama 서버가 그 Qwen 모델을 로드해서 CPU/GPU로 추론
  • ollama serve가 실행 중인 상태에서 진행해야 한다!

  • 모델 pull: 내 로컬 서버에 모델을 다운로드 받는 과정이라고 이해했다.
    • 특정 LLM을 실행하기 전에 먼저 가중치 및 구성 파일을 다운로드해야 한다.
    • Ollama는 공개 모델의 선별된 라이브러리를 제공하며, ollama pull을 통해 쉽게 액세스할 수 있다.

  • 모델 run: 바로 질의응답이 가능하다.
    • 다운로드한 모델과 대화하는 가장 직접적인 방법은 ollama run 을 사용하는 것
    • 모델이 준비되고 메모리에 로드되면 대화형 프롬프트가 표시된다!

✨ 모델 확인

  1. 로컬에 저장된 - ollama 서버 내 설치된 모델 리스트 확인: ollama list

  2. 로컬에 저장된 - ollama 서버 내 설치된 qwen 확인: ollama list | grep -i qwen

  1. 모델 저장 경로: ~/.ollama/models

  1. 모델 태그
    아래는 참조 글로부터 들고온 내용이다.

⭐ 양자화(quantization)

  • 딥러닝 모델의 파라미터나 연산을 더 작은 정밀도 로 표현하는 기술
  • 더 낮은 비트수(예: INT8, INT4)로 숫자를 근사해서 저장/연산하는 방법
    • 예: 원래 32비트(약 43억 가지 값)로 표현하던 걸 → 8비트(256가지 값)로 줄여 표현.
  • 이렇게 하면?
    • 메모리 사용량: 줄어듦 (모델을 더 작은 GPU/CPU에서도 실행 가능)
    • 연산 속도: 빨라짐 (특히 CPU, 모바일 환경에서 효과적)
    • 정확도: 약간 손실될 수 있음 (하지만 잘 튜닝하면 거의 유지)

✅ 모델 실습

아래는 Ollama 서버에 띄운 qwen 모델을 활용하여 프롬프틀 이용해 질문과 컨텍스트가 반영된 답변을 생성한 예시이다.

SYSTEM_MSG = (
    "너는 RAG 스타일 답변기다. 제공 컨텍스트만 근거로 한국어로 간결히 답해라. "
    "모르면 모른다고 말해라. 날짜 추정 금지. "
    "출력은 <Answer>…</Answer> 만 포함."
)

...

def build_user_prompt(question: str, ctx_texts: list[str], max_chars=MAX_CHARS) -> str:
    buf, total = [], 0
    for t in ctx_texts:
        t = " ".join(t.split())
        if total + len(t) > max_chars:
            remain = max_chars - total
            if remain > 200:
                buf.append(t[:remain] + "…")
            break
        buf.append(t)
        total += len(t)
    ctx = "\n---\n".join(buf) if buf else "(컨텍스트 없음)"
    return f"질문: {question}\n\n[컨텍스트]\n{ctx}\n\n규칙: 컨텍스트 밖 내용 금지. <Answer>만 출력."
    
...


def main():
    load_dotenv()  # .env에서 OLLAMA_BASE_URL, OLLAMA_API_KEY 읽음
    base_url = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434/v1")
    api_key  = os.getenv("OLLAMA_API_KEY", "ollama")
    client   = OpenAI(base_url=base_url, api_key=api_key)
    
	...

	try:
    	        resp = client.chat.completions.create(
        	        model=MODEL,
            	    messages=[
                	    {"role": "system", "content": SYSTEM_MSG},
                    	{"role": "user", "content": user_msg},
                	],
                	temperature=0.2,
                	max_tokens=700,
            	)
            	answer = resp.choices[0].message.content.strip()
	            latency_ms = int((time.perf_counter() - t0) * 1000)
    	    except Exception as e:
        	    answer = f"<Answer>오류: {e}</Answer>"
            	latency_ms = 0
            
	# 콘솔에 바로 확인
	        print("="*80)
	        print(f"[{i}] Q:", q)
 	       print(f"Latency: {latency_ms} ms")
	        print("Ans:", answer[:400] + ("…" if len(answer) > 400 else ""))

	pd.DataFrame(outputs).to_csv(OUT_PATH, index=False, encoding="utf-8-sig")
	print(f"\n[DONE] saved -> {OUT_PATH} (rows={len(outputs)})")

if __name__ == "__main__":
    main()    
profile
공부 기록용 & 프로젝트 회고용 24.08.05~ #AI/LLM #RAG # Data Science

0개의 댓글