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

Zrozumienie współbieżności, kolejek w Ollama oraz optymalizacja parametru OLLAMA_NUM_PARALLEL dla stabilnych równoległych żądań.

Page content

Ten przewodnik wyjaśnia jak Ollama obsługuje równoległe żądania (konkurencja, kolejki i limity zasobów) oraz jak je dostosować przy użyciu zmiennej środowiskowej OLLAMA_NUM_PARALLEL (i powiązanych ustawień).

Szybkie odnośniki: Czym jest OLLAMA_NUM_PARALLEL? · Szybkie recepty strojenia · Jak działają kolejki · Rozwiązywanie problemów · Powiązane: Ściągarka poleceń CLI Ollama

Aby dowiedzieć się więcej o przepustowości, opóźnieniach, pamięci VRAM i wynikach testów na różnych środowiskach wykonawczych i sprzęcie, zobacz Wydajność LLM: Testy, wąskie gardła i optymalizacja.

Agenci wieloetapowi mnożą próby przywracania, gdy próbkowanie jest niestabilne; aby zobaczyć domyślne ustawienia temperatury, top_p i kar dla modeli klasy Qwen i Gemma, zobacz parametry wnioskowania agencji dla Qwen i Gemma.

pięć wspaniałych lama stoi na polu

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

  • Przetwarzanie równoległe: Ollama obsługuje równoległe przetwarzanie żądań. Jeśli system ma wystarczająco dużo dostępnej pamięci (RAM do wnioskowania na CPU, VRAM do wnioskowania 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. Jest to kontrolowane przez zmienną środowiskową OLLAMA_NUM_PARALLEL, która ustawia maksymalną liczbę równoległych żądań, które każdy model może przetwarzać jednocześnie. Domyślnie jest to ustawione na 4 (lub 1, w zależności od dostępnej pamięci), ale można to dostosować.

  • Grupowanie (Batching): Gdy jednocześnie przychodzą wielokrotne żądania dla tego samego modelu, Ollama grupuje je i przetwarza razem. Oznacza to, że oba żądania są obsługiwane równolegle, a użytkownicy będą widzieć strumieniowane odpowiedzi w tym samym czasie. Serwer nie oczekuje intencjonalnie wypełnienia partii; przetwarzanie zaczyna się, gdy tylko żądania są dostępne.

Kolejki i limity

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

  • Limity kolejki: Maksymalna liczba żądań w kolejce jest kontrolowana przez 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: Liczba różnych modeli, które można załadować jednocześnie, jest kontrolowana przez OLLAMA_MAX_LOADED_MODELS. Jeśli żądanie wymaga załadowania nowego modelu, a pamięci jest niewystarczająco, Ollama odładuje bezczynne modele, aby zrobić miejsce, a żądanie zostanie umieszczone w kolejce do momentu załadowania modelu.

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 będą przetwarzane razem w partii, a obaj użytkownicy otrzymają odpowiedzi równolegle. Jeśli równoległość jest ustawiona na 1, jedno żądanie jest przetwarzane natychmiast, a drugie jest umieszczane w kolejce do momentu zakończenia pierwszego.

Jeśli żądania są dla różnych modeli i jest wystarczająco pamięci, oba modele mogą być załadowane, a żądania obsługiwane równolegle. Jeśli nie, może być konieczne odładowanie jednego modelu, a żądanie zostanie umieszczone w kolejce.

Tabela podsumowująca

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

Podsumowując, Ollama jest zaprojektowany tak, aby efektywnie obsługiwać wiele jednoczesnych żądań, pod warunkiem, że serwer jest skonfigurowany do konkurencji i posiada wystarczające zasoby. W przeciwnym razie żądania są umieszczane w kolejce i przetwarzane w kolejności.

Obsługa niewystarczającej pamięci

Gdy Ollama napotka niewystarczającą pamięć do obsługi przychodzących żądań, stosuje kombinację mechanizmów kolejkowych i strategii zarządzania zasobami w celu utrzymania stabilności:

Kolejkowanie żądań

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

Zarządzanie modelami

  • Aktywne modele mogą być odładowywane z pamięci, gdy staną się bezczynne, aby zwolnić zasoby dla żądań w kolejce.
  • Liczba równolegle 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 celu maksymalizacji wydajności pamięci.
  • Dla wnioskowania na GPU wymagana jest pełna alokacja VRAM na model - częściowe ładowanie nie jest obsługiwane.

Scenariusze awarii

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

  • Pagedować na dysk (poważnie pogarszając wydajność)
  • Zwrócić błędy “brak pamięci”
  • W skrajnych przypadkach zawiesić instancję modelu
Kontrola konfiguracji Cel Wartość domyślna
OLLAMA_MAX_QUEUE Maksymalna liczba żądań w kolejce 512
OLLAMA_NUM_PARALLEL Równoległe żądania na załadowany model 4 (lub 1 jeśli ograniczone)
OLLAMA_MAX_LOADED_MODELS Maksymalna liczba równolegle załadowanych modeli 3×liczba GPU lub 3

Administratorzy powinni monitorować użycie pamięci i dostosowywać te parametry w zależności od możliwości sprzętowych. Obsługa niewystarczającej 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. Ulepszenia sprzętowe

  • RAM: 32GB+ dla modeli 13B, 64GB+ dla modeli 70B
  • Przechowywanie: Dyski NVMe SSD dla szybszego ładowania/swapowania modeli
  • GPU: NVIDIA RTX 3080/4090 z 16GB+ VRAM dla większych modeli

Strategie operacyjne

  • Grupowanie żądań: Przetwarzaj wiele zapytań jednocześnie, aby rozłożyć narzut pamięci
  • Automatyczne odładowywanie modeli: Pozwala Ollama na czyszczenie bezczynnych modeli z pamięci
  • Buforowanie często używanych modeli: Utrzymuj popularne modele w pamięci

Monitorowanie i rozwiązywanie problemów

  • Użyj nvidia-smi (GPU) i htop (CPU/RAM) w celu identyfikacji wąskich gardeł
  • W przypadku błędów pamięci:
  • Przejdź na modele kwantyzowane
  • Zmniejsz liczbę równoległych żądań
  • Zwiększ przestrzeń swap

Przykładowy przepływ pracy optymalizacji:

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

### Ogranicz załadowane modele i równoległe żądania
export OLLAMA_MAX_LOADED_MODELS=2
export OLLAMA_NUM_PARALLEL=4

Te dostosowania mogą zmniejszyć uż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 CPU/GPU/VRAM, ale mogą zwiększyć opóźnienia i presję na pamięć.
  • Niższe wartości zmniejszają rywalizację i mogą poprawić stabilność, ale żądania częściej będą trafiać do kolejki.

Jak ustawić OLLAMA_NUM_PARALLEL

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

export OLLAMA_NUM_PARALLEL=2
ollama serve

Uruchomienie jednorazowe (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 / ograniczonego VRAM, a następnie zwiększaj stopniowo, obserwując:

  • Użycie VRAM GPU (OOM / wymuszenia)
  • Użycie CPU i średnią obciążenia
  • Opóźnienie p95 typowych żądań
  • Poziom błędów / timeoutów

Jeśli optymalizujesz konkretną stronę dla użytku CLI, zobacz sekcję Ollama CLI w ścieżce, plus przykłady poleceń dla ollama serve, ollama ps i ollama run.

Szybkie recepty strojenia

Priorytet: Stabilność

  • OLLAMA_NUM_PARALLEL=1
  • Używaj mniejszych / kwantyzowanych modeli
  • Wol krótsze rozmiary kontekstu

Priorytet: Przepustowość

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

“Brakuje mi VRAM, gdy przychodzą dwa żądania”

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

Rozwiązywanie problemów

Objawy, że OLLAMA_NUM_PARALLEL jest za wysoki

  • Żądania przerywane są okresowo pod obciążeniem
  • GPU OOM / odładowywanie modeli występuje często
  • Skoki opóźnień przy przybyciu drugiego żądania

Objawy, że OLLAMA_NUM_PARALLEL jest za niski

  • CPU/GPU są niewykorzystywane
  • Opóźnienia kolejkowania dominują całkowity czas odpowiedzi

Wskazówka: Jeśli kontrolujesz również klienta, dodaj ponowne próby z jitterem i połączenia keep-alive. Wiele problemów “Ollama jest wolne” to naprawdę kolejki + narzut połączeń.

Ollama: Grupowanie żądań vs. Równoległe wykonanie

Grupowanie w Ollama odnosi się do praktyki grupowania wielu przychodzących żądań i przetwarzania ich jako jedności. Pozwala to na bardziej efektywne wykorzystanie zasobów obliczeniowych, szczególnie przy uruchamianiu na sprzęcie, który korzysta z operacji równoległych (takich jak GPU).

Gdy jednocześnie przychodzą wielokrotne żądania dla tego samego modelu, Ollama może przetwarzać je razem w partii, jeśli pamięć pozwala. Zwiększa to przepustowość i może zmniejszyć opóźnienie dla każdego żądania, ponieważ model może korzystać z zoptymalizowanych operacji macierzowych nad partią.

Grupowanie 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.

Równoległe wykonanie w Ollama oznacza obsługę wielu żądań w tym samym czasie, 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 dostatecznie dużo 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, co jest kontrolowane 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ą umieszczane w kolejce (FIFO) do OLLAMA_MAX_QUEUE.

Podsumowanie

Ollama wykorzystuje zarówno grupowanie, jak i równoległe wykonanie do efektywnego przetwarzania wielu żądań. Grupowanie łączy żądania w celu jednoczesnego przetwarzania, podczas gdy równoległe wykonanie pozwala na równoczesne uruchamianie wielu żądań (lub modeli). Obie metody zależą od pamięci systemowej i są konfigurowalne dla optymalnej wydajności.

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

Przydatne linki

Subskrybuj

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