Jak Ollama obsługuje równoległe żądania

Zrozum mechanizmy równoległości i kolejkowania w Ollamie oraz sposób kalibracji parametru OLLAMA_NUM_PARALLEL, aby zapewnić stabilne obsłużenie równoległych żądań.

Page content

Ten przewodnik wyjaśnia sposób, w jaki Ollama obsługuje żądania równoległe (równoległość, kolejkowanie i ograniczenia zasobów) oraz jak dostrajać ten proces przy użyciu zmiennej środowiskowej OLLAMA_NUM_PARALLEL (i powiązanych parametrów).

Linki do sekcji: Czym jest OLLAMA_NUM_PARALLEL? · Szybkie przepisy na dostrojenie · Jak działa kolejkowanie · Rozwiązywanie problemów · Zobacz też: Ściągawka poleceń CLI Ollama

W celu uzyskania dodatkowych informacji na temat przepustowości, opóźnienia (latencji), pamięci VRAM oraz porównań wydajności (benchmarks) na różnych czasach wykonania i sprzętach, zobacz Wydajność LLM: Benchmarki, wąskie gardła i optymalizacja.

Agenci wieloetapowi mnożą ponowienia, gdy pobieranie próbki jest niestabilne; w przypadku domyślnych ustawień temperatury, top_p oraz kar (penalty) dla modeli klasy Qwen i Gemma, zobacz Parametry inferencji agentycznej dla Qwen i Gemma.

pięć wspaniałych lam stoi na polu

Obsługa żądań równoległych

  • Przetwarzanie równoległe: Ollama obsługuje równoległe przetwarzanie żądań. Jeśli system ma wystarczającą ilość dostępnej pamięci (RAM dla inferencji na CPU, VRAM dla inferencji na GPU), wiele modeli może być załadowanych jednocześnie, a każdy załadowany model może obsługiwać kilka żądań równolegle. Kontroluje to zmienna środowiskowa OLLAMA_NUM_PARALLEL, która ustawia maksymalną liczbę równoległych żądań, które każdy model może przetwarzać jednocześnie. Domyślnie wartość ta jest ustawiona na 4 (lub 1, w zależności od dostępności pamięci), ale można ją dostosować.

  • Grupowanie w paczki (Batching): Gdy wiele żądań dla tego samego modelu przyjdzie jednocześnie, Ollama grupuje je w paczkę (batch) i przetwarza wspólnie. Oznacza to, że oba żądania są przetwarzane równolegle, a użytkownicy zobaczą odpowiedzi strumieniowane (streaming) w tym samym czasie. Serwer nie czeka celowo, aż paczka się zapełni; przetwarzanie rozpoczyna się, gdy tylko żądania są dostępne.

Kolejkowanie i ograniczenia

  • Kolejkowanie: Jeśli liczba równoległych żądań przekroczy skonfigurowaną równoległość (np. więcej niż OLLAMA_NUM_PARALLEL żądań dla danego modelu), dodatkowe żądania są kolejkowane. Kolejka działa w sposób first-in, first-out (FIFO).

  • Ograniczenia kolejki: Maksymalną liczbę żądań w kolejce kontroluje zmienna OLLAMA_MAX_QUEUE (domyślnie: 512). Jeśli kolejka jest pełna, nowe żądania otrzymują błąd 503, wskazujący, że serwer jest przeciążony.

  • Ładowanie modeli: Liczbę różnych modeli, które mogą być załadowane jednocześnie, kontroluje zmienna OLLAMA_MAX_LOADED_MODELS. Jeśli żądanie wymaga załadowania nowego modelu, a pamięć jest niewystarczająca, Ollama wyładuje nieaktywne modele, aby zrobić miejsce, a żądanie będzie oczekiwać w kolejce do czasu, aż model zostanie załadowany.

Przykładowy scenariusz

Jeśli dwa żądania dla tego samego modelu przyjdą w tym samym czasie, a równoległość serwera jest ustawiona na co najmniej 2, oba żądania zostaną przetworzone razem w paczce, a obaj użytkownicy otrzymają odpowiedzi jednocześnie. Jeśli równoległość jest ustawiona na 1, jedno żądanie zostanie przetworzone natychmiast, a drugie trafi do kolejki do czasu ukończenia pierwszego.

