AI/AI Tool

온프레미스 환경에서 Ollama + Open WebUI로 사내 LLM 구축하기

Somaz 2026. 2. 11. 00:00
728x90
반응형

Overview

최근 AI 기술의 발전으로 ChatGPT, Claude 같은 상용 LLM 서비스가 대중화되었지만, 보안이 중요한 기업 환경에서는 민감한 데이터를 외부 API로 전송하기 어려운 경우가 많다. 이러한 상황에서 온프레미스 환경에 자체 LLM을 구축하면 데이터 보안을 유지하면서도 AI의 이점을 활용할 수 있다.

 

이번 글에서는 NVIDIA GPU가 장착된 물리 서버에 Ollama를 설치하고, Open WebUI를 통해 웹 인터페이스를 제공하는 사내 LLM 시스템을 구축하는 전체 과정을 다룬다.

 

NFS를 활용한 스토리지 관리와 Docker Compose를 이용한 컨테이너 오케스트레이션까지 포함하여 실무에 바로 적용 가능한 완전한 솔루션을 제시한다.

 

 

 

 


 

시스템 구성 및 사전 요구사항

 

하드웨어 환경

본 구성에서 사용한 시스템 스펙은 다음과 같다.

 

 

GPU 서버 (192.168.1.20)

  • CPU: Intel Xeon 6코어
  • RAM: 32GB
  • GPU: NVIDIA GeForce RTX 3060 12GB
  • OS: Ubuntu 24.04 LTS
  • 용도: Ollama 서버

 

 

웹 서버 (192.168.1.21)

  • CPU: 4코어
  • RAM: 16GB
  • OS: Ubuntu 24.04 LTS
  • 용도: Open WebUI

 

 

스토리지 서버 (192.168.1.25)

  • NFS 서버: /storage/ai-data 공유

 

 

 

GPU 호환성 확인

먼저 설치된 GPU의 스펙을 확인한다.

lspci | grep -iE "vga|display|3d"
# 01:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060]

 

 

RTX 3060의 주요 스펙

  • 아키텍처: Ampere (GA106)
  • CUDA 코어: 3,584개
  • VRAM: 12GB GDDR6
  • CUDA Compute Capability: 8.6
  • 권장 드라이버: 525+ (535 안정적)

 

 

 

 


 

 

 

 

1단계: NVIDIA 드라이버 설치

 

 

Secure Boot 상태 확인

mokutil --sb-state
# SecureBoot disabled 또는 SecureBoot enabled 확인
  • Secure Boot이 활성화되어 있으면 드라이버 설치 후 MOK(Machine Owner Key) 등록 과정이 필요하다.

 

 

사용 가능한 드라이버 버전 확인

# 저장소에서 사용 가능한 버전 확인
apt-cache search nvidia-driver

# 특정 버전의 상세 정보 확인
apt-cache show nvidia-driver-535 | grep Version
# Version: 535.288.01-0ubuntu0.24.04.1

 

 

또는 NVIDIA 공식 웹사이트에서 최신 버전 확인

 

 

 

드라이버 설치 및 확인

# 시스템 업데이트
sudo apt update

# NVIDIA 드라이버 설치
sudo apt install -y nvidia-driver-535

# 시스템 재부팅
sudo reboot

재부팅 후 Secure Boot이 활성화되어 있다면 파란색 MOK 관리 화면이 나타난다.

  1. "Enroll MOK" 선택
  2. "Continue" 선택
  3. 설치 시 설정한 비밀번호 입력
  4. "Reboot" 선택

 

 

설치 확인

nvidia-smi

# 정상 설치 시 GPU 정보와 드라이버 버전이 출력된다.


Wed Feb  5 10:15:23 2026       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.288.01             Driver Version: 535.288.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 3060        Off | 00000000:01:00.0 Off |                  N/A |
|  0%   35C    P8              15W / 170W |      0MiB / 12288MiB |      0%      Default |
+-----------------------------------------+----------------------+----------------------+

 

 

 

2단계: Docker 및 NVIDIA Container Toolkit 설치

 

 

 

Docker 설치

 
# Docker 설치 확인
docker --version

# 없을 경우 설치
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable --now docker

# 현재 사용자를 docker 그룹에 추가 (선택사항)
sudo usermod -aG docker $USER

 

 

NVIDIA Container Toolkit 설치

