Ollama의 동시 요청 처리 방식

Ollama의 동시성, 대기열 처리 방식, 그리고 안정적이고 병렬적인 요청을 위해 OLLAMA_NUM_PARALLEL을 조정하는 방법을 이해하세요.

Page content

이 가이드는 Ollama가 병렬 요청을 처리하는 방법(동시성, 대기열, 자원 제한)과 OLLAMA_NUM_PARALLEL 환경 변수(및 관련 설정 항목)를 사용하여 이를 조정하는 방법을 설명합니다.

러타임과 하드웨어 전반에 걸친 처리량(throughput), 지연 시간(latency), VRAM, 벤치마크에 대해 자세히 알고 싶다면 LLM 성능: 벤치마크, 병목 및 최적화를 참고하세요.

멀티스텟 에이전트는 샘플링이 불안정할 때 재시도 횟수를 배가시킵니다. Qwen 및 Gemma 계열 모델의 기본 temperature, top_p, 패널티 선택 사항에 대해서는 Qwen 및 Gemma를 위한 에이전틱 추론 매개변수를 참고하세요.

five awesome llamas are standing in the field

동시 요청 처리

  • 병렬 처리: Ollama는 요청의 동시 처리를 지원합니다. 시스템에 사용 가능한 메모리가 충분하다면(CPU 추론의 경우 RAM, GPU 추론의 경우 VRAM), 여러 모델이 동시에 로드될 수 있으며, 각 로드된 모델은 여러 요청을 병렬로 처리할 수 있습니다. 이는 OLLAMA_NUM_PARALLEL 환경 변수로 제어되며, 이 변수는 각 모델이 동시에 처리할 수 있는 최대 병렬 요청 수를 설정합니다. 기본적으로 이는 4로 설정되어 있습니다(또는 메모리 가용성에 따라 1로 설정될 수 있으며), 조정할 수 있습니다.

  • 배칭(Batching): 동일한 모델에 대한 여러 요청이 동시에 도착하면, Ollama는 이를 묶어(batching) 함께 처리합니다. 이는 두 요청이 모두 병렬로 처리되고, 사용자가 동시에 응답이 스트리밍되는 것을 볼 수 있음을 의미합니다. 서버는 배치를 채우기 위해 의도적으로 대기하지 않습니다. 요청이 이용 가능해지자마자 처리가 시작됩니다.

대기열(Queuing)과 제한

  • 대기열: 동시 요청 수가 설정된 병렬성(예: 모델 하나당 OLLAMA_NUM_PARALLEL보다 많은 요청)을 초과하면, 추가 요청은 대기열에 들어갑니다. 대기열은 선입선출(FIFO) 방식으로 작동합니다.

  • 대기열 제한: 대기열에 들어갈 수 있는 최대 요청 수는 OLLAMA_MAX_QUEUE(기본값: 512)로 제어됩니다. 대기열이 가득 차면, 새 요청에는 서버가 과부하 상태임을 나타내는 503 에러가 반환됩니다.

  • 모델 로딩: 동시에 로드될 수 있는 서로 다른 모델의 수는 OLLAMA_MAX_LOADED_MODELS로 제어됩니다. 요청이 새 모델을 로드해야 하는데 메모리가 부족하면, Ollama는 공간을 확보하기 위해 유휴 모델을 언로드하고, 모델이 로드될 때까지 요청은 대기열에 남아 있습니다.

예시 시나리오

동일한 모델에 대한 두 요청이 동시에 도착하고 서버의 병렬성이 최소 2 이상으로 설정되어 있다면, 두 요청은 배치가 되어 함께 처리되고, 두 사용자는 동시에 응답을 받게 됩니다. 병렬성이 1로 설정되어 있다면, 한 요청은 즉시 처리되고 다른 요청은 첫 번째 요청이 완료될 때까지 대기열에 들어갑니다.

요청이 서로 다른 모델을 대상으로 하고 충분한 메모리가 있다면, 두 모델 모두 로드되어 요청이 병렬로 처리될 수 있습니다. 그렇지 않으면, 하나의 모델을 언로드해야 할 수 있으며, 요청은 대기열에 들어갑니다.

