Ollama to vLLM: kiedy migrować serwer lokalnych modeli LLM

Kiedy przejść z Ollamy na vLLM

Page content

Ollama to jeden z najprostszych sposobów na uruchomienie lokalnego modelu językowego, jednak wygoda może ukrywać moment, w którym lokalny eksperyment staje się współdzieloną usługą inferencyjną wymagającą lepszego planowania zadań i obserwowalności.

W tym miejscu w grę wchodzi vLLM. Migracja z Ollamy na vLLM nie jest jednak automatyczną aktualizacją. To kompromis: w zamian za część prostoty Ollamy zyskujesz większą kontrolę nad batchami, zarządzaniem pamięcią, współbieżnością, inferencją rozproszoną i operacjami produkcyjnymi.

Ollama to vLLM migration

Ten przewodnik obejmuje praktyczne sygnały wskazujące na uzasadnienie migracji, ryzyka związane z przesadnym pośpiechem oraz etapowe podejście, które pozwala utrzymać oba serwery działające obok siebie podczas weryfikacji. Celem jest pomoc w podejmowaniu decyzji na podstawie pomiarów, a nie listy funkcji. Dla szerszego przeglądu opcji lokalnych, self-hostowanych i chmurowych wykraczającego poza te dwa runtime’y, zobacz Hosting LLM w 2026: Porównanie infrastruktury lokalnej, self-hostowanej i chmurowej.

Ollama i vLLM rozwiązują różne problemy

Ollama jest w głównej mierze zoptymalizowany pod kątem wygodnego korzystania z modeli. Oferuje developerom zwięzły interfejs wiersza poleceń, lokalne API, bibliotekę modeli, pliki Modelfile oraz proste wsparcie dla typowych konfiguracji desktopowych i stacji roboczych.

vLLM to silnik inferencji i platforma serwingowa. Jego główne obszary zainteresowania to planowanie zadań o wysokim przepływie, efektywne zarządzanie buforem KV (KV cache), ciągłe batchowanie (continuous batching), równoległość modelu oraz kompatybilność z aplikacjami budowanymi pod stylem API OpenAI.

Różnica ta jest istotna, ponieważ oba serwery mogą wydawać się podobne na pierwszy rzut oka. Obie mogą wystawiać API czatu, streamować tokeny, uruchamiać skwantowane modele i obsługiwać lokalne aplikacje. Ich modele operacyjne stają się wyraźnie różne dopiero wtedy, gdy serwer jest obciążony intensywnie lub równolegle.

Przydatne podsumowanie:

Wymaganie Ollama vLLM
Szybka konfiguracja lokalna Doskonała Bardziej skomplikowana
Przetwarzanie pobierania modeli Doskonałe Zwykle oparte na Hugging Face
Praca z GGUF Wsparcie pierwszorzędne Wsparcie, nie główna moc
Czat użytkownika jednego Doskonałe Często niepotrzebne
Równoległy ruch API Ograniczony, ale konfigurowalny Główny przypadek użycia
Ciągłe batchowanie Nie model główny Główna funkcja
Ponowne użycie prefix cache Ograniczona kontrola operacyjna Optymalizacja wbudowana
Serwing modelu na wielu GPU Ograniczony w porównaniu z vLLM Równoległość tensorowa i potokowa
Metryki produkcyjne Podstawowe dane o czasie odpowiedzi Punkt końcowy metryk Prometheus
Dostrojenie wdrożenia Minimalne Rozległe

Pytanie nie brzmi, który serwer jest uniwersalnie lepszy. Chodzi o to, czy Twój obciążenie nadal pasuje do modelu operacyjnego, który czyni Ollamę atrakcyjną. Jeśli chcesz pełniejszego obrazu obejmującego więcej niż te dwa runtime’y, nasze porównanie Ollama, vLLM, LocalAI, Jan, LM Studio i innych lokalnych narzędzi LLM obejmuje szersze spektrum.

Znaki, że wyrosłeś z Ollamy

Powolna odpowiedź sama w sobie nie uzasadnia migracji. Szybkość generowania jest często ograniczana przez rozmiar modelu, kwantyzację, przepustowość pamięci, długość promptu lub moc GPU, a silniejsze sygnały migracji pojawiają się dopiero wtedy, gdy kształt obciążenia zaczyna mieć znaczenie.

Wielu użytkowników powoduje niestabilne opóźnienia