Docker 컨테이너에서 GPU를 사용하기 위해 NVIDIA Container Toolkit이 필요하다.

# GPG 키 추가
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
  sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

# 저장소 추가
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# 패키지 설치
sudo apt update
sudo apt install -y nvidia-container-toolkit

 

 

Docker 런타임 설정

# Docker에 NVIDIA 런타임 설정
sudo nvidia-ctk runtime configure --runtime=docker

# Docker 서비스 재시작
sudo systemctl restart docker

 

 

GPU 접근 테스트

docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi
  • 정상적으로 GPU 정보가 출력되면 설정 완료이다.

 

 

 

3단계: NFS 스토리지 구성

여러 서버에서 모델 파일과 데이터를 공유하기 위해 NFS를 구성한다.

 

 

 

클라이언트 설치 및 마운트

# NFS 클라이언트 설치
sudo apt install -y nfs-common

# 마운트 포인트 생성
sudo mkdir -p /data/llm-models
sudo mkdir -p /data/webui-storage

# NFS 마운트
sudo mount -t nfs4 192.168.1.25:/storage/ai-data/models /data/llm-models
sudo mount -t nfs4 192.168.1.25:/storage/ai-data/webui /data/webui-storage

# 확인
df -h | grep nfs

 

 

영구 마운트 설정

재부팅 후에도 자동으로 마운트되도록 `/etc/fstab` 을 설정한다.

sudo nano /etc/fstab

# 다음 줄 추가
192.168.1.25:/storage/ai-data/models  /data/llm-models     nfs4  defaults,_netdev,rw  0  0
192.168.1.25:/storage/ai-data/webui   /data/webui-storage  nfs4  defaults,_netdev,rw  0  0

 

 

설정 확인

sudo mount -a
df -h | grep nfs

 

 

권한 설정

# Ollama 데이터 디렉토리
sudo chown -R root:root /data/llm-models
sudo chmod 755 /data/llm-models

# Open WebUI 데이터 디렉토리
sudo chown -R root:root /data/webui-storage
sudo chmod 755 /data/webui-storage

 

 

 

 

 

 

 

4단계: Docker 네트워크 구성

Ollama와 Open WebUI가 통신할 수 있도록 공유 네트워크를 생성한다.

# Docker 브리지 네트워크 생성
docker network create ai_network

# 확인
docker network ls
# NETWORK ID     NAME         DRIVER    SCOPE
# abc123def456   ai_network   bridge    local

 

 

 

5단계: Ollama 서버 구축 (GPU 서버)

 

Docker Compose 파일 생성

cat > /opt/ollama/docker-compose.yml << 'EOF'
version: '3.8'

services:
  ollama:
    image: ollama/ollama:0.15.4
    container_name: ollama-server
    restart: unless-stopped
    runtime: nvidia
    
    ports:
      - "11434:11434"
    
    volumes:
      - /data/llm-models:/root/.ollama
    
    environment:
      # 모델 메모리 유지 시간 설정
      # -1: 영구 유지 (언로드 안 함, 항상 메모리에 상주)
      # 0: 즉시 언로드 (사용 후 바로 메모리 해제)
      # 5m: 5분 후 언로드 (기본값)
      # 30m: 30분 후 언로드
      # 1h: 1시간 후 언로드
      # 
      # -1 설정 시:
      #   장점: 첫 응답 이후 매번 빠른 응답 (로딩 시간 없음)
      #   단점: VRAM 계속 점유 (qwen2.5-coder:14b = ~8GB 상시 사용)
      # 
      # 권장: 자주 사용하면 -1, 가끔 사용하면 30m
      - OLLAMA_KEEP_ALIVE=-1
      - NVIDIA_VISIBLE_DEVICES=all
      - OLLAMA_ORIGINS=*
    
    networks:
      - ai_network

networks:
  ai_network:
    name: ai_network
    external: true
EOF

 

 

환경변수 설명

  • OLLAMA_KEEP_ALIVE: 모델 메모리 유지 시간
    • -1: 영구 유지 (첫 로딩 후 항상 메모리에 상주)
    • 5m: 5분 후 자동 언로드 (기본값)
    • 30m: 30분 후 언로드 (권장)
    • 0: 즉시 언로드
  • NVIDIA_VISIBLE_DEVICES=all: 모든 GPU 사용
  • OLLAMA_ORIGINS=*: CORS 허용 (선택사항)

 

 