요약 테이블

시나리오 결과
두 요청, 동일한 모델, 충분한 병렬성 두 요청 모두 병렬로 함께 처리됨 (배칭)
두 요청, 동일한 모델, 병렬성=1 한 요청 처리됨, 두 번째 요청은 첫 번째가 완료될 때까지 대기
두 요청, 서로 다른 모델, 충분한 메모리 두 모델 모두 로드됨, 요청 병렬로 처리됨
두 요청, 서로 다른 모델, 메모리 부족 메모리 사용 가능하거나 모델이 언로드될 때까지 한 요청 대기

요약하자면, Ollama는 서버가 동시성을 위해 구성되고 충분한 자원이 있는 경우 여러 동시 요청을 효율적으로 처리하도록 설계되어 있습니다. 그렇지 않으면 요청은 대기열에 들어가고 순서대로 처리됩니다.

OLLAMA_NUM_PARALLEL을 높여도 지연 시간이 더 이상 안정적으로 유지되지 않고 실제 트래픽 하에서 대기열이 계속 증가한다면, 이는 목적에 맞는 서빙 엔진으로의 전환을 고려할 때 고려할 가치가 있는 명확한 신호 중 하나입니다. Ollama에서 vLLM으로: 로컬 LLM 서버 마이그레이션 시점는 이 결정 과정을 다루며, vLLM이 동시 요청이 서로를 저하시키는 것을 방지하기 위해 사용하는 메커니즘인 연속 배칭(continuous batching)과 PagedAttention을 포함합니다.

메모리 부족 처리

Ollama가 incoming 요청을 처리하기에 메모리가 부족하다는 것을 발견하면, 안정성을 유지하기 위해 대기열 메커니즘과 자원 관리 전략의 조합을 사용합니다:

요청 대기열

  • 메모리를 즉시 할당할 수 없을 때, 새 요청은 FIFO(선입선출) 대기열에 배치됩니다.
  • 대기열 크기는 OLLAMA_MAX_QUEUE(기본값: 512 요청)로 제어됩니다.
  • 대기열이 용량에 도달하면, 새 요청에는 503 “서버 과부하” 에러가 반환됩니다.

모델 관리

  • 활성 모델은 대기열 요청을 위한 자원을 확보하기 위해 유휴 상태가 되면 메모리에서 언로드될 수 있습니다.
  • 동시 로드된 모델의 수는 OLLAMA_MAX_LOADED_MODELS(기본값: GPU 수의 3배 또는 CPU의 경우 3)로 제한됩니다.

메모리 최적화

  • 메모리 효율성을 극대화하기 위해 동일한 모델에 대한 요청을 배치 처리하도록 시도합니다.
  • GPU 추론의 경우, 모델당 전체 VRAM 할당이 필요하며 - 부분적인 로드는 지원되지 않습니다.

실패 시나리오

치명적인 메모리 고갈: 대기열에 있는 요청조차도 사용 가능한 자원을 초과할 때, Ollama는 다음을 수행할 수 있습니다:

  • 디스크로 페이징(성능이 심각하게 저하됨)
  • “메모리 부족” 에러 반환
  • 극단적인 경우 모델 인스턴스 충돌
구성 제어 설정 목적 기본값
OLLAMA_MAX_QUEUE 최대 대기열 요청 수 512
OLLAMA_NUM_PARALLEL 로드된 모델당 병렬 요청 수 4 (또는 제한 시 1)
OLLAMA_MAX_LOADED_MODELS 최대 동시 로드 모델 수 GPU 수의 3배 또는 3

관리자는 하드웨어 기능에 기반하여 메모리 사용량을 모니터링하고 이러한 매개변수를 조정해야 합니다. 메모리 부족 처리는 대형 모델(7B+ 파라미터)을 실행하거나 여러 동시 요청을 처리할 때 중요해집니다.

Ollama 최적화 전략

