Jak Ollama Obsługuje Wątki Równoległe

Konfiguracja ollama do wykonywania równoległych żądań.

Page content

Gdy serwer Ollama otrzymuje dwa żądania jednocześnie, jego zachowanie zależy od konfiguracji i dostępnych zasobów systemowych.

Aby uzyskać więcej informacji na temat przepustowości, opóźnienia, VRAM i testów wydajnościowych na różnych sprzętach i w różnych środowiskach, zobacz Wydajność modeli językowych: testy, ograniczenia i optymalizacja.

pięć niesamowitych lilek 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 wnioskowania na CPU, VRAM dla wnioskowania na GPU), wiele modeli może zostać załadowanych jednocześnie, a każdy załadowany model może obsłużyć 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 razem. To oznacza, że oba żądania są przetwarzane równolegle, a użytkownicy będą widzieć odpowiedzi przesyłane 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 żądań równoległych przekracza skonfigurowaną równoległość (np. więcej niż OLLAMA_NUM_PARALLEL żądań dla modelu), dodatkowe żądania są umieszczane w kolejce. Kolejka działa zgodnie z zasadą pierwszym do pierwszego (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ą zostać załadowane jednocześnie, jest kontrolowana przez OLLAMA_MAX_LOADED_MODELS. Jeśli żądanie wymaga załadowania nowego modelu, a pamięci nie wystarcza, Ollama wywaliduje nieużywane 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 przychodzą w tym samym czasie, a równoległość serwera jest ustawiona na co najmniej 2, oba żądania zostaną przetworzone 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 zostaje umieszczone w kolejce do momentu zakończenia pierwszego.

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 z modeli może zostać wywalidowany, a żądanie zostanie umieszczone w kolejce.

Tabela podsumowująca

Scenariusz Wynik
Dwa żądania, ten sam model, wystarczająca równoległość Oba przetworzone razem równolegle (w partii)
Dwa żądania, ten sam model, równoległość=1 Jedno przetworzone, drugie umieszczone w kolejce do momentu zakoń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 umieszczone w kolejce do momentu dostępności pamięci lub wywalidowania modelu

Podsumowując, Ollama jest zaprojektowany tak, aby efektywnie obsługiwać wiele żądań jednocześnie, 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 braku pamięci

Gdy Ollama napotyka brak pamięci, aby obsłużyć przychodzące żądania, 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ę nieaktywne, 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 awaryjne

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

  • Zapisywać dane na dysk (znacznie pogarszając wydajność)
  • Zwracać błędy „brak pamięci”
  • W ekstremalnych przypadkach – przerywać instancję 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 braku pamięci staje się kluczowa, gdy uruchamia się większe modele (7B+ parametrów) lub przetwarza się wiele 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.

Ulepszenia sprzętowe

  • RAM: 32 GB+ dla modeli 13B, 64 GB+ dla modeli 70B
  • Dysk: 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 rozprowadzić nakład kosztów pamięci
  • Automatyczne wywalidowanie modeli: Pozwala Ollama usuwać nieaktywne modele z pamięci
  • Caching najczęściej używanych modeli: Trzymanie wspólnych modeli w pamięci

Monitorowanie i rozwiązywanie problemów

  • Użyj nvidia-smi (GPU) i htop (CPU/RAM), aby zidentyfikować miejsca krytyczne
  • Dla błędów pamięci:
  • Przejdź na modele z kwantyzacją
  • Zmniejsz liczbę równoległych żądań
  • Zwiększ przestrzeń wymiany

Przykładowy przepływ pracy optymalizacji:

# Użyj modelu z kwantyzacją 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, gdy uruchamia się wiele modeli lub przetwarza się duże ilości żądań.

Ollama: grupowanie żądań vs. wykonanie równoległe

Grupowanie w Ollama odnosi się do praktyki grupowania wielu przychodzących żądań i przetwarzania ich jako jednostki. Pozwala to na bardziej efektywne wykorzystanie zasobów obliczeniowych, zwłaszcza w przypadku sprzętu korzystającego z operacji równoległych (np. GPU).

Gdy wiele żądań dla tego samego modelu przychodzi jednocześnie, Ollama może przetworzyć je razem w partii, jeśli to możliwe pamięcią. To zwiększa przepustowość i może zmniejszyć opóźnienie dla każdego żądania, ponieważ model może korzystać z zoptymalizowanych operacji macierzy na partii.

Grupowanie jest szczególnie skuteczne, gdy żądania są podobne pod względem wielkości i złożoności, ponieważ umożliwia lepsze wykorzystanie sprzętu.

Wykonanie równoległe w Ollama oznacza przetwarzanie wielu żądań jednocześnie, 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:

  • Załadowanie wielu modeli: Jeśli dostępna jest wystarczająca ilość pamięci, 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, 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 momentu osiągnięcia limitu 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) jednocześnie. Oba metody zależą od pamięci systemowej i są konfigurowalne w celu uzyskania optymalnej wydajności.

Aby uzyskać więcej testów wydajnościowych, dostosowanie równoległości i wskazówki dotyczące wydajności, sprawdź nasz Wydajność modeli językowych: testy, ograniczenia i optymalizacja.

Przydatne linki