KEEP_ALIVE 설정 가이드

  • 자주 사용 (1일 10회 이상): -1 (영구 유지) → 빠른 응답
  • 가끔 사용 (1일 3~10회): 30m 또는 1h → 균형
  • 드물게 사용 (1일 1~2회): 5m (기본값) → 메모리 절약

 

 

 

컨테이너 실행

# 디렉토리 이동
cd /opt/ollama

# 컨테이너 실행
docker-compose up -d

# 로그 확인
docker-compose logs -f

# 상태 확인
docker-compose ps

 

 

GPU 사용 확인

# 컨테이너 내부에서 nvidia-smi 실행
docker exec -it ollama-server nvidia-smi

# NFS 마운트 확인
docker exec -it ollama-server df -h /root/.ollama

 

 

 

LLM 모델 다운로드

Ollama는 https://ollama.com/library 에서 다양한 모델을 제공한다.

 

RTX 3060 12GB 기준 권장 모델은 다음과 같다.

 

 

1) DeepSeek-Coder-V2 16B (코딩 특화, 10GB)

docker exec -it ollama-server ollama pull deepseek-coder-v2:16b

 

 

2) Qwen2.5-Coder 14B (코딩, 9.7GB)

docker exec -it ollama-server ollama pull qwen2.5-coder:14b

 

 

3) Qwen3 14B (범용, 11GB)

docker exec -it ollama-server ollama pull qwen3:14b

 

 

4) Qwen2.5-Coder 32B (고성능 코딩, 21GB - CPU 오프로딩)

docker exec -it ollama-server ollama pull qwen2.5-coder:32b

 

 

모델 다운로드 확인

ls -lh /data/llm-models/models/

 

 

모델 테스트

# DeepSeek 16B 테스트
docker exec -it ollama-server ollama run deepseek-coder-v2:16b
>>> Write a Python function to reverse a string

# 종료: Ctrl+D 또는 /bye

 

 

 

모델별 성능 비교 (RTX 3060 12GB 기준)

 

DeepSeek-Coder-V2 16B (10GB)

docker exec -it ollama-server ollama ps

NAME                     ID              SIZE     PROCESSOR    CONTEXT
deepseek-coder-v2:16b    63fb193b3a9b    10 GB    100% GPU     4096


## 메모리 사용량
|   0  NVIDIA GeForce RTX 3060        Off | 00000000:01:00.0 Off |                  N/A |
|  0%   49C    P2              26W / 170W |   9898MiB / 12288MiB |      0%      Default |

 

 

Qwen2.5-Coder 14B (9.7GB)

NAME                 ID              SIZE      PROCESSOR    CONTEXT
qwen2.5-coder:14b    9ec8897f747e    9.7 GB    100% GPU     4096


## 메모리 사용량:
|   0  NVIDIA GeForce RTX 3060        Off | 00000000:01:00.0 Off |                  N/A |
|  0%   50C    P2              44W / 170W |   9482MiB / 12288MiB |      0%      Default |

 

 

Qwen2.5-Coder 32B (21GB - CPU 오프로딩)

NAME                 ID              SIZE     PROCESSOR          CONTEXT
qwen2.5-coder:32b    b92d6a0bd47e    21 GB    45%/55% CPU/GPU    4096


## 메모리 사용량:
|   0  NVIDIA GeForce RTX 3060        Off | 00000000:01:00.0 Off |                  N/A |
|  0%   60C    P2              60W / 170W |  11476MiB / 12288MiB |     17%      Default |

 

 

성능 분석 및 권장사항

모델 크기 VRAM 처리 방식 속도추천  용도
DeepSeek 16B 10GB 9.9GB 100% GPU ★★★★★ 실시간 코딩 지원 (가장 빠름)
Qwen2.5 14B 9.7GB 9.5GB 100% GPU ★★★★☆ 일반 코딩 작업
Qwen3 14B 11GB 11GB 100% GPU ★★★★☆ 복잡한 추론/논리 작업
Qwen2.5 32B 21GB 11.5GB 45% CPU
55% GPU
★★☆☆☆ 고품질 결과 필요 시
(속도 5배 이상 느림)

 

 

핵심 포인트

  • VRAM 12GB 이하 모델 → 100% GPU 처리 → 빠른 응답
  • VRAM 12GB 초과 모델 → CPU 오프로딩 → 매우 느린 응답
  • 실무 권장: DeepSeek 16B (속도와 성능의 균형)

 

 