Lokalny serwer LLM może wydawać się szybki podczas izolowanego testu, a potem gwałtownie degradować, gdy połączy się kilku klientów. Żądania zaczynają czekać w kolejce za długimi generacjami, czas do pierwszego tokena staje się niespójny, a pojedynczy duży prompt może wpłynąć na wszystkich współdzielących model.

Ollama może przetwarzać równoległe żądania, a OLLAMA_NUM_PARALLEL kontroluje, ile żądań załadowany model może obsługiwać jednocześnie — zobacz jak Ollama obsługuje równoległe żądania, aby poznać mechanikę kolejkowania i pamięci stojącą za tym ustawieniem. Ta równoległość nie jest darmowa: wymagania pamięci rosną wraz z zaplanowaną liczbą równoległych żądań i długością kontekstu.

To często pierwsze praktyczne ostrzeżenie. Konfiguracja działająca dla jednej rozmowy 8K może stać się niemożliwa, gdy czterech klientów rezerwuje znacznie większy kontekst.

vLLM jest zaprojektowany tak, aby łączyć pracę z aktywnych żądań poprzez ciągłe batchowanie. Zamiast traktować każde żądanie jako izolowany job inferencji, nieustannie aktualizuje batch, gdy sekwencje przychodzą, generują tokeny i kończą się — model planowania zadań, który z reguły zyskuje na wartości wraz ze wzrostem współbieżności.

Niskie wykorzystanie GPU podczas oczekiwania w kolejce

Kolejka nie oznacza necessarily, że GPU jest w pełni wykorzystane. W prostej konfiguracji serwingowej praca może być serializowana, mimo że dodatkowe żądania mogłyby przyczynić się do przydatnych obliczeń w bieżącym kroku dekodowania.

Planista zadań vLLM jest zaprojektowany tak, aby utrzymywać w locie więcej przydatnej pracy. PagedAttention zarządza pamięcią bufora KV w blokach, a ciągłe batchowanie pozwala aktywnym sekwencjom dynamicznie wchodzić i wychodzić z wykonawczego batcha.

Wynik nie gwarantuje niższego opóźnienia dla każdego pojedynczego żądania. Pod obciążeniem jednak może wygenerować znacznie lepszy łączny przepływ i bardziej przewidywalne wykorzystanie zasobów.

Długie prompty dominują czas do pierwszego tokena

Asystenci kodowi z długim kontekstem, pipeline’y RAG i sesje agentów mogą wielokrotnie wysyłać duże systemowe prompty lub wspólne prefiksy dokumentów. Przetwarzanie tych tokenów wejściowych to etapy prefill, które mogą dominować czas do pierwszego tokena.

vLLM obsługuje podzielony prefill (chunked prefill) i automatyczne cache’owanie prefiksów. Cache’owanie prefiksów pozwala późniejszym żądaniom na ponowne użycie bloków bufora KV, gdy ich początkowa sekwencja tokenów pasuje do wcześniej przetworzonego prefiksu.

Jest to szczególnie przydatne, gdy żądania dzielą:

  • Długi prompt systemowy
  • Te same definicje narzędzi
  • Stabilne podsumowanie repozytorium
  • Powtarzane przykłady few-shot
  • Wspólny prefiks dokumentu RAG
  • Wspólną historię rozmowy

Cache’owanie prefiksów nie przyspiesza generowania wyjścia. Zmniejsza powtórzone obliczenia promptu, więc jego korzyść zależy od tego, czy żądania faktycznie zawierają identyczne, ponownie używane prefiksy.

Potrzebujesz więcej niż jednego GPU

Model, który nie mieści się na jednym GPU, to silny powód, aby rozważyć vLLM. Obsługuje on równoległość tensorową między GPU oraz równoległość potokową między wieloma węzłami lub urządzeniami.

Nie oznacza to, że inferencja wielo-GPU jest bezproblemowa. Przepustowość łącza między GPU, topologia PCIe, architektura modelu, współdzielona pamięć kontenera i nakłady komunikacyjne nadal wpływają na wydajność.

Niemniej jednak vLLM oferuje przemyślaną ścieżkę dla inferencji rozproszonej. Ollama jest zwykle lepszym dopasowaniem dla pojedynczego komputera stacjonarnego lub stacji roboczej, na której wybrany model już swobodnie się mieści.

Potrzebujesz obserwowalności na poziomie produkcyjnym

