테마 전환

Ollama 멀티 모델 병렬 실행: Qwen, Llama, DeepSeek 설정 실전

Easton editorial illustration: two-path decision scale

Ollama 0.2부터는 여러 모델을 동시에 실행할 수 있습니다. 코드를 처리하기 위해 ollama run deepseek-coder로 전환하고, 번역을 위해 다시 ollama run qwen2.5로 바꾸면서 매번 십여 초씩 다시 로드되기를 기다릴 필요가 없습니다. 하나의 서비스에서 세 모델을 필요에 따라 호출할 수 있습니다. DeepSeek는 코드를 처리하고, Qwen은 중국어를 처리하며, Llama는 일반적인 질문에 답합니다.

세 가지 환경 변수로 멀티 모델 병렬 실행을 활성화할 수 있습니다. OLLAMA_MAX_LOADED_MODELS는 동시에 로드할 모델 수를, OLLAMA_NUM_PARALLEL은 단일 모델의 동시 처리 수를, OLLAMA_KEEP_ALIVE는 대기 시간을 제어합니다. 이 글에서는 설정 방법과 세 모델 각각의 강점, 메모리 관리 팁을 자세히 설명합니다. 자주 쓰는 모델은 미리 로드하고, 사용 빈도가 낮은 모델은 필요할 때 호출하며, GPU 메모리가 부족하면 시스템 메모리를 활용합니다.

Ollama 멀티 모델 병렬 실행의 기본 설정

먼저 좋은 소식이 있습니다. Ollama 0.2부터 멀티 모델 병렬 실행은 기본 지원 기능입니다. 별도의 플러그인을 설치하거나 복잡한 설정 파일을 다룰 필요가 없습니다. 환경 변수 몇 개만 설정하면 여러 모델을 대기 상태로 둘 수 있습니다.

나쁜 소식은 그래픽 메모리(VRAM)가 부족하면 이 모델들이 시스템 메모리를 가득 채워 컴퓨터가 매우 느려질 수 있다는 점입니다.

세 가지 핵심 환경 변수

터미널을 열고 먼저 다음 세 변수를 살펴보세요.

# 동시에 로드할 수 있는 최대 모델 수
export OLLAMA_MAX_LOADED_MODELS=3

# 단일 모델이 동시에 처리할 수 있는 최대 요청 수
export OLLAMA_NUM_PARALLEL=2

# 최대 대기열 길이(초과하면 새 요청 거부)
export OLLAMA_MAX_QUEUE=512

OLLAMA_MAX_LOADED_MODELS가 핵심입니다. 값을 3으로 설정하면 Qwen, Llama, DeepSeek 세 모델을 동시에 실행할 수 있습니다. 하지만 무작정 큰 값으로 설정해서는 안 됩니다. 이 값은 하드웨어의 제약을 받습니다. 메모리 요구 사항은 뒤에서 자세히 설명하겠습니다.

OLLAMA_NUM_PARALLEL은 단일 모델의 동시 처리 능력을 제어합니다. 서비스가 여러 요청을 동시에 받는다면 이 값을 조금 높일 수 있습니다. 하지만 개인적으로 사용하는 경우라면 기본값만으로도 충분합니다.

시스템 서비스 설정(Linux)

systemd로 Ollama 서비스를 관리하고 있다면(대부분의 Linux 배포판에서 기본으로 사용하는 방식) 설정도 간단합니다.

sudo systemctl edit ollama.service

열린 편집기에 다음 내용을 추가합니다.

[Service]
Environment="OLLAMA_MAX_LOADED_MODELS=3"
Environment="OLLAMA_NUM_PARALLEL=2"
Environment="OLLAMA_KEEP_ALIVE=30m"

저장하고 종료한 다음 서비스를 다시 시작합니다.

sudo systemctl restart ollama

OLLAMA_KEEP_ALIVE는 꽤 흥미로운 변수입니다. 모델이 메모리에서 얼마나 오래 ‘대기’할지를 제어합니다. 30m으로 설정하면 모델이 로드된 뒤 메모리에 30분간 유지되므로 다음 호출 때 다시 로드할 필요가 없습니다. 계속 대기 상태로 두고 싶다면 -1로 설정할 수 있습니다.

메모리가 충분한지 판단하는 방법

설정은 끝났지만 메모리가 충분할까요?

대략적으로 계산하면 7B 모델에는 약 45GB VRAM(FP16 양자화)이 필요하고, 14B 모델에는 810GB가 필요합니다. 7B 모델 세 개를 동시에 로드하려면 최소 16GB VRAM이 있는 그래픽 카드가 필요합니다.