모델 관리 명령어

# 실행 중인 모델 확인
docker exec -it ollama-server ollama ps

# 모델 언로드 (메모리 확보)
docker exec -it ollama-server ollama stop deepseek-coder-v2:16b
docker exec -it ollama-server ollama stop qwen2.5-coder:32b

# 모델 삭제
docker exec -it ollama-server ollama rm qwen2.5-coder:32b

# 설치된 모든 모델 목록
docker exec -it ollama-server ollama list

 

 

 

 

6단계: Open WebUI 구축 (웹 서버)

Open WebUI는 ChatGPT와 유사한 웹 인터페이스를 제공하는 오픈소스 프로젝트다.

 

 

Docker Compose 파일 생성

cat > /opt/open-webui/docker-compose.yml << 'EOF'
version: '3.8'

services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    restart: unless-stopped
    
    ports:
      - "8080:8080"
    
    volumes:
      - /data/webui-storage:/app/backend/data
    
    environment:
      - OLLAMA_BASE_URL=http://192.168.1.20:11434
      - WEBUI_SECRET_KEY=your-random-secret-key-change-this
      - WEBUI_NAME=Company AI Assistant
      - DEFAULT_MODELS=deepseek-coder-v2:16b,qwen2.5-coder:14b
    
    networks:
      - ai_network

networks:
  ai_network:
    name: ai_network
    external: true
EOF

 

 

환경변수 설명

  • OLLAMA_BASE_URL: Ollama 서버 주소 (컨테이너 간 통신 시 서비스명 또는 IP 사용)
  • WEBUI_SECRET_KEY: 세션 암호화 키 (랜덤 문자열로 변경 필수)
  • WEBUI_NAME: 웹 UI 타이틀
  • DEFAULT_MODELS: 기본 표시 모델 목록

 

 

주의사항

  • 같은 Docker 네트워크 내에서는 http://ollama-server:11434 형식으로 통신 가능
  • 다른 물리 서버에 있다면 IP 주소 사용 (http://192.168.1.20:11434)

 

 

컨테이너 실행

# 디렉토리 이동
cd /opt/open-webui

# 실행
docker-compose up -d

# 로그 확인
docker-compose logs -f

# 상태 확인
docker-compose ps

 

 

 

웹 인터페이스 접속

브라우저에서 `http://192.168.1.21:8080` 접속한다.

 

초기 설정

  1. 회원가입 (첫 사용자는 자동으로 관리자)
  2. 설정 → 모델 → Ollama 연결 확인
  3. 대화 시작

 

 

 

 

 

7단계: API 연동 및 활용

Open WebUI는 OpenAI 호환 API를 제공하여 프로그래밍 방식으로 접근할 수 있다.

 

 

API 키 발급

  1. 웹 UI 로그인
  2. 설정 → Account → API Keys
  3. "Create new secret key" 클릭
  4. 생성된 키 복사 (예: sk-abc123def456...)

 

 

API 호출 예제

 

 

cURL 테스트

curl -X POST http://192.168.1.21:8080/api/chat/completions \
  -H "Authorization: Bearer sk-abc123def456..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-coder-v2:16b",
    "messages": [
      {
        "role": "user",
        "content": "파이썬으로 피보나치 수열 함수를 작성해줘"
      }
    ],
    "stream": false
  }'

 

 

 

Python 예제

import requests
import json

API_URL = "http://192.168.1.21:8080/api/chat/completions"
API_KEY = "sk-abc123def456..."

headers = {
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json"
}

payload = {
    "model": "deepseek-coder-v2:16b",
    "messages": [
        {
            "role": "system",
            "content": "당신은 파이썬 전문 코딩 어시스턴트다."
        },
        {
            "role": "user",
            "content": "이진 탐색 알고리즘을 구현해줘"
        }
    ],
    "temperature": 0.7,
    "max_tokens": 2000
}

response = requests.post(API_URL, headers=headers, json=payload)
result = response.json()

print(result['choices'][0]['message']['content'])

 

 

 

스트리밍 응답 예제

import requests
import json

payload = {
    "model": "qwen2.5-coder:14b",
    "messages": [
        {"role": "user", "content": "REST API란 무엇인지 설명해줘"}
    ],
    "stream": True
}

response = requests.post(
    API_URL, 
    headers=headers, 
    json=payload, 
    stream=True
)