Odpowiedzi API Ollamy ujawniają przydatne pola czasowe, takie jak czas ładowania modelu, czas oceny promptu, liczba wygenerowanych tokenów i czas generowania. Te wartości wystarczają do lokalnego benchmarkowania i logowania na poziomie aplikacji.

vLLM ujawnia metryki kompatybilne z Prometheus przez punkt końcowy /metrics. Ułatwia to śledzenie wolumenu żądań, kolejkowania, czasu do pierwszego tokena, opóźnień między tokenami, użycia bufora, przestąpień (preemptions), przepływu i wyników żądań w czasie.

Gdy użytkownicy zaczynają polegać na usłudze, obserwowalność przestaje być opcjonalna. Bez metryk kolejki, bufora i opóźnień trudne jest rozróżnienie niedostatecznie wydajnego GPU od za dużego limitu kontekstu, słabego planowania zadań, zimnego ładowania modelu lub po prostu zbyt wielu jednoczesnych żądań.

Gdzie vLLM faktycznie wygrywa

Najważniejszą przewagą vLLM nie jest to, że może wygenerować jedną odpowiedź szybciej niż Ollama na każdym komputerze. Znaczącą przewagą jest to, że daje operatorowi więcej mechanizmów do efektywnego wykorzystania drogiej pamięci i mocy obliczeniowej akceleratorów w wielu żądaniach.

Ciągłe batchowanie

Tradycyjne statyczne batchowanie działa najlepiej, gdy żądania mają podobną długość wejścia i wyjścia. Interaktywny ruch LLM rzadko zachowuje się w ten sposób: jeden użytkownik prosi o krótką klasyfikację, drugi wysyła prompt 20K tokenów, a trzeci generuje kilka tysięcy tokenów kodu.

Ciągłe batchowanie zmienia aktywny batch wraz z postępem żądań. Ukończone sekwencje wychodzą, nowe wchodzą, a silnik stara się uniknąć marnowania pojemności batcha na żądaniach, które już się zakończyły.

Poprawia to przepływ, gdy ruch jest równoległy i nierówny. Daje mało korzyści, gdy pojedynczy użytkownik wysyła jedno żądanie naraz.

Zarządzanie buforem KV z paginacją

Podczas generowania serwer przechowuje klucze i wartości uwag (attention keys and values) dla wcześniej przetworzonych tokenów. Ten bufor KV może zużywać dużo pamięci GPU, szczególnie przy długich kontekstach i wielu aktywnych sekwencjach.

vLLM zarządza tym buforem w blokach, zamiast wymagać, aby każda sekwencja rezerwowała jedną dużą ciągłą alokację. Podejście to zmniejsza fragmentację pamięci i pozwala na bardziej elastyczne użycie dostępnej pojemności bufora.

Praktyczną wartością jest wyższa współbieżność w ramach tego samego budżetu pamięci. Nie usuwa to podstawowego kosztu długiego kontekstu, ale zmniejsza niepotrzebne marnotrawstwo wokół tego kosztu. Dla arytmetyki stojącej za tym podstawowym kosztem — ile bajtów faktycznie potrzebuje dana długość kontekstu i jak precyzja bufora (FP8, Q8_0, Q4_0) jest z nią kompromisem na karcie 16 GB — zobacz Bufor KV na GPU 16 GB.

Cache’owanie prefiksów

Wiele żądań produkcyjnych dzieli znaczącą część początkową. Agenci z obsługą narzędzi mogą wysyłać identyczne schematy funkcji, boty supportowe mogą używać tych samych dokumentów polityki, a asystenci kodowi mogą powtarzająco włączać te same instrukcje repozytorium.

Automatyczne cache’owanie prefiksów może ponownie wykorzystać obliczony bufor dla pasujących prefiksów. Jest to szczególnie przydatne, gdy stabilny, duży prefiks jest poprowadzony przez stosunkowo mały, specyficzny dla żądania sufiks.

Jest mniej przydatne, gdy szablony, znaczniki czasu, kolejność dokumentów lub dynamicznie generowane metadane zmieniają się na początku każdego promptu. Drobne różnice w tokenizacji mogą zapobiec dopasowaniu prefiksu.

Równoległa i rozproszona inferencja

vLLM obsługuje kilka form równoległości, w tym tensorową, potokową, danych, ekspertów i kontekstową. Nie każde wdrożenie potrzebuje tych trybów, ale ich dostępność ma znaczenie, gdy usługa rośnie poza jedno GPU.