제가 사용하는 RTX 3060은 VRAM이 12GB뿐입니다. 7B 모델 두 개는 원활하게 실행되지만 세 번째 모델은 시스템 메모리를 빌려 써야 하므로 속도가 크게 떨어집니다. Mac(Apple Silicon)을 사용한다면 시스템 메모리와 GPU 메모리가 공유되므로 32GB 통합 메모리로 세 모델을 충분히 실행할 수 있습니다.

세 가지 주요 모델의 특징과 선택 전략

설정이 끝났으니 이제 세 모델을 어떻게 선택할지 살펴보겠습니다. 솔직히 저도 처음에는 꽤 고민했습니다. 세 모델을 모두 다운로드했지만 사용할 때마다 어떤 모델을 호출해야 할지 몰랐습니다. 한동안 직접 써 본 뒤에야 몇 가지 규칙을 정리할 수 있었습니다.

Qwen: 중국어와 다국어의 강자

Alibaba가 오픈 소스로 공개한 Qwen 시리즈는 중국어 능력이 정말 뛰어납니다. 저는 Qwen으로 중국어 문서를 여러 번 작성하고 영어 기술 문서 몇 편을 번역해 봤는데 결과가 모두 좋았습니다. 공식 데이터에 따르면 Qwen은 100개가 넘는 언어를 지원합니다. 중국어와 영어뿐 아니라 일본어, 한국어, 프랑스어, 스페인어도 처리할 수 있습니다.

중국어 콘텐츠를 자주 처리하거나 다국어 번역을 한다면 Qwen이 첫 번째 선택입니다. 저는 qwen2.5:7b로 5,000자 분량의 기술 문서를 번역해 봤는데, 번역 품질이 많은 온라인 번역 도구보다 훨씬 좋았습니다. 특히 기술 용어를 번역할 때 ‘API endpoint’를 ‘API 종점’처럼 어색한 단어로 옮기지 않습니다.

Llama: 가장 균형 잡힌 범용 능력

Meta의 Llama 시리즈는 오픈 소스 모델의 ‘맏형’ 같은 존재입니다. 작업 유형이 확실하지 않다면 Llama를 사용해도 대부분 큰 문제가 없습니다.

Llama의 큰 장점 중 하나는 상업용 라이선스가 매우 관대하다는 점입니다. 제품의 월간 활성 사용자가 700만 명을 넘지 않는다면 무료로 상업적 이용이 가능합니다. 많은 독립 개발자와 소규모 팀에는 꽤 중요한 고려 사항입니다.

또 다른 장점은 컨텍스트 창이 크다는 점입니다. Llama 3.2의 컨텍스트는 128K tokens에 달합니다. 소설 한 권이 거의 통째로 들어갈 정도입니다. 아주 긴 문서를 처리해야 한다면 이 장점이 두드러집니다.

DeepSeek: 코딩과 추론을 위한 강력한 도구

DeepSeek는 제가 최근에야 사용하기 시작했지만 금방 마음에 들었습니다. 특히 코딩 작업에서 보여 준 성능은 예상 밖이었습니다. 생성된 코드의 품질이 상당히 높고 코드의 논리도 능동적으로 설명해 줍니다.

Premai의 비교 보고서에 따르면 DeepSeek의 추론 비용은 비슷한 모델보다 95% 낮습니다. 대량의 추론 작업이 필요한 사람에게는 실질적인 장점입니다. 비용이 낮다는 것은 제한된 하드웨어에서 더 많은 작업을 실행할 수 있다는 뜻입니다.

어떤 모델을 선택할까? 표 하나로 정리하기

작업 유형추천 모델이유
중국어 글쓰기, 번역Qwen중국어 능력이 가장 뛰어나며 100개 이상의 언어 지원
다국어 콘텐츠Qwen우수한 다국어 처리 능력
코드 생성, 디버깅DeepSeek코딩 능력이 뛰어나고 설명이 명확함
기술적 추론, 분석DeepSeek추론 비용이 가장 낮고 효율이 높음
일반 질의응답, 대화Llama능력이 균형 잡혀 있어 무난함
긴 문서 처리Llama128K 컨텍스트 창
상업용 프로젝트(<700M MAU)Llama상업용 라이선스가 가장 관대함