export OLLAMA_CUDA=1로 GPU 가속을 활성화하고, export OLLAMA_NUM_THREADS=84로 CPU 스레드를 설정합니다. 하드웨어 강화

  • RAM: 13B 모델은 32GB+, 70B 모델은 64GB+
  • 저장소: 더 빠른 모델 로딩/스왑을 위한 NVMe SSD
  • GPU: 대형 모델을 위한 16GB+ VRAM을 갖춘 NVIDIA RTX 3080/4090

운영 전략

  • 요청 배칭: 메모리 오버헤드를 상쇄하기 위해 여러 쿼리를 동시에 처리
  • 자동 모델 언로드: Ollama가 유휴 모델을 메모리에서 제거하도록 허용
  • 자주 사용되는 모델 캐싱: 일반 모델을 메모리에 상주 상태로 유지

모니터링 & 문제 해결

  • nvidia-smi (GPU)와 htop (CPU/RAM)을 사용하여 병목을 식별
  • 메모리 에러의 경우:
  • 양자화(quantized) 모델로 업그레이드
  • 동시 요청 수 감소
  • 스왑 공간 증가

최적화 워크플로우 예시:

### Use quantized model with GPU acceleration
export OLLAMA_CUDA=1
ollama run llama2:7b-q4_0 --context-size 2048

### Limit loaded models and parallel requests
export OLLAMA_MAX_LOADED_MODELS=2
export OLLAMA_NUM_PARALLEL=4

이러한 조정은 응답 품질을 유지하면서 메모리 사용량을 30-60% 줄일 수 있으며, 특히 여러 모델을 실행하거나 높은 요청량을 처리할 때 유용합니다.

OLLAMA_NUM_PARALLEL 환경 변수

OLLAMA_NUM_PARALLEL은 Ollama가 얼마나 많은 요청을 병렬로 실행할지를 제어합니다. 동일한 Ollama 서버에 여러 요청을 보내면, 이 설정이 그들이 동시 실행되는지 아니면 대기열에 들어가는지를 크게 결정합니다.

  • 높은 값은 CPU/GPU/VRAM이 충분할 경우 처리량 향상에 도움이 될 수 있지만, 지연 시간과 메모리 압력을 증가시킬 수 있습니다.
  • 낮은 값은 경합을 줄이고 안정성을 향상시킬 수 있지만, 요청이 더 자주 대기열에 들어갈 것입니다.

메모리는 구체적으로 OLLAMA_NUM_PARALLEL * OLLAMA_CONTEXT_LENGTH에 비례하여 확장됩니다: 32K 컨텍스트 설정에서 4개의 병렬 슬롯은 요청이 이를 사용하지 않아도 단일 128K 시퀀스가 로드된 것인 것처럼 KV 캐시를 예약합니다. 16 GB 카드에서 이 예산 계산은 보통 대기열 동작보다 더 중요합니다 - 완전한 VRAM 예산과 단일 장문 컨텍스트 세션의 경우 왜 OLLAMA_NUM_PARALLEL=1이 보통 올바른 시작점인지에 대해서는 16 GB GPU의 KV 캐시를 참고하세요.

OLLAMA_NUM_PARALLEL 설정 방법

Linux / macOS (systemd 서비스 또는 셸):

export OLLAMA_NUM_PARALLEL=2
ollama serve

일회성 실행 (이 명령에 한해 접두사 사용):

OLLAMA_NUM_PARALLEL=2 ollama serve

Docker (예시):

docker run --rm -e OLLAMA_NUM_PARALLEL=2 -p 11434:11434 ollama/ollama

값 선택 방법

단일 GPU / 제한된 VRAM의 경우 1–2로 시작하여, 다음 사항을 관찰하면서 점진적으로 증가시키세요:

  • GPU VRAM 사용량 (OOM / evictions)
  • CPU 사용량 및 로드 평균
  • 전형적인 요청의 p95 지연 시간
  • 에러율 / 타임아웃

CLI 사용에 대한 특정 페이지를 최적화하고 있다면, 치트시트의 Ollama CLI 섹션과 ollama serve, ollama ps, ollama run의 명령 예시를 참고하세요.