Dla stacji roboczej z dwoma odpowiednimi GPU, równoległość tensorowa może pozwolić na uruchomienie większego modelu na obu urządzeniach. Dla replikowanej usługi, równoległość danych może utworzyć wiele replik silnika dla dodatkowego przepływu.

Te funkcje wprowadzają złożoność operacyjną. Należy się ich podejmować, ponieważ pomiary wykazują problem z pojemnością, a nie dlatego, że inferencja rozproszona wydaje się bardziej wyrafinowana.

Szersze kontrole produkcyjne

vLLM ujawnia kontrole dla wykorzystania pamięci GPU, maksymalnej długości modelu, maksymalnej liczby aktywnych sekwencji, kwantyzacji, typów danych bufora, dekodowania spekulatywnego, wywołań narzędzi, sformatowanego wyjścia, aliasów modeli, kluczy uwierzytelniających i wykonania rozproszonego.

Ta elastyczność ułatwia dostrojenie serwera pod konkretne obciążenie, ale stwarza również więcej możliwości dla nieprawidłowej lub nieefektywnej konfiguracji. Migracja na vLLM oznacza przejęcie odpowiedzialności za te decyzje.

Gdzie Ollama nadal wygrywa

Przewodnik po migracji nie powinien traktować Ollamy jako gorszego narzędzia wstępnego. Dla wielu wdrożeń lokalnych pozostaje ona lepszym serwerem.

Stacje robocze osobiste

Dla jednego developera korzystającego z interfejsu czatu, asystenta kodu lub okazjonalnego lokalnego API, operacyjne przewagi vLLM mogą nigdy nie zrekompensować jego dodatkowej konfiguracji.

Ollama instaluje się szybko, pobiera modele przez prosty rejestr i ukrywa wiele szczegółów specyficznych dla modelu. Jest dobrze dopasowany do eksperymentów i prywatnego użycia desktopowego.

Kolekcje modeli GGUF

Ollama ma naturalny przepływ pracy wokół modeli GGUF i Modelfile. Istniejący użytkownicy mogą mieć skwantyzowane warianty, adaptery, szablony, prompty systemowe i parametry, które wiernie działają z ich sprzętem.

vLLM obsługuje GGUF, ale jego najsilniejsza ścieżka to zazwyczaj obsługiwane repozytoria modeli Hugging Face i formaty kwantyzacji, takie jak AWQ, GPTQ, BitsAndBytes, FP8 lub formaty specyficzne dla dostawców. Przeniesienie istniejącego wdrożenia GGUF na vLLM bez oceny bardziej natywnego formatu checkpoint może zachować niedogodności migracji, tracąc część korzyści wydajnościowych.

Mieszane offloadowanie CPU i GPU

Inferencja desktopowa czasem opiera się na częściowym offloadowaniu na GPU, ponieważ cały model nie mieści się w VRAM. Może to być praktyczne dla okazjonalnego użycia, szczególnie gdy opóźnienie nie jest krytyczne.

vLLM jest zazwyczaj najbardziej przekonujący, gdy model i wymagana pojemność bufora KV mogą być efektywnie obsługiwane przez dostępną konfigurację akceleratora. Obciążenie silnie zależne od systemowej RAM i offloadowania na CPU może być lepiej dopasowane do Ollamy lub llama.cpp.

Szybkie przełączanie modeli

Ollama umożliwia łatwe pociąganie, uruchamianie, zatrzymywanie i przełączanie między wieloma lokalnymi modelami. Jest to przydatne do oceny, pisania, kodowania, embeddings, wizji i ad hoc eksperymentowania.

Wdrożenie vLLM jest częściej budowane wokół świadomie wybranego modelu, który pozostaje załadowany jako usługa. Wdrożenie wielo-modelowe jest możliwe, ale wymaga bardziej wyraźnego planowania zasobów.

Minimalna administracja

Ollama jest celowo zdeterminowany (opinionated). Może to być ograniczeniem pod obciążeniem, ale jest atutem, gdy nikt nie chce utrzymywać platformy inferencyjnej, a jeśli lokalny serwer ma jednego użytkownika, akceptowalne opóźnienie i brak istotnej kolejki, migracja prawdopodobnie stworzy pracę, a nie ją usunie.

Nie migruj wyłącznie na podstawie tokenów na sekundę