for line in response.iter_lines():
    if line:
        decoded = line.decode('utf-8')
        if decoded.startswith('data: '):
            data = json.loads(decoded[6:])
            if 'choices' in data:
                content = data['choices'][0]['delta'].get('content', '')
                print(content, end='', flush=True)

 

 

 

 

8단계: 모니터링 및 유지보수

 

 

GPU 모니터링

 

 

실시간 GPU 사용량 확인

watch -n 1 nvidia-smi

 

 

 

로그 기반 모니터링

# GPU 사용률 로그
nvidia-smi --query-gpu=timestamp,name,temperature.gpu,utilization.gpu,utilization.memory,memory.used,memory.total \
  --format=csv -l 5 >> /var/log/gpu-usage.log

# 분석
tail -f /var/log/gpu-usage.log

 

 

Docker 컨테이너 관리

# Ollama 재시작
cd /opt/ollama
docker-compose restart

# Open WebUI 재시작
cd /opt/open-webui
docker-compose restart

# 로그 확인 (최근 100줄)
docker-compose logs --tail 100 ollama
docker-compose logs --tail 100 open-webui

# 리소스 사용량 확인
docker stats

 

 

백업 전략

 

 

모델 파일 백업

# NFS 디렉토리 백업
sudo rsync -avz /data/llm-models/ /backup/llm-models-$(date +%Y%m%d)/

 

 

Open WebUI 데이터 백업

# 사용자 설정 및 대화 내역
sudo rsync -avz /data/webui-storage/ /backup/webui-storage-$(date +%Y%m%d)/

 

 

자동 백업 스크립트

cat > /usr/local/bin/backup-ai-system.sh << 'EOF'
#!/bin/bash

BACKUP_DIR="/backup/ai-system"
DATE=$(date +%Y%m%d_%H%M%S)

# 백업 디렉토리 생성
mkdir -p ${BACKUP_DIR}/${DATE}

# 모델 백업 (심볼릭 링크 사용)
ln -sf /data/llm-models ${BACKUP_DIR}/${DATE}/models

# WebUI 데이터 백업
rsync -az /data/webui-storage/ ${BACKUP_DIR}/${DATE}/webui/

# 7일 이상 된 백업 삭제
find ${BACKUP_DIR} -type d -mtime +7 -exec rm -rf {} +

echo "Backup completed: ${BACKUP_DIR}/${DATE}"
EOF

chmod +x /usr/local/bin/backup-ai-system.sh

