Ollama가 병렬 요청을 처리하는 방식

ollama를 사용하여 병렬 요청 실행을 구성합니다.

Page content

Ollama 서버가 동일한 시간에 두 개의 요청을 받을 경우, 그 동작은 구성 설정과 사용 가능한 시스템 자원에 따라 달라집니다.

다섯 마리의 멋진 람마가 드넓은 들판에 서 있는 모습

동시 요청 처리

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

  • 배치 처리: 동일한 모델에 대한 여러 요청이 동시에 도착할 경우, Ollama는 요청을 배치하고 함께 처리합니다. 이는 두 요청이 병렬로 처리되며, 사용자는 동시에 응답을 받을 수 있습니다. 서버는 의도적으로 배치가 채워질 때까지 기다리지 않으며, 요청이 도착하자마자 처리가 시작됩니다.

대기열 및 제한

  • 대기열: 동시 요청 수가 설정된 병렬성(예: OLLAMA_NUM_PARALLEL 값보다 많은 요청)을 초과할 경우, 추가 요청은 대기열에 들어갑니다. 대기열은 먼저 도착한 요청을 먼저 처리하는 FIFO(First-In, First-Out) 방식으로 운영됩니다.

  • 대기열 제한: 대기열에 있는 요청의 최대 수는 OLLAMA_MAX_QUEUE(기본값: 512)에 의해 제어됩니다. 대기열이 가득 차면, 새로운 요청은 서버가 과부하 상태임을 나타내는 503 오류를 받습니다.

  • 모델 로딩: 동시에 로드할 수 있는 다른 모델의 수는 OLLAMA_MAX_LOADED_MODELS에 의해 제어됩니다. 요청이 새로운 모델을 로드해야 하며 메모리가 부족한 경우, Ollama는 비활성 모델을 언로드하여 공간을 확보하고, 요청은 모델이 로드될 때까지 대기열에 들어갑니다.

예시 시나리오

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

요청이 다른 모델에 대한 것이며, 메모리가 충분한 경우, 두 모델을 모두 로드하고 요청을 병렬로 처리할 수 있습니다. 메모리가 부족한 경우, 하나의 모델은 언로드되어야 하며, 요청은 모델이 로드될 때까지 대기열에 들어갑니다.

요약 표

시나리오 결과
동일한 모델, 충분한 병렬성 두 요청 모두 병렬로 처리(배치)
동일한 모델, 병렬성=1 하나의 요청 처리, 두 번째 요청은 첫 번째 요청 완료 후 대기
다른 모델, 충분한 메모리 두 모델 모두 로드, 요청 병렬 처리
다른 모델, 메모리 부족 하나의 요청은 메모리가 확보될 때까지 대기

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

메모리 부족 처리

Ollama가 들어오는 요청을 처리하기 위한 메모리가 부족할 경우, 대기열 메커니즘과 자원 관리 전략을 결합하여 안정성을 유지합니다:

요청 대기열

  • 메모리가 즉시 할당될 수 없는 경우, 새로운 요청은 FIFO(First-In, First-Out) 방식으로 대기열에 배치됩니다.
  • 대기열 크기는 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에서의 배치(Batching)는 여러 요청을 하나의 단위로 그룹화하여 처리하는 것을 의미합니다. 이는 특히 병렬 처리가 유리한 하드웨어(예: GPU)에서 컴퓨팅 자원을 더 효율적으로 사용할 수 있도록 합니다.

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

요청의 크기와 복잡성이 유사할 경우, 배치는 하드웨어 활용도를 향상시키는 데 특히 효과적입니다.

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

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

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

요청이 병렬성 제한을 초과할 경우, OLLAMA_MAX_QUEUE까지의 요청은 FIFO 방식으로 대기열에 들어갑니다.

결론

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

유용한 링크