Szybkość generowania tokenów pojedynczego żądania to niekompletny benchmark. Dwa serwery mogą wygenerować podobny przepływ dekodowania dla jednej sekwencji, zachowując się jednak bardzo różnie przy ośmiu równoległych klientach.

Przydatna ocena powinna mierzyć co najmniej:

  • Czas do pierwszego tokena
  • Opóźnienie między tokenami
  • Całkowite opóźnienie żądania
  • Przepływ przetwarzania promptu
  • Przepływ tokenów wyjściowych
  • Liczba ukończonych żądań na minutę
  • Czas oczekiwania w kolejce
  • Zużycie pamięci GPU
  • Wykorzystanie GPU
  • Stawka awarii i timeoutów

Uruchom tę samą rodzinę modeli, precyzję, długość kontekstu, zestaw promptów, limit wyjścia i poziom współbieżności na obu serwerach. W przeciwnym razie test bardziej prawdopodobnie porównuje pakowanie modeli i konfigurację niż silniki serwingowe.

Najbardziej przydatnym porównaniem jest mały test obciążeniowy reprezentujący Twój rzeczywisty ruch. Dla wspólnego asystenta kodującego może to obejmować długie prompty systemowe, powtarzane prefiksy, strumieniowe odpowiedzi i od dwóch do ośmiu jednoczesnych sesji.

Najpierw zaplanuj migrację modeli

Nazwy modeli Ollama nie mapują się automatycznie na równoważne identyfikatory modeli vLLM. Pakiet Ollama może zawierać konkretną kwantyzację GGUF, szablon promptu, konfigurację tokenów stop i parametry domyślne.

Zanim zmienisz serwer, zidentyfikuj:

  1. Oryginalną rodzinę i wersję modelu
  2. Czy to model bazowy, czy instruction-tuned
  3. Aktualną kwantyzację i efektywną precyzję
  4. Szablon promptu lub czatu
  5. Skonfigurowaną długość kontekstu
  6. Tokeny stop i domyślne parametry generowania
  7. Wymagania dotyczące wywołań narzędzi lub sformatowanego wyjścia
  8. Ewentualne adaptery LoRA lub niestandardowe prompty systemowe

Następnie wybierz checkpoint obsłużony przez vLLM, który pasuje do zamierzonego zachowania. Nie zakładaj, że checkpoint AWQ lub FP8 będzie zachowywał się identycznie jak wcześniej używana w Ollama wersja GGUF — migracja modelu jest często ważniejsza niż migracja API.

Sprawdź VRAM przed uruchomieniem vLLM

To, że model mieści się w pamięci GPU, nie oznacza, że może obsługiwać wymagane obciążenie. VRAM musi pokryć więcej niż wagi modelu.

Praktyczny budżet pamięci obejmuje:

wagi modelu
+ bufor KV
+ grafy CUDA i alokacje runtime
+ tymczasową przestrzeń roboczą
+ bufory procesorów multimodalnych, jeśli są używane
+ margines bezpieczeństwa

Długie konteksty i równoległe sekwencje głównie rozszerzają wymagania bufora KV. Zwiększanie maksymalnej długości kontekstu zmniejsza więc liczbę jednoczesnych żądań, które mogą się zmieścić, nawet jeśli większość żądań nigdy nie używa pełnego limitu.

Zacznij od realistycznego --max-model-len, a nie od największej wartości reklamowanej przez model, i unikaj ustawiania wykorzystania pamięci GPU tak agresywnie, aby drobne zmiany obciążenia powodowały błędy braku pamięci. Stabilna usługa z nieco mniejszą teoretyczną pojemnością jest bardziej użyteczna niż ta, która zawodzi przy pierwszym skoku ruchu.

Minimalne wdrożenie vLLM w Docker Compose

Poniższy przykład uruchamia serwer vLLM kompatybilny z OpenAI na porcie 8000:

services:
  vllm:
    image: vllm/vllm-openai:latest
    container_name: vllm
    restart: unless-stopped
    ports:
      - "8000:8000"
    ipc: host
    gpus: all
    volumes:
      - ${HOME}/.cache/huggingface:/root/.cache/huggingface
    environment:
      HF_TOKEN: ${HF_TOKEN:-}
    command:
      - --model
      - Qwen/Qwen3-8B
      - --served-model-name
      - local-model
      - --max-model-len
      - "16384"
      - --gpu-memory-utilization
      - "0.90"
      - --api-key
      - ${VLLM_API_KEY:-change-me}