# Cron 등록 (매일 새벽 2시)
(crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/backup-ai-system.sh >> /var/log/ai-backup.log 2>&1") | crontab -

 

 

 

 

 


 

 

 

 

 

 

 

 

트러블슈팅

 

 

GPU 인식 안됨

증상: `docker exec -it ollama-server nvidia-smi` 실패

 

 

해결

# 드라이버 재설치
sudo apt purge -y nvidia-*
sudo apt install -y nvidia-driver-535
sudo reboot

# Container Toolkit 재설정
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

 

 

Ollama 응답 느림 (32B 모델)

증상: 응답이 매우 느림, GPU 메모리 부족

 

해결: 작은 모델 사용 또는 GPU 업그레이드

# 메모리 효율적인 모델로 전환
docker exec -it ollama-server ollama stop qwen2.5-coder:32b
docker exec -it ollama-server ollama run deepseek-coder-v2:16b

 

 

 

NFS 마운트 실패

증상: mount.nfs4: Connection timed out

 

해결

# NFS 서버 확인
showmount -e 192.168.1.25

# 방화벽 확인 (NFS 서버에서)
sudo ufw allow from 192.168.1.0/24 to any port nfs

# 재마운트
sudo umount /data/llm-models
sudo mount -a

 

 

Open WebUI 연결 오류

증상: "Failed to connect to Ollama"

 

해결

# Ollama API 테스트
curl http://192.168.1.20:11434/api/tags

# 네트워크 확인
docker network inspect ai_network

# 환경변수 수정
cd /opt/open-webui
docker-compose down
# docker-compose.yml에서 OLLAMA_BASE_URL 수정 후
docker-compose up -d

 

 

 

모델 로딩 시간 길어짐

증상: 첫 요청 시 응답까지 10~30초 소요

 

해결: OLLAMA_KEEP_ALIVE 설정 조정

# docker-compose.yml 수정
environment:
  - OLLAMA_KEEP_ALIVE=-1  # 영구 유지로 변경

# 재시작
cd /opt/ollama
docker-compose down
docker-compose up -d

 

 

 

보안 고려사항

 
 

리버스 프록시 설정 (Nginx)

외부 접근 시 HTTPS 적용을 권장한다.

# /etc/nginx/sites-available/ai-assistant
server {
    listen 443 ssl http2;
    server_name ai.company.com;
    
    ssl_certificate /etc/letsencrypt/live/ai.company.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ai.company.com/privkey.pem;
    
    location / {
        proxy_pass http://192.168.1.21:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        
        # WebSocket 지원
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

 

 

사용자 접근 제어

Open WebUI 관리자 페이지에서 다음을 설정한다:

  1. Settings → Users → User Permissions
  2. 사용자별 모델 접근 권한 설정
  3. 일일 요청 제한 설정

 

 

 

 

 

성능 최적화 팁

 

1. 모델 사전 로딩

자주 사용하는 모델을 미리 메모리에 로드한다.

# systemd 서비스 생성
cat > /etc/systemd/system/ollama-preload.service << 'EOF'
[Unit]
Description=Ollama Model Preloader
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
ExecStart=/usr/bin/docker exec ollama-server ollama run deepseek-coder-v2:16b ""
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable ollama-preload
sudo systemctl start ollama-preload

 

 

2. Context Window 조정

긴 대화 시 성능 저하를 방지한다.

# API 호출 시 max_tokens 제한
payload = {
    "model": "deepseek-coder-v2:16b",
    "messages": messages,
    "max_tokens": 1024,  # 적절한 값으로 제한
    "temperature": 0.7
}

 

 

3. 배치 처리

여러 요청을 동시에 처리해야 할 경우 설정을 조정한다.

# docker-compose.yml에 추가
environment:
  - OLLAMA_NUM_PARALLEL=2
  - OLLAMA_MAX_LOADED_MODELS=2

 

 

4. KEEP_ALIVE 최적화 전략

사용 패턴에 따른 권장 설정

 

 

시나리오 1: 개발팀 전용 (하루 종일 사용)

environment:
  - OLLAMA_KEEP_ALIVE=-1  # 영구 유지

 

 

시나리오 2: 부서 공유 (업무 시간만 사용)

environment:
  - OLLAMA_KEEP_ALIVE=1h  # 1시간 유지

 

 

시나리오 3: 간헐적 사용 (가끔 필요)

environment:
  - OLLAMA_KEEP_ALIVE=5m  # 기본값

 

 

 

 


 

 

 

마무리

이번 글에서는 온프레미스 환경에서 Ollama와 Open WebUI를 활용한 사내 LLM 시스템을 구축하는 전체 과정을 다뤘다. NVIDIA GPU 드라이버 설치부터 Docker Compose를 이용한 컨테이너 오케스트레이션, NFS 스토리지 연동, 그리고 실제 운영에 필요한 모니터링과 백업 전략까지 실무에 바로 적용 가능한 내용으로 구성했다.

 

 

핵심 요약

  • RTX 3060 12GB 기준: DeepSeek 16B 모델이 속도와 성능 면에서 최적
  • Docker Compose 활용: 컨테이너 관리를 선언적으로 정의하여 유지보수 용이
  • KEEP_ALIVE 설정: 사용 패턴에 맞춰 -1, 30m, 5m 중 선택
  • NFS 활용: 여러 서버 간 모델 파일 공유로 스토리지 효율 극대화
  • API 연동: OpenAI 호환 API로 기존 워크플로우 통합 가능

 

 

특히 보안이 중요한 금융, 헬스케어, 정부 기관 등에서는 데이터를 외부로 전송하지 않고도 AI의 이점을 활용할 수 있다는 점에서 온프레미스 LLM 구축이 큰 가치를 제공한다. 초기 구축 비용이 들지만 장기적으로는 API 사용료 절감과 데이터 주권 확보라는 두 마리 토끼를 잡을 수 있다.

 

 

향후에는 모델 파인튜닝, RAG(Retrieval-Augmented Generation) 시스템 통합, 그리고 Kubernetes 환경에서의 오케스트레이션 등 고급 주제로 시리즈를 이어가겠다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Reference

 

 

 

Somaz | DevOps Engineer | Kubernetes & Cloud Infrastructure Specialist

728x90
반응형