빠른 튜닝 레시피

안정성 우선

  • OLLAMA_NUM_PARALLEL=1
  • 더 작은 / 양자화 모델 사용
  • 더 짧은 컨텍스트 크기 선호

처리량 - 우선

  • OLLAMA_NUM_PARALLEL=2 (또는 여유가 있으면 더 높게)
  • 클라이언트 레이어의 요청 배칭 고려
  • 충분한 VRAM과 CPU 스레드 확보

“두 요청이 도착하면 VRAM이 부족하다”

  • OLLAMA_NUM_PARALLEL 감소
  • 더 공격적인 양자화 모델 사용
  • 컨텍스트 길이 / 최대 토큰 감소

문제 해결

OLLAMA_NUM_PARALLEL이 너무 높다는 증상

  • 요청이 로드 하에서 간헐적으로 실패
  • GPU OOM / 모델 언로드가 빈번하게 발생
  • 두 번째 요청이 도착할 때 지연 시간 스파이크 발생

OLLAMA_NUM_PARALLEL이 너무 낮다는 증상

  • CPU/GPU가 저조하게 활용됨
  • 대기열 지연이 전체 응답 시간을 지배

팁: 클라이언트도 제어할 수 있다면, 지터(jitter)가 있는 재시도와 keep-alive 연결을 추가하세요. 많은 “Ollama가 느리다"는 문제는 실제로 대기열 + 연결 오버헤드입니다.

Ollama: 요청 배칭(Batching) 대 병렬 실행

Ollama의 배칭은 여러 incoming 요청을 묶어 하나의 단위로서 처리하는 관행을 의미합니다. 이는 특히 병렬화 된 작업(예: GPU)에서 이점을 얻는 하드웨어에서 실행될 때 계산 자원의 더 효율적인 사용을 가능하게 합니다.

동일한 모델에 대한 여러 요청이 동시에 도착하면, 메모리가 허용하는 한 Ollama는 이를 배치로 함께 처리할 수 있습니다. 이는 처리량을 증가시키고, 모델이 배치에 걸쳐 최적화 된 행렬 연산을 활용할 수 있으므로 각 요청의 지연 시간을 줄일 수 있습니다.

배칭은 요청이 크기와 복잡성에서 유사할 때 특히 효과적이며, 이는 더 나은 하드웨어 활용을 가능하게 합니다.

Ollama의 병렬 실행은 가용 메모리와 구성에 따라, 동일한 모델에 대한 것 또는 서로 다른 모델에 대한 것이든 여러 요청을 동시에 처리하는 것을 의미합니다.

Ollama는 두 수준의 병렬성을 지원합니다:

  • 여러 모델 로딩: 충분한 메모리가 사용 가능하면, 여러 모델이 로드되어 동시에 요청을 처리할 수 있습니다.
  • 모델당 병렬 요청: 각 로드된 모델은 OLLAMA_NUM_PARALLEL 설정(기본값은 메모리에 따라 1 또는 4)에 의해 제어되는 여러 요청을 병렬로 처리할 수 있습니다.

요청이 병렬성 제한을 초과하면, OLLAMA_MAX_QUEUE까지 대기열(FIFO)에 들어갑니다.

핵심 요약

Ollama는 배칭과 병렬 실행을 모두 활용하여 여러 요청을 효율적으로 처리합니다. 배칭은 요청을 동시에 처리하도록 묶는 반면, 병렬 실행은 여러 요청(또는 모델)이 동시 실행될 수 있도록 합니다. 이 두 방법 모두 시스템 메모리에 의존하며, 최적의 성능을 위해 구성할 수 있습니다.

더 많은 벤치마크, 동시성 튜닝 및 성능 가이드라인에 대해서는 우리의 LLM 성능: 벤치마크, 병목 및 최적화 허브를 확인하세요.

유용한 링크

구독하기

시스템, 인프라, AI 엔지니어링에 관한 새 글을 받아보세요.