Utwórz plik środowiskowy:

cat > .env <<'EOF'
HF_TOKEN=
VLLM_API_KEY=replace-with-a-long-random-value
EOF

Uruchom serwer:

docker compose up -d

Sprawdź logi:

docker compose logs -f vllm

Przetestuj punkt końcowy modeli:

curl http://localhost:8000/v1/models \
  -H "Authorization: Bearer replace-with-a-long-random-value"

Wyślij żądanie czatu:

curl http://localhost:8000/v1/chat/completions \
  -H "Authorization: Bearer replace-with-a-long-random-value" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "local-model",
    "messages": [
      {
        "role": "user",
        "content": "Explain continuous batching in two paragraphs."
      }
    ],
    "temperature": 0.2,
    "max_tokens": 300,
    "stream": false
  }'

Dla utrzymywanego wdrożenia przypnij obraz do przetestowanej wersji wydania vLLM, zamiast zostawiać go na latest. Przeglądaj notki wydania przed aktualizacją, ponieważ opcje wiersza poleceń, implementacje modeli, metryki i zachowanie silnika mogą ewoluować. Ten plik Compose jest celowo minimalny; dla pełniejszego przewodnika po konfiguracji — kompatybilność z API OpenAI, dostrojenie PagedAttention i głębsze porównanie vLLM vs Ollama — zobacz Szybki start z vLLM.

Kompatybilność z API OpenAI nie jest całkowitą zamiennością

Zarówno Ollama, jak i vLLM zapewniają punkty końcowe kompatybilne z OpenAI, co może uczynić migrację aplikacji stosunkowo małą. W wielu klientach zmiana podstawowego adresu URL, klucza API i nazwy modelu wystarcza do nawiązania połączenia.

Na przykład:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="replace-with-a-long-random-value",
)

response = client.chat.completions.create(
    model="local-model",
    messages=[
        {
            "role": "user",
            "content": "What should I monitor on an LLM server?",
        }
    ],
    temperature=0.2,
)

print(response.choices[0].message.content)

Kompatybilność powinna nadal być testowana na poziomie funkcji. Zbadaj:

  • Zachowanie zdarzeń strumieniowych
  • Obsługiwane parametry żądania
  • Wybór szablonu czatu
  • Parsowanie wywołań narzędzi
  • Obsługa wyjścia rozumowania
  • Wyjście ograniczone schematem lub JSON
  • Punkty końcowe embeddings
  • Wejścia multimodalne
  • Raportowanie użycia tokenów
  • Formaty odpowiedzi błędnych
  • Odkrywanie nazw modeli
  • Egzekwowanie długości kontekstu

Klient, który wysyła wyłącznie zwykłe ukończenia czatu, zwykle będzie łatwiejszy w migracji niż framework agentowy zależny od konkretnego parsera wywołań narzędzi lub niestandardowego rozszerzenia.

Szablony czatu to częsta przyczyna niepowodzenia migracji

Modele instruction-tuned oczekują, aby rozmowy były serializowane za pomocą konkretnego szablonu czatu. Szablon wstawia znaczniki ról, separatora, tokeny sterujące i prompty generowania w formacie używanym podczas treningu.

Ollama spakowuje wiele tego zachowania wewnątrz definicji modelu. W vLLM szablon jest zwykle pozyskiwany z konfiguracji tokenizera modelu, choć operator może dostarczyć go wyraźnie.

Serwer może uruchomić się pomyślnie nawet wtedy, gdy wybrany szablon jest błędny. Objawy pojawiają się w zachowaniu modelu:

  • Model powtarza etykiety ról
  • Odpowiedzi zawierają tokeny specjalne
  • Instrukcje systemowe są ignorowane
  • Wywołania narzędzi są nieprawidłowe
  • Model kontynuuje wiadomość użytkownika
  • Jakość wyjścia jest znacznie gorsza niż oczekiwano

Zanim obwinisz silnik inferencji, porównaj w pełni wyrenderowany prompt używany przez każde wdrożenie.

Używaj migracji etapowej

Zastępowanie działającego lokalnego serwera w jednym kroku tworzy niepotrzebne ryzyko. Ollama i vLLM mogą działać obok siebie na różnych portach podczas weryfikacji nowego wdrożenia.