Jeśli żądania dotyczą różnych modeli i jest wystarczająca ilość pamięci, oba modele mogą zostać załadowane, a żądania obsłużone równolegle. Jeśli nie, może być konieczne wyładowanie jednego z modeli, a żądanie trafi do kolejki.

Tabela podsumowująca

Scenariusz Wynik
Dwa żądania, ten sam model, wystarczająca równoległość Oba przetwarzane razem równolegle (w paczce)
Dwa żądania, ten sam model, równoległość=1 Jedno przetwarzane, drugie w kolejce do ukończenia pierwszego
Dwa żądania, różne modele, wystarczająca pamięć Oba modele załadowane, żądania obsłużone równolegle
Dwa żądania, różne modele, niewystarczająca pamięć Jedno w kolejce do czasu dostępności pamięci lub wyładowania modelu

Podsumowując, Ollama jest zaprojektowany tak, aby efektywnie obsługiwać wiele jednoczesnych żądań, o ile serwer jest skonfigurowany pod kątem równoległości i ma wystarczające zasoby. W przeciwnym razie żądania są kolejkowane i przetwarzane w kolejności.

Jeśli zwiększanie OLLAMA_NUM_PARALLEL nie pozwala już utrzymać stabilnej latencji, a kolejka nieustannie rośnie pod rzeczywistym obciążeniem, jest to jeden z wyraźniejszych sygnałów, aby rozważyć przejście na silnik serwowania zaprojektowany pod ten cel. Artykuł Ollama na vLLM: Kiedy migrować serwer lokalnego LLM omawia tę decyzję, w tym ciągłe grupowanie w paczki (continuous batching) i PagedAttention jako mechanizmy, które vLLM stosuje, aby zapobiec wzajemnemu pogarszaniu się wydajności żądań równoległych.

Obsługa niedoboru pamięci

Gdy Ollama napotka niewystarczającą ilość pamięci do obsługi nadchodzących żądań, stosuje kombinację mechanizmów kolejkowania i strategii zarządzania zasobami, aby utrzymać stabilność:

Kolejkowanie żądań

  • Nowe żądania są umieszczane w kolejce FIFO (First-In, First-Out), gdy pamięć nie może zostać przydzielona natychmiast.
  • Rozmiar kolejki jest kontrolowany przez OLLAMA_MAX_QUEUE (domyślnie: 512 żądań).
  • Jeśli kolejka osiągnie pojemność maksymalną, nowe żądania otrzymają błędy 503 “Server Overloaded”.

Zarządzanie modelami

  • Aktywne modele mogą zostać wyładowane z pamięci, gdy staną się nieaktywne, aby uwolnić zasoby dla żądań w kolejce.
  • Liczba jednocześnie załadowanych modeli jest ograniczona przez OLLAMA_MAX_LOADED_MODELS (domyślnie: 3× liczba GPU lub 3 dla CPU).

Optymalizacja pamięci

  • Próby grupowania żądań dla tego samego modelu w paczki, aby zmaksymalizować efektywność pamięci.
  • W przypadku inferencji na GPU wymagana jest pełna alokacja VRAM na każdy model - nieobsługiwane są częściowe załadowania.

Scenariusze awaryjne

Krytyczna wyczerpanie pamięci: Gdy nawet żądania w kolejce przekraczają dostępne zasoby, Ollama może:

  • Wykonywać stronicowanie na dysk (co drastycznie obniża wydajność)
  • Zwracać błędy “out of memory”
  • Wywoływać crash instancji modelu w skrajnych przypadkach
Kontrola konfiguracji Cel Wartość domyślna
OLLAMA_MAX_QUEUE Maksymalna liczba żądań w kolejce 512
OLLAMA_NUM_PARALLEL Równoległe żądania na każdy załadowany model 4 (lub 1, jeśli ograniczona pamięć)
OLLAMA_MAX_LOADED_MODELS Maksymalna liczba jednocześnie załadowanych modeli 3× liczba GPU lub 3

Administratorzy powinni monitorować zużycie pamięci i dostosowywać te parametry w oparciu o możliwości sprzętowe. Obsługa niewystarczającej ilości pamięci staje się kluczowa przy uruchamianiu większych modeli (7B+ parametrów) lub przetwarzaniu wielu równoległych żądań.

