Jak Ollama Obsługuje Wątki Paralelne
Konfigurowanie ollama do wykonywania równoległych żądań.
Gdy serwer Ollama otrzymuje dwa żądania w tym samym czasie, jego zachowanie zależy od konfiguracji i dostępnych zasobów systemowych.
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 wnioskowania CPU, VRAM dla wnioskowania GPU), wiele modeli może zostać załadowanych jednocześnie, a każdy załadowany model może obsługiwać kilka żądań równolegle. To jest 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ępności pamięci), ale można je dostosować. -
Gromadzenie (batching): Gdy wiele żądań dla tego samego modelu przychodzi jednocześnie, Ollama gromadzi je i przetwarza wspólnie. To oznacza, że oba żądania są przetwarzane równolegle, a użytkownicy zobaczą przesyłane odpowiedzi w tym samym czasie. Serwer nie celowo czeka, aby wypełnić partię; przetwarzanie zaczyna się, jak tylko żądania są dostępne.
Kolejkowanie i limity
-
Kolejkowanie: Jeśli liczba równoległych żądań przekracza skonfigurowaną równoległość (np. więcej niż
OLLAMA_NUM_PARALLEL
żądań dla modelu), dodatkowe żądania są umieszczane w kolejce. Kolejka działa według zasady pierwszy przyszedł – pierwszy obsłużony (FIFO). -
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 mogą być załadowane jednocześnie, jest kontrolowana przez
OLLAMA_MAX_LOADED_MODELS
. Jeśli żądanie wymaga załadowania nowego modelu i pamięci jest niewystarczająco, Ollama wywaliduje bezczynne modele, aby zrobić miejsce, a żądanie zostanie umieszczone w kolejce, dopóki model nie zostanie załadowany.
Przykładowy scenariusz
Jeśli dwa żądania dla tego samego modelu przychodzą w tym samym czasie, a równoległość serwera jest ustawiona na co najmniej 2, oba żądania zostaną przetworzone wspólnie w partii, a obydwaj użytkownicy otrzymają odpowiedzi równolegle. Jeśli równoległość jest ustawiona na 1, jedno żądanie jest przetwarzane natychmiast, a drugie umieszczane w kolejce, dopóki pierwsze nie zostanie zakończone.
Jeśli żądania dotyczą różnych modeli i jest wystarczająco dużo pamięci, oba modele mogą zostać załadowane, a żądania obsłużone równolegle. Jeśli nie, jeden model może wymagać wywalidowania, a żądanie zostanie umieszczone w kolejce.
Tabela podsumowująca
Scenariusz | Wynik |
---|---|
Dwa żądania, ten sam model, wystarczająca równoległość | Oba przetwarzane wspólnie równolegle (w partii) |
Dwa żądania, ten sam model, równoległość=1 | Jedno przetwarzane, drugie w kolejce dopóki pierwsze nie zostanie zakończone |
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 dopóki pamięć będzie dostępna lub model zostanie wywalidowany |
Podsumowując, Ollama jest zaprojektowany do efektywnego przetwarzania wielu równoległych żądań, o ile serwer jest skonfigurowany do równoległości i ma wystarczające zasoby. W przeciwnym razie żądania są umieszczane w kolejce i przetwarzane w kolejności.
Obsługa niedostatecznej pamięci
Gdy Ollama napotyka na niedostateczną ilość pamięci do obsługi przychodzących żądań, stosuje kombinację mechanizmów kolejki 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 być natychmiast przydzielona.
- Rozmiar kolejki jest kontrolowany przez
OLLAMA_MAX_QUEUE
(domyślnie: 512 żądań). - Jeśli kolejka osiągnie pojemność, nowe żądania otrzymują błąd 503 “Serwer przeciążony”.
Zarządzanie modelami
- Aktywne modele mogą być wywalidowane z pamięci, gdy stają się bezczynne, aby zwolnić zasoby dla żądań w kolejce.
- Liczba modeli załadowanych równolegle 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 wymaga pełnej alokacji VRAM na model – częściowe ładowanie nie jest obsługiwane.
Scenariusze awaryjne
Krytyczne wyczerpanie pamięci: Gdy nawet żądania w kolejce przekraczają dostępne zasoby, Ollama może:
- Przełączać się na dysk (znacznie pogarszając wydajność)
- Zwracanie błędów “brak pamięci”
- W ekstremalnych przypadkach – awarię instancji modelu
Ustawienie konfiguracji | Cel | Wartość domyślna |
---|---|---|
OLLAMA_MAX_QUEUE | Maksymalna liczba żądań w kolejce | 512 |
OLLAMA_NUM_PARALLEL | Liczba równoległych żądań 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 na podstawie możliwości sprzętu. Obsługa niedostatecznej 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 liczby wątków CPU za pomocą export OLLAMA_NUM_THREADS=84
.
Wzmocnienia sprzętowe
- RAM: 32 GB+ dla modeli 13B, 64 GB+ dla modeli 70B
- Pamięć: SSD NVMe dla szybszego ładowania i wymiany modeli
- GPU: NVIDIA RTX 3080/4090 z 16 GB+ VRAM dla większych modeli
Strategie operacyjne
- Grupowanie żądań: Przetwarzanie wielu zapytań jednocześnie, aby rozproszyć koszt pamięci
- Automatyczne wywalidowanie modeli: Pozwala Ollama usuwać bezczynne modele z pamięci
- Caching najczęściej używanych modeli: Trzymanie popularnych modeli w pamięci
Monitorowanie i rozwiązywanie problemów
- Użyj
nvidia-smi
(GPU) ihtop
(CPU/RAM) do identyfikacji krytycznych punktów - Dla błędów pamięci:
- Przejdź na modele kwantyzowane
- Zmniejsz liczbę równoległych żądań
- Zwiększ przestrzeń wymiany
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 liczbę załadowanych modeli 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%, jednocześnie utrzymując jakość odpowiedzi, szczególnie korzystne przy uruchamianiu wielu modeli lub przetwarzaniu dużych ilości żądań.
Ollama: Grupowanie żądań vs. Równoległe wykonanie
Grupowanie (batching) w Ollama odnosi się do praktyki grupowania wielu przychodzących żądań razem i przetwarzania ich jako jednostki. Pozwala to na bardziej efektywne wykorzystanie zasobów obliczeniowych, szczególnie przy pracy na sprzęcie korzystającym z operacji równoległych (np. GPU).
Gdy wiele żądań dla tego samego modelu przychodzi jednocześnie, Ollama może je przetworzyć wspólnie w partii, jeśli pamięć pozwala. To zwiększa przepustowość i może zmniejszyć opóźnienie dla każdego żądania, ponieważ model może wykorzystać zoptymalizowane operacje macierzy na partii.
Grupowanie jest szczególnie skuteczne, gdy żądania są podobne pod względem rozmiaru i złożoności, ponieważ to pozwala na lepsze wykorzystanie sprzętu.
Równoległe wykonanie w Ollama oznacza obsługę wielu żądań w tym samym czasie, albo dla tego samego modelu, albo 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 wystarczająca jest pamięć, kilka modeli może zostać załadowanych i obsłużyć żądania jednocześnie.
- Równoległe żądania na model: Każdy załadowany model może przetwarzać kilka żądań równolegle, 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, aby efektywnie przetwarzać wiele żądań. Grupowanie łączy żądania do jednoczesnego przetwarzania, podczas gdy równoległe wykonanie umożliwia przetwarzanie wielu żądań (lub modeli) równolegle. Oba metody zależą od pamięci systemowej i są konfigurowalne w celu uzyskania optymalnej wydajności.
Przydatne linki
- Ollama cheatsheet
- Przeniesienie modeli Ollama do innego dysku lub folderu
- Jak Ollama wykorzystuje wydajne jądra i wydajność procesora Intel
- Ollama Space
- Samowystarczalność Perplexica – z Ollama
- Testowanie Deepseek-r1 na Ollama
- Jak Ollama obsługuje żądania równoległe
- Testowanie Deepseek-r1 na Ollama
- Python cheatsheet
- Python Space
- Przestawianie dokumentów tekstowych z Ollama i modelem Qwen3 Embedding – w języku Go