본문 바로가기
IT개발/AI 공부

4. 로컬 LLM 구축하기

by jusyBear 2025. 3. 13.
반응형

로컬 LLM 구축하기: Ubuntu 24.04에서 Ollama로 추론 서버 만들기

Ollama 로고

들어가며

인공지능 기술의 발전으로 이제는 누구나 강력한 언어 모델(LLM)을 자신의 컴퓨터에서 실행할 수 있게 되었습니다. 특히 주식, 암호화폐 트레이딩과 같은 민감한 재무 데이터를 다룰 때는 데이터의 프라이버시가 중요하기 때문에 로컬에서 실행되는 LLM의 가치가 더욱 빛납니다.

이 글에서는 Ubuntu 24.04 환경에서 Ollama를 설치하고, 고성능 모델(DeepSeek-R1-Distill-Qwen-32B)을 설정하는 전체 과정을 상세히 알아보겠습니다. 이 가이드를 따라하면 클라우드 API에 의존하지 않고도 강력한 AI 서버를 구축할 수 있습니다.


Ollama란 무엇인가?

Ollama는 로컬 환경에서 대규모 언어 모델(LLM)을 쉽게 실행할 수 있게 해주는 오픈소스 프레임워크입니다. 복잡한 설정 없이도 최신 AI 모델을 로컬 머신에서 실행할 수 있어, API 키나 구독 비용 없이 AI의 힘을 활용할 수 있습니다.

주요 특징:

  • 다양한 오픈소스 모델 지원 (Llama, Mistral, DeepSeek 등)
  • 간단한 명령어로 모델 설치 및 실행
  • REST API를 통한 프로그래밍 인터페이스 제공
  • 컨테이너화된 환경으로 의존성 충돌 방지
  • GPU 가속 지원으로 빠른 추론 성능

Ubuntu 24.04에 Ollama 설치하기

1. 시스템 요구사항 확인

DeepSeek-R1-Distill-Qwen-32B 모델을 쾌적하게 실행하기 위한 권장 사양:
공식적으로는 이보다 더 낮은 사양에서도 실행 가능하다고 안내되어 있지만, 실제 구현 및 테스트 결과, 장문의 답변이나 많은 토큰을 활용한 추론 작업 시 원활한 성능을 보장하려면 다음과 같은 수준의 하드웨어 사양이 필요합니다.

  • CPU: 최신 멀티코어 프로세서 (8코어 이상 권장)
  • RAM: 최소 32GB (64GB 이상 권장)
  • GPU: NVIDIA GPU (24GB VRAM 이상)
  • 저장공간: 최소 50GB 여유 공간

먼저 시스템 사양을 확인해봅시다:

# GPU 정보 확인 (NVIDIA 사용 시)
nvidia-smi

2. 필수 패키지 설치

Ollama 설치에 필요한 기본 패키지들을 설치합니다:

sudo apt update
sudo apt install -y curl wget git build-essential

이 명령어는 시스템 패키지를 최신 상태로 업데이트하고, 필요한 기본 도구들(curl, wget, git, 컴파일러 등)을 설치합니다.

3. NVIDIA GPU 드라이버 설치 (GPU 사용 시)

NVIDIA GPU를 사용하는 경우, 적절한 드라이버와 CUDA를 설치해야 합니다:

# 최신 드라이버 자동 설치
sudo ubuntu-drivers autoinstall

# 재부팅
sudo reboot

# 설치 확인
nvidia-smi


정상적으로 설치되면 다음과 같은 출력이 표시됩니다:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 545.29.06    Driver Version: 545.29.06    CUDA Version: 12.3     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ...  Off  | 00000000:01:00.0  On |                  N/A |
| N/A   45C    P8    21W / 200W |    543MiB / 12288MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

4. Ollama 설치

이제 Ollama를 설치합니다. 공식 설치 스크립트를 사용하면 간단히 설치할 수 있습니다:

# 공식 설치 스크립트 실행
curl -fsSL https://ollama.com/install.sh | sh


설치가 완료되면 다음과 같은 메시지가 표시됩니다:

ollama installed successfully!

5. Ollama 서비스 시작 및 상태 확인

Ollama를 시스템 서비스로 등록하고 시작합니다:

# 서비스 시작
systemctl --user start ollama

# 상태 확인
systemctl --user status ollama

정상적으로 실행 중이라면 다음과 같은 출력이 표시됩니다:

● ollama.service - Ollama Service
     Loaded: loaded (/usr/lib/systemd/user/ollama.service; disabled; preset: enabled)
     Active: active (running) since Fri 2024-07-12 10:15:23 KST; 5s ago
   Main PID: 12345 (ollama)
      Tasks: 12 (limit: 38304)
     Memory: 156.8M
        CPU: 1.235s
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/ollama.service
             └─12345 /usr/bin/ollama serve

6. 자동 시작 설정 (선택사항)

시스템 부팅 시 Ollama가 자동으로 시작되도록 설정합니다:

# 자동 시작 설정
systemctl --user enable ollama

7. 방화벽 설정 (필요한 경우)

Ollama는 기본적으로 11434 포트를 사용합니다. 방화벽을 사용 중이라면 이 포트를 허용해야 합니다:

sudo ufw allow 11434/tcp

# 방화벽 상태 확인
sudo ufw status

DeepSeek-R1-Distill-Qwen-32B 모델 소개

DeepSeek-R1-Distill-Qwen-32B는 최신 오픈소스 언어 모델 중 하나로, 다음과 같은 특징을 가지고 있습니다:

  • 크기: 320억 개의 파라미터
  • 특징: DeepSeek R1 모델을 Qwen 아키텍처로 증류(distill)한 모델
  • 양자화: Q4_K_M 양자화로 원래 모델 크기의 약 25%로 압축됨
  • 성능: 일반 지식, 코딩, 추론 능력이 뛰어남
  • 용도: 특히 금융 데이터 분석과 트레이딩 조언에 적합

이 모델은 원래 크기가 크지만, GGUF 포맷과 양자화 기술을 통해 일반 컴퓨터에서도 실행 가능한 수준으로 최적화되었습니다.


Hugging Face 모델 Ollama에서 사용하기

1. DeepSeek-R1-Distill-Qwen-32B-Q4_K_M-GGUF 모델 설치

Ollama는 pull 명령어로 Hugging Face의 모델을 직접 가져올 수 있습니다:

# 모델 가져오기
ollama pull hf.co/nanowell/DeepSeek-R1-Distill-Qwen-32B-Q4_K_M-GGUF:latest


이 과정은 모델 크기에 따라 수 분에서 수십 분이 소요될 수 있습니다. 다운로드 진행 상황은 다음과 같이 표시됩니다:

pulling manifest 
pulling 63450fca3df64be1... 100% |████████████████████| (143/143 MB, 15.2 MB/s)                  
pulling 8d4b099c881040cd... 100% |████████████████████| (3.4/3.4 GB, 25.3 MB/s)                
verifying sha256 digest
writing manifest

3. 모델 테스트

명령행에서 모델을 테스트해보겠습니다:

# 기본 모델 테스트
ollama run hf.co/nanowell/DeepSeek-R1-Distill-Qwen-32B-Q4_K_M-GGUF:latest



Python을 사용하여 원격 Ollama 서버에 접속하고 모델을 테스트하는 예제입니다:

import requests

def get_models(): 
  url = "http://localhost:11434"  # 실제 서버 IP와 포트로 변경하세요
  response = requests.get(url)
  return response.text

def test_ollama():
    url = "http://localhost:11434/api/generate"  # 실제 서버 IP와 포트로 변경하세요
    payload = {
        "model": "hf.co/nanowell/DeepSeek-R1-Distill-Qwen-32B-Q4_K_M-GGUF:latest",
        "prompt": "Act as an Experienced day trader. Review and evaluate my trading performance over a specified period. Provide comprehensive feedback on areas of strength and areas that need improvement. Calculate various performance metrics, such as the Sharpe ratio, drawdown, win/loss ratio, and return on investment. Offer insights into any discernible patterns or habits that might be affecting my trading outcomes, both positively and negatively. Provide actionable guidance on potential strategies or adjustments that could enhance my future trading results. Ensure all recommendations are based on proven trading principles and best practices.",
        "stream": False
    }

    try:
        response = requests.post(url, json=payload)
        if response.status_code == 200:
            print("Ollama 응답 성공:")
            response_json = response.json()
            print(f"생성 시간: {response_json['created_at']}")
            print(f"응답: {response_json['response']}")
            total_ns = response_json['total_duration']
            total_ms = total_ns / 1_000_000  # ns를 ms로 변환
            minutes = int(total_ms / (1000 * 60))
            seconds = int((total_ms % (1000 * 60)) / 1000)
            milliseconds = int(total_ms % 1000)
            print(f"총 소요 시간: {minutes:02d}m{seconds:02d}s{milliseconds:03d}ms")
            # print(response.json())
        else:
            print(f"에러 발생: {response.status_code}")
            print(response.text)
    except requests.exceptions.ConnectionError:
        print("Ollama 서버에 연결할 수 없습니다. Ollama가 실행 중인지 확인해주세요.")