Etap 1: Odtwórz jeden model

Wybierz model odpowiedzialny za większość ruchu API i dopasuj jego instruction tuning, wymagania kontekstu, parametry generowania i zachowanie czatu tak blisko, jak to możliwe. Nie zaczynaj od przenoszenia każdego eksperymentalnego modelu.

Etap 2: Zweryfikuj zachowanie API

Uruchom istniejące testy integracyjne wobec punktu końcowego vLLM, w tym strumieniowanie, anulowanie, timeouty, wywołania narzędzi, nieprawidłowe żądania, przekroczenie kontekstu i dostęp równoległy. Rejestruj różnice zachowania, zamiast ukrywać je za ponownymi próbami klienta.

Etap 3: Ustal linię bazową

Zmierz wydajność jednego żądania na początku. To potwierdza, że model jest prawidłowo załadowany i zapewnia punkt odniesienia dla późniejszych testów.

Zarejestruj tokeny promptu na sekundę, tokeny wyjściowe na sekundę, czas do pierwszego tokena, całkowite opóźnienie i zużycie pamięci GPU.

Etap 4: Dodaj realistyczną współbieżność

Przetestuj liczbę jednoczesnych żądań oczekiwanych w normalnej pracy i podczas prawdopodobnego szczytu, używając reprezentatywnych długości promptu i wyjścia, a nie identycznych syntetycznych żądań. Obserwuj kolejkowanie, użycie bufora, przestąpienia, czas do pierwszego tokena i opóźnienie ogona (tail latency).

Etap 5: Przenieś jednego klienta

Skieruj niekrytyczną aplikację lub mały procent ruchu na vLLM. Zachowaj Ollamę jako zapas, dopóki nowy serwer nie będzie działał wiernie pod rzeczywistym użyciem.

Etap 6: Dostrojuj z pomiarów

Dostrojuj długość modelu, wykorzystanie pamięci, maksymalną liczbę aktywnych sekwencji, cache’owanie prefiksów, równoległość i kwantyzację dopiero po zidentyfikowaniu zmierzonego ograniczenia. Zmiana wielu parametrów naraz sprawia, że regresje wydajności są trudne do wyjaśnienia.

Praktyczna lista kontrolna migracji

Zanim przełączysz klientów, zweryfikuj następujące:

[ ] Docelowy model jest obsługiwany przez vLLM
[ ] Wybrany checkpoint i kwantyzacja mieszczą się w VRAM
[ ] Wystarczająco dużo VRAM pozostaje na wymagany bufor KV
[ ] Maksymalna długość kontekstu odzwierciedla rzeczywiste użycie
[ ] Poprawny szablon czatu jest dostępny
[ ] Tokeny stop i domyślne parametry generowania są przetestowane
[ ] Strumieniowanie działa z istniejącymi klientami
[ ] Wywołania narzędzi i sformatowane wyjście są zvalidated
[ ] Publiczny alias modelu pozostaje stabilny
[ ] Uwierzytelnianie jest włączone
[ ] Serwer nie jest bezpośrednio wystawiony na internet
[ ] Metryki Prometheus są zbierane
[ ] Metryki GPU są zbierane osobno
[ ] Testy obciążeniowe obejmują realistyczną współbieżność
[ ] Timeouty i anulowania są obsługiwane
[ ] Istnieje ścieżka zwrotna do Ollamy

Ta lista jest celowo operacyjna. Instalacja vLLM jest zwykle łatwiejsza niż udowodnienie, że zachowuje się prawidłowo dla istniejącej aplikacji.

Bezpieczeństwo i ekspozycja sieciowa

Żaden z lokalnych punktów końcowych Ollamy ani vLLM nie powinien być swobodnie wystawiony na publiczny internet. Nieuzwierzytelniony serwer inferencyjny może zużywać drogie zasoby GPU, ujawniać zachowanie modelu i stać się ścieżką dla ataków typu denial-of-service poprzez bardzo długie prompty lub wyjścia.

vLLM może wymagać klucza API dla swoich punktów końcowych kompatybilnych z OpenAI, ale klucz API nie jest kompletną granicą bezpieczeństwa. Dla dostępu współdzielonego lub zdalnego, umieść usługę za proxy odwróconym lub bramką API, która zapewnia TLS, ograniczenia sieciowe, limity rozmiaru żądania, limity przepustowości, logowanie dostępu i odpowiedni uwierzytelnianie — ten sam wzorzec opisany w Ollama za proxy odwróconym z Caddy lub Nginx działa tak samo dobrze przed vLLM.