Strategie optymalizacji Ollama

Włącz przyspieszenie GPU za pomocą export OLLAMA_CUDA=1 i ustaw wątki CPU za pomocą export OLLAMA_NUM_THREADS=84. Usprawnienia sprzętowe

  • RAM: 32GB+ dla modeli 13B, 64GB+ dla modeli 70B
  • Pamięć masowa: dyski NVMe SSD dla szybszego ładowania/wymiany modeli
  • GPU: NVIDIA RTX 3080/4090 z 16GB+ VRAM dla większych modeli

Strategie operacyjne

  • Grupowanie żądań w paczki: przetwarzanie wielu zapytań jednocześnie, aby rozłożyć nadmiar pamięci
  • Automatyczne wyładowywanie modeli: pozwala Ollama usunąć nieaktywne modele z pamięci
  • Cache’owanie często używanych modeli: utrzymywanie popularnych modeli w pamięci

Monitorowanie i rozwiązywanie problemów

  • Używaj nvidia-smi (GPU) i htop (CPU/RAM), aby zidentyfikować wąskie gardła
  • W przypadku błędów pamięci:
  • Przejście na modele skwantowane
  • Zmniejszenie liczby równoległych żądań
  • Zwiększenie przestrzeni wymiany (swap)

Przykładowy przepływ optymalizacji:

### Użycie skwantowanego modelu z przyspieszeniem GPU
export OLLAMA_CUDA=1
ollama run llama2:7b-q4_0 --context-size 2048

### Ograniczenie liczby załadowanych modeli i równoległych żądań
export OLLAMA_MAX_LOADED_MODELS=2
export OLLAMA_NUM_PARALLEL=4

Te adjustments mogą zmniejszyć zużycie pamięci o 30-60%, zachowując jakość odpowiedzi, co jest szczególnie korzystne przy uruchamianiu wielu modeli lub obsłudze dużej liczby żądań.

Zmienna środowiskowa OLLAMA_NUM_PARALLEL

OLLAMA_NUM_PARALLEL kontroluje, ile żądań Ollama wykona równolegle. Jeśli wyślesz wiele żądań do tego samego serwera Ollama, to ustawienie w dużej mierze decyduje, czy będą one uruchamiane równolegle, czy też trafią do kolejki.

  • Wyższe wartości mogą zwiększyć przepustowość, jeśli masz wystarczająco dużo CPU/GPU/VRAM, ale mogą zwiększyć latencję i obciążenie pamięci.
  • Niższe wartości zmniejszają konkurencję o zasoby i mogą poprawić stabilność, ale żądania częściej będą czekać w kolejce.

Pamięć, konkretnie, skaluje się z OLLAMA_NUM_PARALLEL * OLLAMA_CONTEXT_LENGTH: cztery równoległe sloty przy ustawieniu kontekstu 32K rezerwują pamięć KV tak, jakby został załadowany pojedynczy ciąg 128K, nawet zanim jakiekolwiek żądanie z niej skorzysta. Na karcie graficznej 16 GB te obliczenia budżetu pamięci mają zwykle większe znaczenie niż zachowanie kolejki — zobacz Pamięć KV na GPU 16 GB po pełny budżet VRAM i dlaczego OLLAMA_NUM_PARALLEL=1 jest zwykle punktem wyjścia dla pojedynczej sesji z długim kontekstem.

Jak ustawić OLLAMA_NUM_PARALLEL

Linux / macOS (usługa systemd lub shell):

export OLLAMA_NUM_PARALLEL=2
ollama serve

Jednorazowe uruchomienie (prefiks tylko dla tego polecenia):

OLLAMA_NUM_PARALLEL=2 ollama serve

Docker (przykład):

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

Jak wybrać wartość

Zacznij od 1–2 dla pojedynczego GPU / ograniczonej VRAM, a następnie stopniowo zwiększaj, obserwując:

  • Zużycie VRAM GPU (OOM / ewicje)
  • Zużycie CPU i średnie obciążenie
  • Latencję p95 typowych żądań
  • Stawę błędów / timeoutów

Jeśli optymalizujesz konkretną stronę pod kątem używania CLI, zobacz sekcję Ollama CLI w ściągawce oraz przykłady poleceń dla ollama serve, ollama ps i ollama run.