제 개인적인 사용 방식은 이렇습니다. 코드를 작성할 때는 DeepSeek, 중국어 문서를 작성할 때는 Qwen, 영어 콘텐츠나 유형이 확실하지 않은 작업에는 Llama를 사용합니다. 세 모델의 역할이 명확히 나뉘어 있어 어떤 모델을 사용할지 고민할 일이 거의 없어졌습니다.

모델 전환과 메모리 관리

솔직히 여러 모델을 처음 사용할 때 가장 큰 불편은 전환 속도가 너무 느리다는 점이었습니다. 다른 모델을 호출할 때마다 한참 기다려야 했습니다. 모델이 다시 로드되고 그래픽 카드 팬이 요란하게 돌아가는 동안 기다리는 느낌은 정말 좋지 않았습니다. 나중에서야 이 지연 시간을 최적화할 수 있다는 것을 알았습니다.

모델 전환은 왜 지연될까?

모델 전환 지연은 대략 1030초입니다. 정확한 시간은 모델 크기, 디스크 읽기·쓰기 속도, 메모리 상태에 따라 달라집니다. 7B 모델을 디스크에서 GPU로 로드하는 데는 약 1015초가 걸리고, 14B 모델은 20~30초가 걸릴 수 있습니다.

이런 지연은 실제 사용 중에 상당히 번거롭습니다. 특히 코드를 디버깅할 때 DeepSeek로 함수를 생성한 직후 Qwen으로 주석을 번역하고 싶은데 오래 기다려야 하는 상황이 그렇습니다.

keep_alive: 모델을 ‘계속 대기’ 상태로 유지하기

해결 방법은 앞서 언급한 OLLAMA_KEEP_ALIVE입니다.

원리는 간단합니다. 모델을 한 번 로드한 뒤 메모리에서 언로드하지 않고 유지합니다. 다음에 같은 모델을 호출하면 다시 로드하지 않고 바로 사용할 수 있습니다.

전역으로 설정할 수 있습니다.

export OLLAMA_KEEP_ALIVE=30m  # 모델 로드 후 30분간 유지
# 또는
export OLLAMA_KEEP_ALIVE=-1   # 수동으로 언로드할 때까지 무기한 유지

개별 요청에서 이 설정을 덮어쓸 수도 있습니다.

curl http://localhost:11434/api/generate \
  -d '{"model": "qwen2.5:7b", "prompt": "", "keep_alive": "60m"}'

빈 요청(prompt가 비어 있음)을 보내면 모델이 로드된 뒤 메모리에 유지됩니다. 자주 사용하는 모델을 미리 로드해 두면 이후 호출에 즉시 응답할 수 있으므로 좋은 사전 로드 방법입니다.

모델 수동 언로드

메모리가 부족하다면 특정 모델을 수동으로 언로드할 수 있습니다.

curl http://localhost:11434/api/generate \
  -d '{"model": "qwen2.5:7b", "keep_alive": 0}'

keep_alive를 0으로 설정하면 모델이 메모리에서 즉시 언로드됩니다. 모델 파일이 삭제되는 것은 아니며, 사용 중인 메모리만 해제됩니다.

모델 크기별 메모리 요구 사항

다음 표는 제가 한동안 정리한 참고용 데이터입니다(커뮤니티 피드백과 직접 측정한 결과를 바탕으로 함).

모델 크기FP16 양자화Q4 양자화권장 그래픽 카드
7B14-16GB4-5GBRTX 3060(12GB) 이상
14B28-32GB8-10GBRTX 4070(12GB) 이상
32B64-70GB18-20GBRTX 4090(24GB) 이상

제가 사용하는 RTX 3060에는 12GB VRAM이 있습니다. Q4 양자화를 사용하면 14B 모델 하나와 7B 모델 하나 또는 7B 모델 세 개를 동시에 실행할 수 있습니다. 세 번째 모델은 시스템 메모리를 사용하므로 속도가 다소 느려지지만 중단되지는 않습니다.

그래픽 카드의 VRAM이 부족하더라도 시스템 메모리가 충분하다면(32GB 이상) CPU 추론을 사용할 수 있습니다. 속도는 훨씬 느리지만 실행은 가능합니다. 때로는 실행할 수 있다는 것만으로도 충분합니다.

작은 팁: 자주 쓰는 모델부터 로드하기

저는 가장 자주 사용하는 모델을 GPU에 먼저 로드하고, 다른 모델은 시스템 메모리를 사용하도록 합니다.

