올라마가 병렬 요청을 처리하는 방법
Ollama의 동시성 및 큐잉 메커니즘을 이해하고, 안정적인 병렬 요청 처리를 위해 OLLAMA_NUM_PARALLEL을 튜닝하는 방법을 알아봅니다.
이 가이드에서는 Ollama가 병렬 요청을 처리하는 방식(동시성, 큐잉 및 자원 제한)과 OLLAMA_NUM_PARALLEL 환경 변수(및 관련 설정)를 사용하여 이를 최적화하는 방법을 설명합니다.
바로 가기 링크: OLLAMA_NUM_PARALLEL이란? · 빠른 튜닝 레시피 · 큐잉 작동 원리 · 문제 해결 · 관련: Ollama CLI 명령어 치트시트
처리량, 지연 시간, VRAM 및 런타임과 하드웨어 전반의 벤치마크에 대한 더 많은 정보는 LLM 성능: 벤치마크, 병목 현상 및 최적화를 참조하십시오.
멀티스텝 에이전트는 샘플링이 불안정할 때 재시도 횟수를 증가시킵니다. Qwen 및 Gemma 클래스 모델의 기본 온도, top_p 및 페널티 설정에 대해서는 Qwen 및 Gemma용 에이전틱 추론 파라미터를 참조하십시오.

동시 요청 처리
-
병렬 처리: Ollama는 요청의 동시 처리를 지원합니다. 시스템에 사용 가능한 메모리가 충분히 있다면(RAM은 CPU 추론용, VRAM은 GPU 추론용), 여러 모델을 동시에 로드할 수 있으며 각 로드된 모델은 여러 요청을 병렬로 처리할 수 있습니다. 이는 각 모델이 동시에 처리할 수 있는 최대 병렬 요청 수를 설정하는 환경 변수
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가 들어오는 요청을 처리할 메모리가 부족할 때, 안정성을 유지하기 위해 큐잉 메커니즘과 자원 관리 전략을 조합하여 사용합니다:
요청 큐잉
- 메모리를 즉시 할당할 수 없을 때 새 요청은 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)을 사용하여 병목 현상을 식별
- 메모리 오류의 경우:
- 양자화된 모델로 업그레이드
- 동시 요청 수 줄이기
- 스왑 공간 증가
최적화 워크플로우 예시:
### 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 설정 방법
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 과소 활용
- 큐잉 지연이 전체 응답 시간을 지배
팁: 클라이언트도 제어한다면 재시도(잡음 추가)와 연결 유지(keep-alive)를 추가하십시오. 많은 “Ollama가 느리다"는 문제는 실제로 큐잉 + 연결 오버헤드 때문입니다.
Ollama: 요청 배치 처리 vs 병렬 실행
Ollama의 **배치 처리(Batching)**는 여러 들어오는 요청을 그룹화하여 하나의 단위로 처리하는 관행을 의미합니다. 이는 특히 병렬화된 작업에서 이점을 보는 하드웨어(GPU 등)에서 실행할 때 계산 자원을 더 효율적으로 사용할 수 있게 해줍니다.
동일한 모델에 대한 여러 요청이 동시에 도착하면, 메모리가 허용하는 경우 Ollama는 이를 배치로 함께 처리할 수 있습니다. 이는 처리량을 증가시키고 모델이 배치에 대해 최적화된 행렬 연산을 활용할 수 있으므로 각 요청의 지연 시간을 줄일 수 있습니다.
배치 처리는 요청의 크기와 복잡성이 유사할 때 특히 효과적이며, 이는 더 나은 하드웨어 활용을 가능하게 합니다.
Ollama의 병렬 실행은 사용 가능한 메모리 및 구성에 따라 동일한 모델 또는 다른 모델에 대한 여러 요청을 동시에 처리하는 것을 의미합니다.
Ollama는 두 가지 수준의 병렬 처리를 지원합니다:
- 다중 모델 로드: 충분한 메모리가 사용 가능한 경우, 여러 모델을 로드하여 동시에 요청을 서비스할 수 있습니다.
- 모델당 병렬 요청: 각 로드된 모델은
OLLAMA_NUM_PARALLEL설정(메모리에 따라 기본값 1 또는 4)에 의해 제어되는 여러 요청을 병렬로 처리할 수 있습니다.
요청이 병렬 처리 한도를 초과하면 OLLAMA_MAX_QUEUE까지 큐(FIFO)에 대기됩니다.
요약
Ollama는 배치 처리와 병렬 실행을 모두 활용하여 여러 요청을 효율적으로 처리합니다. 배치 처리는 요청을 그룹화하여 동시에 처리하고, 병렬 실행은 여러 요청(또는 모델)이 동시 실행되도록 허용합니다. 두 방법 모두 시스템 메모리에 의존하며 최적의 성능을 위해 구성할 수 있습니다.
더 많은 벤치마크, 동시성 튜닝 및 성능 가이드는 LLM 성능: 벤치마크, 병목 현상 및 최적화 허브를 확인하십시오.