Szybkie przepisy na dostrojenie

Priorytet stabilności

  • OLLAMA_NUM_PARALLEL=1
  • Użyj mniejszych / skwantowanych modeli
  • Wolnij krótsze rozmiary kontekstu

Priorytet przepustowości

  • OLLAMA_NUM_PARALLEL=2 (lub wyższa, jeśli masz zapas mocy)
  • Rozważ grupowanie żądań w paczki na warstwie klienta
  • Zapewnij wystarczającą ilość VRAM i wątków CPU

„Kończy mi się VRAM, gdy przyjdą dwa żądania”

  • Zmniejsz OLLAMA_NUM_PARALLEL
  • Użyj modelu skwantowanego bardziej agresywnie
  • Zmniejsz długość kontekstu / maksymalną liczbę tokenów

Rozwiązywanie problemów

Objawy zbyt wysokiego OLLAMA_NUM_PARALLEL

  • Żądania zawodzą okresowo pod obciążeniem
  • Częste występowanie OOM GPU / wyładowywanie modeli
  • Skoki latencji, gdy przyjdzie drugie żądanie

Objawy zbyt niskiego OLLAMA_NUM_PARALLEL

  • CPU/GPU jest niewystarczająco wykorzystywane
  • Opóźnienia wynikające z kolejki dominują całkowity czas odpowiedzi

Wskazówka: Jeśli kontrolujesz również swojego klienta, dodaj ponowienia z jitterem i utrzymuj połączenia keep-alive. Wiele problemów z „wolnym Ollama” jest naprawdę opóźnieniami kolejkowania + nadmiarem narzutów połączeniowych.

Ollama: Grupowanie żądań w paczki a wykonanie równoległe

Grupowanie w paczki (Batching) w Ollama odnosi się do praktyki grupowania wielu nadchodzących żądań i przetwarzania ich jako jednej jednostki. Pozwala to na bardziej efektywne wykorzystanie zasobów obliczeniowych, szczególnie przy pracy na sprzęcie, który korzysta z operacji zrównoleglonych (takim jak GPU).

Gdy wiele żądań dla tego samego modelu przyjdzie jednocześnie, Ollama może przetworzyć je razem w paczce, o ile pamięć na to pozwoli. Zwiększa to przepustowość i może zmniejszyć latencję dla każdego żądania, ponieważ model może korzystać z zoptymalizowanych operacji macierzowych na paczce.

Grupowanie w paczki jest szczególnie skuteczne, gdy żądania są podobne pod względem rozmiaru i złożoności, ponieważ pozwala to na lepsze wykorzystanie sprzętu.

Wykonanie równoległe w Ollama oznacza obsługę wielu żądań jednocześnie, zarówno dla tego samego modelu, jak i dla różnych modeli, w zależności od dostępnej pamięci i konfiguracji.

Ollama obsługuje dwa poziomy równoległości:

  • Ładowanie wielu modeli: Jeśli jest wystarczająca ilość pamięci, kilka modeli może być załadowanych i obsługiwać żądania jednocześnie.
  • Równoległe żądania na model: Każdy załadowany model może przetwarzać kilka żądań równolegle, kontrolowanych przez ustawienie OLLAMA_NUM_PARALLEL (domyślnie 1 lub 4, w zależności od pamięci).

Gdy żądania przekraczają limit równoległości, są kolejkowane (FIFO) do OLLAMA_MAX_QUEUE.

Podsumowanie

Ollama wykorzystuje zarówno grupowanie w paczki, jak i wykonanie równoległe, aby efektywnie przetwarzać wiele żądań. Grupowanie w paczki składa żądania w jednostki do jednoczesnego przetwarzania, podczas gdy wykonanie równoległe pozwala na równoczesne działanie wielu żądań (lub modeli). Obydwie metody zależą od pamięci systemowej i można je konfigurować dla optymalnej wydajności.

Aby uzyskać więcej benchmarków, regulacji równoległości i wskazówek dotyczących wydajności, sprawdź nasz hub Wydajność LLM: Benchmarki, wąskie gardła i optymalizacja.

Przydatne linki

Subskrybuj

Otrzymuj nowe wpisy o systemach, infrastrukturze i inżynierii AI.