예를 들어 제 워크플로에서는 DeepSeek를 가장 많이 사용하므로 GPU에서 계속 대기하도록 둡니다. Qwen과 Llama는 덜 사용하기 때문에 호출할 때만 로드하며, 경우에 따라 시스템 메모리를 사용할 수 있습니다.

이렇게 구성하면 자주 하는 작업은 가장 빠르게 응답하고, 사용 빈도가 낮은 작업은 조금 느리게 처리되어 전체적인 사용 경험이 좋아집니다. 자신의 사용 습관에 맞춰 이 순서를 조정할 수 있습니다.

실전 활용 시나리오

이론은 충분히 살펴봤으니 이제 실제로 어떻게 사용할 수 있는지 알아보겠습니다. 아래는 제가 자주 사용하는 몇 가지 시나리오로, 여러분에게도 참고가 될 수 있습니다.

코딩 도우미: 코드 + 문서

제가 가장 많이 사용하는 시나리오입니다. 코드를 작성할 때 두 모델을 함께 사용합니다.

  • DeepSeek로 코드 로직 생성, 코드 설명, 버그 디버깅
  • Qwen으로 코드 주석 번역, 중국어 문서 생성

예를 들어 API 인터페이스를 작성할 때 먼저 DeepSeek로 코드 골격을 생성합니다.

curl http://localhost:11434/api/generate \
  -d '{"model": "deepseek-coder:6.7b", "prompt": "사용자 등록과 로그인을 처리하는 Express.js RESTful API를 작성해 줘"}'

코드를 생성한 다음 Qwen을 사용해 주석을 중국어로 번역합니다.

curl http://localhost:11434/api/generate \
  -d '{"model": "qwen2.5:7b", "prompt": "이 코드의 영어 주석을 중국어로 번역해 줘:\n[코드 내용]"}'

두 모델이 역할을 나누면 한 모델만 사용할 때보다 효율이 훨씬 높습니다. DeepSeek가 생성한 코드는 품질이 상당히 안정적이며 Qwen의 번역도 자연스럽고 매끄럽습니다.

지능형 고객 지원: 중국어·영어 이중 언어

해외 사용자를 대상으로 고객 지원 시스템을 만든다면 다음과 같이 구성할 수 있습니다.

  • Llama로 영어 사용자의 문의 처리
  • Qwen으로 중국어 사용자의 문의 처리

구현도 복잡하지 않습니다. 사용자 입력의 언어를 감지한 다음 해당 모델을 호출하면 됩니다.

import requests

def get_response(user_input, language):
    model = "llama3.2:3b" if language == "en" else "qwen2.5:7b"

    response = requests.post(
        "http://localhost:11434/api/generate",
        json={"model": model, "prompt": user_input, "stream": False}
    )

    return response.json()["response"]

이렇게 하면 각 사용자가 자신의 언어로 자연스러운 답변을 받을 수 있어 단일 언어 모델보다 훨씬 나은 경험을 제공합니다.

지식 질의응답: 추론 + 대화

사용자의 질문 유형에 따라 서로 다른 처리 방식이 필요할 때도 있습니다.

  • DeepSeek로 추론이 필요한 질문 처리(예: ‘왜’, ‘어떻게’)
  • Llama로 개방형 질문 처리(예: ‘어떻게 생각해’, ‘네 의견은 어때’)

추론 문제에는 논리적 분석이 필요하며 DeepSeek는 추론 능력이 강해 답변이 더 체계적입니다. 개방형 질문은 엄밀한 추론이 필요하지 않아 Llama의 답변이 더 자연스럽고 대화에 가깝습니다.

질문의 키워드로 유형을 판단할 수 있습니다. 예를 들어 질문에 ‘왜’, ‘원인’, ‘원리’가 포함되면 DeepSeek를 사용하고, ‘어떻게 생각해’, ‘네 의견은 어때’, ‘이야기해 줘’가 포함되면 Llama를 사용합니다.

전체 호출 예제

다음은 작업 유형에 따라 자동으로 모델을 선택하는 간단한 Python 스크립트입니다.

import requests

def call_ollama(task_type, prompt):
    """작업 유형에 따라 적절한 모델 선택"""

    model_map = {
        "code": "deepseek-coder:6.7b",
        "chinese": "qwen2.5:7b",
        "english": "llama3.2:3b",
        "reasoning": "deepseek-coder:6.7b",
        "general": "llama3.2:3b"
    }

    model = model_map.get(task_type, "llama3.2:3b")

    # 모델 사전 로드(선택 사항)
    requests.post(
        "http://localhost:11434/api/generate",
        json={"model": model, "prompt": "", "keep_alive": "30m"}
    )

    # 실제 호출
    response = requests.post(
        "http://localhost/11434/api/generate",
        json={"model": model, "prompt": prompt, "stream": False}
    )

    return response.json()["response"]