def main():
  models = get_models()
  print(models)
  test_ollama()

if __name__ == "__main__":
  main()

이 코드를 test_ollama.py로 저장하고 다음 명령어로 실행합니다:

python3 test_ollama.py

참고: 위 예제에서 서버 IP와 포트는 실제 환경에 맞게 변경해야 합니다. 로컬에서 테스트하는 경우 localhost:11434를 사용하세요.

Ollama API 이해하기

Ollama는 RESTful API를 제공하여 프로그래밍 방식으로 모델과 상호작용할 수 있습니다. 주요 API 엔드포인트는 다음과 같습니다:

  1. 모델 목록 조회: GET http://localhost:11434/api/tags
  2. 텍스트 생성: POST http://localhost:11434/api/generate
  3. 대화형 채팅: POST http://localhost:11434/api/chat

각 엔드포인트의 요청 형식과 응답 구조는 Ollama API 문서에서 자세히 확인할 수 있습니다.


성능 최적화 및 문제 해결

1. GPU 메모리 부족 문제

32B 모델은 상당한 VRAM을 요구합니다. GPU 메모리가 부족하면 다음과 같은 방법을 시도해볼 수 있습니다:

# 더 작은 양자화 모델 사용 (예: 7B 모델)
ollama pull hf.co/TheBloke/vicuna-7b-v1.5-16k-GGUF:Q4_K_M

# 또는 Ollama 실행 시 CPU 모드 강제 적용
OLLAMA_HOST=0.0.0.0 OLLAMA_MODELS=/path/to/models OLLAMA_CPU=1 ollama serve

2. RAM 부족 문제

시스템 RAM이 부족한 경우 스왑 공간을 추가할 수 있습니다:

# 16GB 스왑 파일 생성
sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 영구적으로 설정 (재부팅 후에도 유지)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

3. 로그 확인 및 디버깅

문제 발생 시 로그를 확인하는 것이 도움이 됩니다:

# Ollama 로그 확인
journalctl --user -u ollama -f

# 또는 직접 실행하여 로그 확인
ollama serve

고급 사용법: 다중 모델 사용

다양한 목적에 맞는 여러 모델을 설정할 수 있습니다:

# 코딩 전문 모델
ollama pull codellama:7b

# 한국어 특화 모델
ollama pull hf.co/beomi/doremi-7b-gguf:Q4_K_M

# 모델 목록 확인
ollama list

결론

이 글에서는 Ubuntu 24.04에 Ollama를 설치하고 DeepSeek-R1-Distill-Qwen-32B 모델을 설정하여 추론 서버를 구축하는 방법을 살펴보았습니다. 로컬에서 실행되는 LLM의 장점은 다음과 같습니다:

  • 프라이버시: 민감한 재무 데이터가 외부로 전송되지 않음
  • 비용 효율성: API 호출 비용 없이 무제한 사용 가능
  • 커스터마이징: 특정 목적에 맞게 모델 조정 가능
  • 오프라인 사용: 인터넷 연결 없이도 작동

참고 자료

  1. Ollama 공식 문서
  2. DeepSeek-R1-Distill-Qwen-32B 모델 페이지
  3. Ollama GitHub 저장소
  4. GGUF 포맷 문서

참고

  • 해당 글은 직접 작성한 내용을 AI를 통해 가다듬는 방식으로 작성되었습니다.
  • 해당 글의 예시 중 일부는 AI를 통해서 제작되었습니다.
반응형