Ollama가 동시 요청을 처리하는 방식

Ollama의 동시성, 큐잉, 그리고 안정적인 병렬 요청을 위한 OLLAMA_NUM_PARALLEL 튜닝 방법을 이해합니다.

Page content

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

바로가기 링크: OLLAMA_NUM_PARALLEL이란? · 빠른 튜닝 레시피 · 대기열 작동 방식 · 문제 해결 · 관련: Ollama CLI 명령어 치트시트

러타임과 하드웨어 전반에 걸친 처리량, 지연 시간, VRAM, 벤치마크에 대한 더 자세한 내용은 LLM 성능: 벤치마크, 병목 현상 및 최적화를 참고하십시오.

멀티스텟 에이전트는 샘플링이 불안정할 때 재시도 횟수를 증가시킵니다. Qwen 및 Gemma 클래스 모델의 기본 temperature, top_p, penalty 선택에 대한 내용은 Qwen과 Gemma를 위한 에이전틱 추론 파라미터를 참고하십시오.

마장고 다섯 마리가 들판에 서 있다

동시 요청 처리

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

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

대기열과 한계

  • 대기열(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가 수신되는 요청을 처리하기에 메모리가 부족할 때, 안정성을 유지하기 위해 대기열 메커니즘과 리소스 관리 전략의 조합을 사용합니다:

요청 대기열

  • 메모리를 즉시 할당할 수 없을 때, 새로운 요청은 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 최대 동시 로드 모델 수 3×GPU 수 또는 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) 사용
  • 메모리 오류 발생 시:
  • 양자화 모델로 업그레이드
  • 동시 요청 수 감소
  • 스왑 공간 증가

최적화 워크플로 예시:

### GPU 가속과 함께 양자화 모델 사용
export OLLAMA_CUDA=1
ollama run llama2:7b-q4_0 --context-size 2048

### 로드된 모델과 병렬 요청 제한
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 카드에서 이 예산 계산은 대기열 동작보다 중요할 수 있습니다 — 단일 롱 컨텍스트 세션에 대해 OLLAMA_NUM_PARALLEL=1이 보통 올바른 시작점인 이유와 전체 VRAM 예산에 대해서는 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 / 에빅션)
  • 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: 요청 배칭 vs 병렬 실행

Ollama의 **배칭(Batching)**은 여러 수신되는 요청을 함께 그룹화하고 단일 단위로 처리하는 관행을 가리킵니다. 이는 병렬화 작업에서 이점을 얻는 하드웨어(GPU 등)로 실행할 때 계산 리소스의 더 효율적인 사용을 허용합니다.

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

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

Ollama의 병렬 실행은 가용 메모리와 설정에 따라 동일한 모델 또는 다른 모델에 대해 여러 요청을 동시에 처리하는 것을 의미합니다.

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

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

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

핵심 내용

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

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

유용한 링크

구독하기

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