# 호출 예제
result = call_ollama("code", "피보나치 수열의 N번째 항을 계산하는 Python 함수를 작성해 줘")
print(result)

이 스크립트는 간단하지만 기본적인 멀티 모델 라우팅을 이미 구현하고 있습니다. 필요에 따라 작업 유형을 더 추가하거나, 선택 로직을 더 복잡하게 만들거나, 세 모델의 답변을 종합하도록 확장할 수 있습니다.

참고로 Ollama의 기본 사용법을 더 자세히 알고 싶다면 이 시리즈의 앞선 두 글인 《Ollama 입문: 로컬에서 대규모 언어 모델을 실행하는 첫걸음》과 《Ollama Modelfile 매개변수 상세 설명》을 참고해 보세요. 이 글은 그 내용을 이어서 멀티 모델 배포라는 고급 주제를 다룹니다.

설정 빠른 참조표

변수권장값역할
OLLAMA_MAX_LOADED_MODELS2-3동시에 로드할 모델 수
OLLAMA_NUM_PARALLEL2단일 모델의 동시 요청 수
OLLAMA_KEEP_ALIVE30m 또는 -1모델 대기 시간
OLLAMA_MAX_QUEUE512대기열 길이

마무리

지금까지 많은 내용을 살펴봤지만 핵심은 세 가지입니다.

  1. 세 가지 환경 변수를 설정하면 여러 모델을 병렬로 실행할 수 있습니다. OLLAMA_MAX_LOADED_MODELS는 모델 수를, OLLAMA_KEEP_ALIVE는 대기 시간을 제어합니다.

  2. 작업에 따라 모델을 선택합니다. 코드는 DeepSeek, 중국어는 Qwen, 범용 작업은 Llama를 사용하세요. 각 모델마다 강점이 다르므로 지나치게 고민할 필요는 없습니다.

  3. 메모리 관리가 중요합니다. 자주 쓰는 모델은 미리 로드하고, 사용 빈도가 낮은 모델은 필요할 때 호출합니다. GPU 메모리가 부족하면 시스템 메모리를 활용해도 됩니다.

16GB 이상의 VRAM이 있는 그래픽 카드나 32GB 이상의 통합 메모리가 있는 Mac을 사용한다면 세 모델을 병렬로 배포해 보세요. 처음에는 어느 정도 시행착오가 있을 수 있지만 설정을 마치면 단일 모델보다 훨씬 좋은 경험을 얻을 수 있습니다. 자주 전환하거나 로드를 기다릴 필요가 없어 상당히 매끄럽게 사용할 수 있습니다.

궁금한 점이 있거나 어려움을 겪었다면 댓글로 공유해 주세요. 저도 계속 배우는 중이므로 여러분이 겪은 문제에 마침 답을 알고 있을지도 모릅니다.

FAQ

그래픽 카드의 VRAM이 8GB뿐인데 여러 모델을 실행할 수 있나요?
가능하지만 더 작은 양자화 모델(예: Q4 양자화 7B 모델)을 사용하는 것이 좋습니다. 7B Q4 모델 두 개에는 약 8~10GB VRAM이 필요하며, 세 번째 모델은 시스템 메모리를 사용하므로 속도가 다소 느려집니다.
세 모델을 동시에 실행하면 전력 소모가 큰가요?
GPU가 최대 부하로 작동하면 전력 소모가 늘어나지만, 모델이 대기 중일 때는 소비 전력이 낮습니다. 자주 사용할 필요가 없다면 `OLLAMA_KEEP_ALIVE` 시간을 줄여 비활성 모델이 자동으로 언로드되도록 할 수 있습니다.
어떤 모델을 사용해야 할지 어떻게 판단하나요?
간단한 원칙은 코드 작업에는 DeepSeek, 중국어 콘텐츠에는 Qwen, 확실하지 않거나 영어 콘텐츠에는 Llama를 사용하는 것입니다. 특정 유형의 작업을 자주 처리한다면 해당 모델을 미리 로드해 응답 속도를 높일 수 있습니다.

2분 읽기 · 게시일: 2026년 4월 6일 · 수정일: 2026년 9월 4일

댓글

GitHub로 로그인하여 댓글을 남기세요

Easton BlogEaston Blog