Rozważ również ryzyka specyficzne dla modelu. Ładowanie URL multimodalnych, niestandardowy kod modelu, zdalne pliki i nieograniczone wykonanie narzędzi mogą rozszerzyć powierzchnię ataku poza zwykłą generację tekstu.

Kiedy nie migrować

Zostań przy Ollamie, gdy:

  • Jeden lub dwóch użytkowników korzysta z serwera
  • Żądania są w większości sekwencyjne
  • Model już dostarcza akceptowalne opóźnienia
  • Łatwe zarządzanie GGUF jest ważne
  • Wymagane jest offloadowanie na CPU lub częściowe na GPU
  • Modele są często zmieniane
  • Nikt nie chce utrzymywać dodatkowej infrastruktury
  • Brak zmierzonego problemu z współbieżnością lub przepływem

Przejście na vLLM powinno rozwiązać konkretną ograniczoność. “Produkcja” nie jest magicznym progiem, który unieważnia Ollamę, szczególnie dla wewnętrznego serwisu z umiarkowanym ruchem.

Odwrotnie, nie zachowuj Ollamy wyłącznie dlatego, że była łatwiejsza w instalacji. Jeśli użytkownicy regularnie czekają w kolejce, powtarzane prefiksy zużywają znaczący czas prefill, lub większy model musi być rozproszony między GPU, prostszy serwer może stać się droższym wyborem operacyjnie.

Używaj Ollamy do rozwoju i dodaj vLLM do wspólnego serwingu

Najbardziej praktyczną architekturą często nie jest całkowite zastąpienie. Developerzy mogą zachować Ollamę uruchomioną w Docker Compose} na swoich stacjach roboczych do eksploracji modeli, testów GGUF i prywatnego interaktywnego użycia, podczas gdy wspólna instancja vLLM serwuje stabilny model dla aplikacji i zespołów. Ten podział ma również znaczenie dla suverenności AI} — zachowanie obu runtime’ów jako self-hostowanych oznacza, że prompty, wagi i logi inferencji pozostają pod Twoją kontrolą niezależnie od tego, który serwer obsługuje dane żądanie.

Rozdziela to dwa różne przepływy pracy:

Ollama:
eksperymentowanie -> przełączanie modeli -> narzędzia osobiste -> lokalny czat

vLLM:
wybrany model -> wspólny punkt końcowy -> równoległy ruch -> monitorowanie

Ta konfiguracja obniża również ryzyko migracji. Modele mogą być testowane lokalnie, zanim odpowiedni checkpoint zostanie promowany do wspólnego wdrożenia vLLM.

Diagram decyzyjny migracji

Poniższy diagram podsumowuje kluczowe punkty decyzyjne:

flowchart TD A[Ollama serving LLM] --> B{Wielu użytkowników
z niestabilnym opóźnieniem?} B -->|Nie| C[Zostań przy Ollamie] B -->|Tak| D{Długie wspólne
prefiksy?} D -->|Tak| E[Silny sygnał vLLM] D -->|Nie| F{Potrzeba wielu GPU
lub obserwowalności?} F -->|Tak| E F -->|Nie| G{Zmierzone problemy
ze współbieżnością?} G -->|Nie| C G -->|Tak| E E --> H[Zaplanuj migrację etapową] H --> I[Zweryfikuj obok siebie] I --> J[Stopniowo przełączaj klientów]

Podsumowanie

Ollama jest trudna do pobicia jako lokalny runner modeli. Usuwa wystarczająco wiele pracy związanej z pakowaniem i konfiguracją, aby developerzy mogli skupić się na modelu i aplikacji, a nie na stosie inferencji.

vLLM staje się silniejszym wyborem, gdy sam serwer jest problemem inżynieryjnym. Równoległy ruch, kolejkowanie, powtarzane długie prefiksy, modele multi-GPU, planowanie pojemności i obserwowalność produkcyjna to sygnały migracji, które mają znaczenie.

Nie migruj, ponieważ vLLM ma dłuższą listę funkcji. Migruj, gdy pomiary pokażą, że prostszy model operacyjny Ollamy nie pasuje już do obciążenia. Do tego momentu prostota nie jest techniczną słabością; to optymalizacja.

Subskrybuj

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