Ollama가 병렬 요청을 처리하는 방식
병렬 요청 실행을 위해 ollama 구성하기.
Ollama 서버가 동일한 시간에 두 개의 요청을 받을 경우, 그 동작은 구성 설정과 사용 가능한 시스템 자원에 따라 달라집니다.
추가적인 처리량, 지연 시간, VRAM, 그리고 런타임과 하드웨어에 걸친 벤치마크에 대한 내용은 LLM 성능: 벤치마크, 병목 현상 및 최적화를 참조하세요.

동시 요청 처리
-
병렬 처리: Ollama는 요청의 동시 처리를 지원합니다. 시스템에 충분한 메모리(프로세서 추론을 위한 RAM, GPU 추론을 위한 VRAM)가 있다면 여러 모델을 동시에 로드할 수 있으며, 각 로드된 모델은 여러 요청을 병렬로 처리할 수 있습니다. 이는
OLLAMA_NUM_PARALLEL이라는 환경 변수로 제어되며, 이는 각 모델이 동시에 처리할 수 있는 최대 병렬 요청 수를 설정합니다. 기본값은 4(메모리 가용성에 따라 1로 설정될 수도 있음)이지만, 이 값을 조정할 수 있습니다. -
배치 처리: 동일한 모델에 대한 여러 요청이 동시에 도착할 경우, Ollama는 이 요청들을 배치하고 함께 처리합니다. 이는 두 요청이 병렬로 처리되며, 사용자는 동시에 응답을 스트리밍으로 받게 됩니다. 서버는 의도적으로 배치가 채워질 때까지 기다리지 않으며, 요청이 도착하자마자 처리가 시작됩니다.
대기열 및 제한
-
대기열: 동시에 처리 가능한 요청 수가 설정된 병렬 처리 수(예:
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배 또는 CPU의 경우 3 |
관리자는 메모리 사용량을 모니터링하고 하드웨어 능력에 따라 이러한 매개변수를 조정해야 합니다. 메모리 부족 처리는 7B 이상의 파라미터를 가진 더 큰 모델이나 여러 동시 요청을 처리할 때 특히 중요합니다.
Ollama 최적화 전략
GPU 가속을 위해 export OLLAMA_CUDA=1을 사용하고, CPU 스레드는 export OLLAMA_NUM_THREADS=84로 설정합니다.
하드웨어 개선
- 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: 요청 배치 vs 병렬 실행
Ollama에서의 배치 처리는 여러 들어오는 요청을 그룹화하여 하나의 단위로 처리하는 것을 의미합니다. 이는 특히 병렬 처리가 유리한 하드웨어(예: GPU)에서 계산 자원을 더 효율적으로 사용할 수 있도록 합니다.
동일한 모델에 대한 여러 요청이 동시에 도착할 경우, 메모리가 허용하는 한 Ollama는 이 요청들을 배치로 함께 처리할 수 있습니다. 이는 처리량을 증가시키고, 각 요청의 지연 시간을 줄일 수 있으며, 모델이 배치에 대한 최적화된 행렬 연산을 활용할 수 있기 때문입니다.
요청의 크기와 복잡도가 유사할 때 배치 처리는 특히 효과적입니다. 이는 하드웨어 활용도를 극대화할 수 있기 때문입니다.
Ollama의 병렬 실행은 여러 요청을 동시에 처리하는 것을 의미합니다. 이는 동일한 모델 또는 다른 모델에 대한 요청에 따라, 사용 가능한 메모리와 설정에 따라 달라집니다.
Ollama는 두 가지 수준의 병렬 처리를 지원합니다:
- 다중 모델 로딩: 충분한 메모리가 있는 경우, 여러 모델을 로드하여 동시에 요청을 처리할 수 있습니다.
- 모델당 병렬 요청: 각 로드된 모델은
OLLAMA_NUM_PARALLEL설정(기본값은 메모리에 따라 1 또는 4)에 따라 여러 요청을 병렬로 처리할 수 있습니다.
요청이 병렬 처리 제한을 초과할 경우, OLLAMA_MAX_QUEUE에 도달할 때까지 FIFO 방식으로 대기열에 들어갑니다.
결론
Ollama는 배치 처리와 병렬 실행을 모두 활용하여 여러 요청을 효율적으로 처리합니다. 배치 처리는 요청을 동시에 처리하기 위해 그룹화하는 반면, 병렬 실행은 여러 요청(또는 모델)을 동시에 실행할 수 있도록 합니다. 이 두 방법은 모두 시스템 메모리에 의존하며, 최적의 성능을 위해 구성할 수 있습니다.
추가적인 벤치마크, 동시성 조정, 성능 가이드라인은 우리의 LLM 성능: 벤치마크, 병목 현상 및 최적화 허브에서 확인할 수 있습니다.