vLLM Szybki start: Wdrażanie dużych modeli językowych o wysokiej wydajności – w 2026 roku
Szybkie wnioskowanie LLM z wykorzystaniem API OpenAI
vLLM to wysokioprądowy, oszczędny pamięciowo silnik inferencji i serwowania dla Dużych Modeli Językowych (LLM), opracowany przez Laboratorium Obliczeń Nieba UC Berkeley.
Dzięki rewolucyjnemu algorytmowi PagedAttention, vLLM osiąga 14-24 razy większą przepustowość niż tradycyjne metody serwowania, stając się standardowym wyborem wdrożeń produkcyjnych LLM. Aby zobaczyć, jak vLLM wpisuje się w kontekst Ollama, Docker Model Runner, LocalAI oraz dostawców chmurowych – w tym kompromisy kosztowe i infrastrukturalne – zobacz LLM Hosting: Lokalne, Własne i Chmurowe Infrastruktury Porównane.

Czym jest vLLM?
vLLM (virtual LLM) to biblioteka open-source do szybkiej inferencji i serwowania LLM, która szybko stała się standardem branżowym wdrożeń produkcyjnych. Uruchomiona w 2023 roku, wprowadziła PagedAttention, przełomową technikę zarządzania pamięcią, która dramatycznie poprawia efektywność serwowania.
Kluczowe funkcje
Wysoka wydajność przepustowości: vLLM zapewnia 14-24 razy większą przepustowość w porównaniu do HuggingFace Transformers przy tym samym sprzęcie. Ogromna wydajność wynika z ciągłego batchowania, zoptymalizowanych jąder CUDA oraz algorytmu PagedAttention, który eliminuje fragmentację pamięci.
Zgodność z API OpenAI: vLLM zawiera wbudowany serwer API w pełni kompatybilny z formatem OpenAI. Pozwala to na bezproblemową migrację z OpenAI do infrastruktury własnej bez konieczności zmiany kodu aplikacji. Wystarczy wskazać klienta API na endpoint vLLM i wszystko działa transparentnie.
Algorytm PagedAttention: Kluczową innowacją stojącą za wydajnością vLLM jest PagedAttention, który stosuje koncepcję stronicowania pamięci wirtualnej do mechanizmów uwagi. Zamiast przydzielać ciągłych bloków pamięci dla buforów KV (co prowadzi do fragmentacji), PagedAttention dzieli pamięć na bloki o stałym rozmiarze, które mogą być przydzielane na żądanie. To redukuje marnotrawstwo pamięci nawet o 4 razy i umożliwia znacznie większe rozmiary batchów.
Ciągłe batchowanie: W przeciwieństwie do statycznego batchowania, gdzie czekasz na zakończenie wszystkich sekwencji, vLLM wykorzystuje ciągłe (toczące) batchowanie. Jak tylko jedna sekwencja się zakończy, nowa może zostać dodana do batchu. To maksymalizuje wykorzystanie GPU i minimalizuje opóźnienia dla nadchodzących żądań.
Wsparcie dla wielu GPU: vLLM wspiera równoległe przetwarzanie tensorów i równoległe przetwarzanie pipeline’owe do rozdzielania dużych modeli między wiele GPU. Może efektywnie serwować modele, które nie mieszczą się w pamięci pojedynczego GPU, obsługując konfiguracje od 2 do 8+ GPU.
Szerokie wsparcie dla modeli: Zgodne z popularnymi architekturami modeli, w tym LLaMA, Mistral, Mixtral, Qwen, Phi, Gemma i wieloma innymi. Obsługuje zarówno modele z dokuczaniem instrukcji, jak i bazowe z HuggingFace Hub.
Kiedy używać vLLM
vLLM doskonale sprawdza się w specyficznych scenariuszach, gdzie jego mocne strony lśnią:
Usługi API produkcyjne: Kiedy potrzebujesz serwować LLM dla wielu równoczesnych użytkowników przez API, wysoka przepustowość i efektywne batchowanie vLLM czynią go najlepszym wyborem. Firmy obsługujące chatboty, asystentów kodowania lub usługi generowania treści korzystają z jego zdolności do obsługi setek żądań na sekundę.
Obciążenia o wysokiej konkurencji: Jeśli Twoja aplikacja ma wielu jednoczesnych użytkowników wysyłających żądania, ciągłe batchowanie i PagedAttention vLLM umożliwiają obsługę większej liczby użytkowników z tym samym sprzętem w porównaniu do alternatyw.
Optymalizacja kosztów: Kiedy koszty GPU są kwestią, wysoka przepustowość vLLM oznacza, że możesz obsłużyć ten sam ruch z mniejszą liczbą GPU, bezpośrednio redukując koszty infrastruktury. 4-krotna wydajność pamięciowa z PagedAttention pozwala również na używanie mniejszych, tańszych instancji GPU.
Wdrożenia Kubernetes: Bezstanowa architektura i przyjazna kontenerom struktura vLLM czynią go idealnym dla klastrów Kubernetes. Jego stabilna wydajność pod obciążeniem i proste zarządzanie zasobami dobrze integrują się z infrastrukturą natywną chmurową.
Kiedy NIE używać vLLM: Do lokalnego rozwoju, eksperymentów lub scenariuszy jednoosobowych, narzędzia takie jak Ollama lub llama.cpp zapewniają lepsze doświadczenie użytkownika z prostszym ustawieniem. Złożoność vLLM jest uzasadniona, gdy potrzebujesz jego przewag wydajnościowych do obciążeń produkcyjnych.
Jak zainstalować vLLM
Wymagania wstępne
Przed instalacją vLLM upewnij się, że Twój system spełnia te wymagania:
- GPU: NVIDIA GPU z wydajnością obliczeniową 7.0+ (V100, T4, A10, A100, H100, seria RTX 20/30/40)
- CUDA: Wersja 11.8 lub nowsza
- Python: 3.8 do 3.11
- VRAM: Minimum 16GB dla modeli 7B, 24GB+ dla 13B, 40GB+ dla większych modeli
- Sterownik: NVIDIA driver 450.80.02 lub nowszy
Instalacja przez pip
Najprostszą metodą instalacji jest użycie pip. Działa to na systemach z CUDA 11.8 lub nowszym:
# Utwórz środowisko wirtualne (zalecane)
python3 -m venv vllm-env
source vllm-env/bin/activate
# Zainstaluj vLLM
pip install vllm
# Zweryfikuj instalację
python -c "import vllm; print(vllm.__version__)"
Dla systemów z innymi wersjami CUDA, zainstaluj odpowiedni pakiet wheel:
# Dla CUDA 12.1
pip install vllm==0.4.2+cu121 -f https://github.com/vllm-project/vllm/releases
# Dla CUDA 11.8
pip install vllm==0.4.2+cu118 -f https://github.com/vllm-project/vllm/releases
Instalacja z Dockerem
Docker zapewnia najbardziej niezawodną metodę wdrożenia, szczególnie w produkcji:
# Pobierz oficjalny obraz vLLM
docker pull vllm/vllm-openai:latest
# Uruchom vLLM z wsparciem GPU
docker run --runtime nvidia --gpus all \
-v ~/.cache/huggingface:/root/.cache/huggingface \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model mistralai/Mistral-7B-Instruct-v0.2
Flaga --ipc=host jest ważna dla konfiguracji wielogpu, ponieważ umożliwia prawidłową komunikację międzyprocesową.
Budowanie z źródła
Dla najnowszych funkcji lub niestandardowych modyfikacji, zbuduj z źródła:
git clone https://github.com/vllm-project/vllm.git
cd vllm
pip install -e .
Szybki przewodnik po vLLM
Uruchomienie pierwszego modelu
Rozpocznij vLLM z modelem, używając interfejsu wiersza polecenia:
# Pobierz i serwuj Mistral-7B z API zgodnym z OpenAI
python -m vllm.entrypoints.openai.api_server \
--model mistralai/Mistral-7B-Instruct-v0.2 \
--port 8000
vLLM automatycznie pobierze model z HuggingFace Hub (jeśli nie jest w pamięci podręcznej) i uruchomi serwer. Zobaczysz wyjście wskazujące, że serwer jest gotowy:
INFO: Started server process [12345]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000
Wysyłanie żądań API
Gdy serwer działa, możesz wysyłać żądania używając klienta Pythona OpenAI lub curl:
Używając curl:
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "mistralai/Mistral-7B-Instruct-v0.2",
"prompt": "Wyjaśnij czym jest vLLM w jednym zdaniu:",
"max_tokens": 100,
"temperature": 0.7
}'
Używając klienta Pythona OpenAI:
from openai import OpenAI
# Wskaż na swój serwer vLLM
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="not-needed" # vLLM nie wymaga autentykacji domyślnie
)
response = client.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.2",
prompt="Wyjaśnij czym jest vLLM w jednym zdaniu:",
max_tokens=100,
temperature=0.7
)
print(response.choices[0].text)
API uzupełnień czatu:
response = client.chat.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.2",
messages=[
{"role": "system", "content": "Jesteś pomocnym asystentem."},
{"role": "user", "content": "Czym jest PagedAttention?"}
],
max_tokens=200
)
print(response.choices[0].message.content)
Zaawansowana konfiguracja
vLLM oferuje wiele parametrów do optymalizacji wydajności:
python -m vllm.entrypoints.openai.api_server \
--model mistralai/Mistral-7B-Instruct-v0.2 \
--port 8000 \
--gpu-memory-utilization 0.95 \ # Użyj 95% pamięci GPU
--max-model-len 8192 \ # Maksymalna długość sekwencji
--tensor-parallel-size 2 \ # Użyj 2 GPU z równoległym przetwarzaniem tensorów
--dtype float16 \ # Użyj precyzji FP16
--max-num-seqs 256 # Maksymalny rozmiar batchu
Wyjaśnienie kluczowych parametrów:
--gpu-memory-utilization: Ile pamięci GPU użyć (0.90 = 90%). Wyższe wartości pozwalają na większe batchy, ale zostawiają mniej marginesu na skoki pamięci.--max-model-len: Maksymalna długość kontekstu. Zmniejszenie tego parametru oszczędza pamięć dla większych batchów.--tensor-parallel-size: Liczba GPU do podziału modelu.--dtype: Typ danych dla wag (float16, bfloat16 lub float32). FP16 jest zazwyczaj optymalny.--max-num-seqs: Maksymalna liczba sekwencji do przetworzenia w batchu.
Porównanie vLLM vs Ollama
Zarówno vLLM, jak i Ollama są popularnymi wyborami do lokalnego hostingu LLM, ale celują w różne przypadki użycia. Zrozumienie, kiedy używać każdego narzędzia, może znacznie wpłynąć na sukces projektu.
Wydajność i przepustowość
vLLM jest zaprojektowany dla maksymalnej przepustowości w scenariuszach z wieloma użytkownikami. Jego PagedAttention i ciągłe batchowanie umożliwiają obsługę setek równoczesnych żądań efektywnie. Benchmarki pokazują, że vLLM osiąga 14-24 razy większą przepustowość niż standardowe implementacje oraz 2-4 razy więcej niż Ollama przy wysokiej konkurencji.
Ollama optymalizuje pod interaktywne użycie jednoosobowe z naciskiem na niskie opóźnienia dla pojedynczych żądań. Choć nie dorównuje przepustowości vLLM dla wielu użytkowników, zapewnia doskonałą wydajność dla rozwoju i użytku osobistego z szybszymi czasami zimnego startu i niższym zużyciem zasobów w stanie bezczynności.
Łatwość użycia
Ollama wygrywa zdecydowanie w prostocie. Instalacja to pojedyncze polecenie (curl | sh), a uruchamianie modeli jest tak proste jak ollama run llama2. Zawiera bibliotekę modeli z wersjami z kwantyzacją zoptymalizowanymi pod różne profile sprzętowe. Doświadczenie użytkownika przypomina Docker – pobierz, uruchom i działaj.
vLLM wymaga więcej ustawienia: zarządzanie środowiskiem Pythona, instalacja CUDA, zrozumienie parametrów serwowania i ręczne określenie modelu. Krzywa uczenia jest stromsza, ale zyskujesz drobną kontrolę nad optymalizacją wydajności. Ta złożoność jest uzasadniona dla wdrożeń produkcyjnych, gdzie potrzebujesz wycisnąć maksymalną wydajność ze swojego sprzętu.
API i integracja
vLLM zapewnia API REST zgodne z OpenAI “out of the box”, czyniąc je bezproblemową wymianą dla API OpenAI w istniejących aplikacjach. Jest to kluczowe dla migracji usług produkcyjnych z dostawców chmurowych do infrastruktury własnej bez zmian w kodzie.
Ollama oferuje prostsze API REST i dedykowaną bibliotekę Pythona/JavaScript. Choć funkcjonalne, nie jest zgodne z OpenAI, wymagając zmian w kodzie przy integracji z aplikacjami oczekującymi formatu OpenAI. Jednak projekty społecznościowe, takie jak adaptery Ollama-OpenAI, wypełniają tę lukę.
Zarządzanie pamięcią
Algorytm PagedAttention vLLM zapewnia wyższą efektywność pamięci dla równoczesnych żądań. Może obsługiwać 2-4 razy więcej równoczesnych użytkowników z tą samą VRAM w porównaniu do naiwnych implementacji. To bezpośrednio przekłada się na oszczędności kosztów we wdrożeniach produkcyjnych.
Ollama wykorzystuje prostsze zarządzanie pamięcią odpowiednie dla scenariuszy jednoosobowych. Automatycznie zarządza ładowaniem/rozładowaniem modeli na podstawie aktywności, co jest wygodne dla rozwoju, ale nieoptymalne dla wysokokonkurencyjnego użytku produkcyjnego.
Wsparcie dla wielu GPU
vLLM doskonale radzi sobie z natywnym równoległym przetwarzaniem tensorów i pipeline’owym, efektywnie rozdzielając modele między 2-8+ GPU. Jest to niezbędne do serwowania dużych modeli, takich jak LLM o 70 mld parametrów, które nie mieszczą się w jednym GPU.
Ollama ma obecnie ograniczone wsparcie dla wielu GPU, działając najlepiej z jednym GPU. To czyni go mniej odpowiednim dla bardzo dużych modeli wymagających rozproszonej inferencji.
Rekomendacje przypadków użycia
Wybierz vLLM gdy:
- Serwujesz API produkcyjne z wieloma równoczesnymi użytkownikami
- Optymalizujesz koszt na żądanie we wdrożeniach chmurowych
- Działasz w Kubernetes lub platformach orkiestracji kontenerów
- Potrzebujesz kompatybilności z API OpenAI dla istniejących aplikacji
- Serwujesz duże modele wymagające wsparcia dla wielu GPU
- Wydajność i przepustowość są krytycznymi wymaganiami
Wybierz Ollamę gdy:
- Lokalny rozwój i eksperymenty
- Interaktywne użycie jednoosobowe (osobiste asystenci, chatboty)
- Szybkie prototypowanie i ocena modeli
- Nauka o LLM bez złożoności infrastrukturalnej
- Działasz na stacjach roboczych lub laptopach osobistych
- Prostota i łatwość użycia są priorytetami
Wiele zespołów używa obu: Ollama do rozwoju i eksperymentów, a następnie vLLM do wdrożenia produkcyjnego. Ta kombinacja zapewnia produktywność deweloperską, zachowując wydajność produkcyjną.
Porównanie vLLM vs Docker Model Runner
Docker niedawno wprowadził Model Runner (dawniej GenAI Stack) jako swoje oficjalne rozwiązanie do lokalnego wdrażania modeli AI. Jak się ono ma do vLLM?
Filozofia architektury
Docker Model Runner dąży do bycia “Dockerem dla AI” – prostym, standaryzowanym sposobem uruchamiania modeli AI lokalnie z tą samą łatwością co uruchamiania kontenerów. Abstrahuje złożoność i zapewnia spójny interfejs między różnymi modelami i frameworkami.
vLLM to wyspecjalizowany silnik inferencji skoncentrowany wyłącznie na serwowaniu LLM z maksymalną wydajnością. Jest to narzędzie niższego poziomu, które konteneryzujesz z Dockerem, a nie kompletna platforma.
Ustawienia i szybki start
Instalacja Docker Model Runner jest prosta dla użytkowników Dockera:
docker model pull llama3:8b
docker model run llama3:8b
Ta podobieństwo do przepływu pracy obrazów Dockera sprawia, że jest natychmiastowo znajome dla deweloperów już używających kontenerów.
vLLM wymaga więcej wstępnego ustawienia (Python, CUDA, zależności) lub używania gotowych obrazów Docker:
docker pull vllm/vllm-openai:latest
docker run --runtime nvidia --gpus all vllm/vllm-openai:latest --model <nazwa-modelu>
Charakterystyki wydajności
vLLM dostarcza wyższą przepustowość w scenariuszach z wieloma użytkownikami dzięki PagedAttention i ciągłemu batchowaniu. Dla usług API produkcyjnych obsługujących setki żądań na sekundę, optymalizacje vLLM zapewniają 2-5 razy lepszą przepustowość niż ogólne podejścia serwowania.
Docker Model Runner skupia się na łatwości użycia zamiast maksymalnej wydajności. Jest odpowiedni do lokalnego rozwoju, testów i umiarkowanych obciążeń, ale nie implementuje zaawansowanych optymalizacji, które czynią vLLM wybitnym w skali.
Wsparcie modeli
Docker Model Runner zapewnia kuratorowaną bibliotekę modeli z dostępem do popularnych modeli w jednym poleceniu. Obsługuje wiele frameworków (nie tylko LLM), w tym Stable Diffusion, Whisper i inne modele AI, czyniąc go bardziej wszechstronnym dla różnych obciążeń AI.
vLLM specjalizuje się w inferencji LLM z głębokim wsparciem dla modeli językowych opartych na transformatorach. Obsługuje każdy LLM zgodny z HuggingFace, ale nie rozszerza się na inne typy modeli AI, takie jak generowanie obrazów czy rozpoznawanie mowy.
Wdrożenie produkcyjne
vLLM jest przetestowany w produkcji w firmach takich jak Anthropic, Replicate i wielu innych obsługujących miliardy tokenów dziennie. Jego cechy wydajnościowe i stabilność pod dużym obciążeniem czynią go domyślnym standardem dla serwowania LLM w produkcji.
Docker Model Runner jest nowszy i pozycjonuje się bardziej do scenariuszy rozwoju i lokalnego testowania. Choć może obsługiwać ruch produkcyjny, brakuje mu udokumentowanej historii i optymalizacji wydajności, których wymagają wdrożenia produkcyjne.
Ekosystem integracji
vLLM integruje się z narzędzami infrastruktury produkcyjnej: operatorami Kubernetes, metrykami Prometheus, Ray do rozproszonego serwowania i rozszerzoną kompatybilnością z API OpenAI dla istniejących aplikacji.
Docker Model Runner integruje się naturalnie z ekosystemem Dockera i Docker Desktop. Dla zespołów już standaryzowanych na Dockerze, ta integracja zapewnia spójne doświadczenie, ale mniej wyspecjalizowanych funkcji serwowania LLM.
Kiedy używać każdego
Użyj vLLM dla:
- Produkcji API LLM
- Wdrożeń o wysokiej przepustowości z wieloma użytkownikami
- Wdrożeń chmurowych wrażliwych na koszty wymagających maksymalnej efektywności
- Środowisk Kubernetes i natywnych chmurowych
- Kiedy potrzebujesz udowodnionej skalowalności i wydajności
Użyj Docker Model Runner dla:
- Lokalnego rozwoju i testów
- Uruchamiania różnych typów modeli AI (nie tylko LLM)
- Zespołów mocno zaangażowanych w ekosystem Dockera
- Szybkich eksperymentów bez ustawiania infrastruktury
- Celów edukacyjnych i naukowych
Podejście hybrydowe: Wiele zespołów rozwija się z Docker Model Runner lokalnie dla wygody, a następnie wdraża z vLLM w produkcji dla wydajności. Obrazy Docker Model Runner mogą również być używane do uruchamiania kontenerów vLLM, łącząc oba podejścia.
Najlepsze praktyki wdrożenia produkcyjnego
Wdrożenie Docker
Utwórz konfigurację Docker Compose gotową do produkcji:
version: '3.8'
services:
vllm:
image: vllm/vllm-openai:latest
runtime: nvidia
environment:
- CUDA_VISIBLE_DEVICES=0,1
volumes:
- ~/.cache/huggingface:/root/.cache/huggingface
- ./logs:/logs
ports:
- "8000:8000"
command: >
--model mistralai/Mistral-7B-Instruct-v0.2
--tensor-parallel-size 2
--gpu-memory-utilization 0.90
--max-num-seqs 256
--max-model-len 8192
restart: unless-stopped
shm_size: '16gb'
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 2
capabilities: [gpu]
Wdrożenie Kubernetes
Wdróż vLLM na Kubernetes dla skali produkcyjnej:
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-server
spec:
replicas: 2
selector:
matchLabels:
app: vllm
template:
metadata:
labels:
app: vllm
spec:
containers:
- name: vllm
image: vllm/vllm-openai:latest
args:
- --model
- mistralai/Mistral-7B-Instruct-v0.2
- --tensor-parallel-size
- "2"
- --gpu-memory-utilization
- "0.90"
resources:
limits:
nvidia.com/gpu: 2
ports:
- containerPort: 8000
volumeMounts:
- name: cache
mountPath: /root/.cache/huggingface
volumes:
- name: cache
hostPath:
path: /mnt/huggingface-cache
---
apiVersion: v1
kind: Service
metadata:
name: vllm-service
spec:
selector:
app: vllm
ports:
- port: 80
targetPort: 8000
type: LoadBalancer
Monitorowanie i obserwowalność
vLLM wystawia metryki Prometheus do monitorowania:
import requests
# Pobierz metryki
metrics = requests.get("http://localhost:8000/metrics").text
print(metrics)
Kluczowe metryki do monitorowania:
vllm:num_requests_running– Aktywne żądaniavllm:gpu_cache_usage_perc– Wykorzystanie bufora KVvllm:time_to_first_token– Metryka opóźnieniavllm:time_per_output_token– Szybkość generowania
Tuning wydajności
Optymalizuj wykorzystanie pamięci GPU: Zacznij od --gpu-memory-utilization 0.90 i dostosuj na podstawie obserwowanego zachowania. Wyższe wartości pozwalają na większe batchy, ale ryzykują błędy OOM podczas szczytów ruchu.
Dostosuj maksymalną długość sekwencji: Jeśli Twój przypadek użycia nie potrzebuje pełnej długości kontekstu, zmniejsz --max-model-len. To zwalnia pamięć dla większych batchów. Na przykład, jeśli potrzebujesz tylko 4K kontekstu, ustaw --max-model-len 4096 zamiast używać maksymalnej długości modelu (często 8K-32K).
Wybierz odpowiednią kwantyzację: Dla modeli, które to obsługują, użyj zkwantyzowanych wersji (8-bit, 4-bit), aby zmniejszyć pamięć i zwiększyć przepustowość:
--quantization awq # Dla zkwantyzowanych modeli AWQ
--quantization gptq # Dla zkwantyzowanych modeli GPTQ
Włącz buforowanie prefiksów: Dla aplikacji z powtarzającymi się promptami (takimi jak chatboty z wiadomościami systemowymi), włącz buforowanie prefiksów:
--enable-prefix-caching
To buforuje wartości KV dla częstych prefiksów, redukując obliczenia dla żądań dzielących ten sam prefiks promptu.
Rozwiązywanie typowych problemów
Błędy przepełnienia pamięci
Objawy: Serwer upada z błędami CUDA out of memory.
Rozwiązania:
- Zmniejsz
--gpu-memory-utilizationdo 0.85 lub 0.80 - Zmniejsz
--max-model-len, jeśli Twój przypadek użycia na to pozwala - Zmniejsz
--max-num-seqs, aby zmniejszyć rozmiar batchu - Użyj wersji modelu z kwantyzacją
- Włącz równoległe przetwarzanie tensorów do rozdzielania między więcej GPU
Niska przepustowość
Objawy: Serwer obsługuje mniej żądań niż oczekiwano.
Rozwiązania:
- Zwiększ
--max-num-seqs, aby pozwolić na większe batchy - Zwiększ
--gpu-memory-utilization, jeśli masz wolne zasoby - Sprawdź, czy CPU nie jest wąskim gardłem z
htop– rozważ szybsze CPU - Zweryfikuj wykorzystanie GPU z
nvidia-smi– powinno być 95%+ - Włącz FP16, jeśli używasz FP32:
--dtype float16
Wolny czas pierwszego tokena
Objawy: Wysokie opóźnienie przed rozpoczęciem generowania.
Rozwiązania:
- Użyj mniejszych modeli dla aplikacji wrażliwych na opóźnienia
- Włącz buforowanie prefiksów dla powtarzających się promptów
- Zmniejsz
--max-num-seqs, aby priorytetyzować opóźnienia zamiast przepustowości - Rozważ dekodowanie spekulacyjne dla obsługiwanych modeli
- Zoptymalizuj konfigurację równoległego przetwarzania tensorów
Niepowodzenia ładowania modelu
Objawy: Serwer nie może się uruchomić, nie może załadować modelu.
Rozwiązania:
- Zweryfikuj, czy nazwa modelu dokładnie pasuje do formatu HuggingFace
- Sprawdź łączność sieci z HuggingFace Hub
- Upewnij się, że masz wystarczająco miejsca na dysku w
~/.cache/huggingface - Dla zamkniętych modeli, ustaw zmienną środowiskową
HF_TOKEN - Spróbuj ręcznie pobrać z
huggingface-cli download <model>
Zaawansowane funkcje
Dekodowanie spekulacyjne
vLLM wspiera dekodowanie spekulacyjne, gdzie mniejszy model szkicowy proponuje tokeny, które większy model docelowy weryfikuje. To może przyspieszyć generowanie o 1.5-2x:
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-2-70b-chat-hf \
--speculative-model meta-llama/Llama-2-7b-chat-hf \
--num-speculative-tokens 5
Adaptery LoRA
Serwuj wiele adapterów LoRA na bazie modelu bez ładowania wielu pełnych modeli:
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-2-7b-hf \
--enable-lora \
--lora-modules sql-lora=./ścieżka/do/sql-adapter \
code-lora=./ścieżka/do/code-adapter
Następnie określ, którego adaptera użyć dla każdego żądania:
response = client.completions.create(
model="sql-lora", # Użyj adaptera SQL
prompt="Konwertuj to do SQL: Pokaż mi wszystkich użytkowników utworzonych w tym miesiącu"
)
Serwowanie wielu LoRA
Serwowanie wielu LoRA vLLM pozwala hostować dziesiące dopracowanych adapterów z minimalnym narzutem pamięci. To idealne dla serwowania wariantów modeli specyficznych dla klienta lub zadania:
# Żądanie z konkretnym adapterem LoRA
response = client.chat.completions.create(
model="meta-llama/Llama-2-7b-hf",
messages=[{"role": "user", "content": "Napisz zapytanie SQL"}],
extra_body={"lora_name": "sql-lora"}
)
Buforowanie prefiksów
Włącz automatyczne buforowanie prefiksów, aby uniknąć ponownego obliczania bufora KV dla powtarzających się prefiksów promptów:
--enable-prefix-caching
To jest szczególnie skuteczne dla:
- Chatbotów z ustalonymi promptami systemowymi
- Aplikacji RAG ze stałymi szablonami kontekstu
- Promptów nauki few-shot powtarzanych między żądaniami
Buforowanie prefiksów może zmniejszyć czas do pierwszego tokena o 50-80% dla żądań dzielących prefiksy promptów.
Przykłady integracji
Integracja LangChain
from langchain.llms import VLLMOpenAI
llm = VLLMOpenAI(
openai_api_key="EMPTY",
openai_api_base="http://localhost:8000/v1",
model_name="mistralai/Mistral-7B-Instruct-v0.2",
max_tokens=512,
temperature=0.7,
)
response = llm("Wyjaśnij PagedAttention w prostych słowach")
print(response)
Integracja LlamaIndex
from llama_index.llms import VLLMServer
llm = VLLMServer(
api_url="http://localhost:8000/v1",
model="mistralai/Mistral-7B-Instruct-v0.2",
temperature=0.7,
max_tokens=512
)
response = llm.complete("Czym jest vLLM?")
print(response)
Aplikacja FastAPI
from fastapi import FastAPI
from openai import AsyncOpenAI
app = FastAPI()
client = AsyncOpenAI(
base_url="http://localhost:8000/v1",
api_key="not-needed"
)
@app.post("/generate")
async def generate(prompt: str):
response = await client.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.2",
prompt=prompt,
max_tokens=200
)
return {"result": response.choices[0].text}
Benchmarki wydajności
Dane wydajnościowe w świecie rzeczywistym pomogą zilustrować zalety vLLM:
Porównanie przepustowości (Mistral-7B na GPU A100):
- vLLM: ~3,500 tokenów/sekundę z 64 równoczesnymi użytkownikami
- HuggingFace Transformers: ~250 tokenów/sekundę z tą samą konkurencją
- Ollama: ~1,200 tokenów/sekundę z tą samą konkurencją
- Wynik: vLLM zapewnia 14-krotną poprawę nad podstawowymi implementacjami
Efektywność pamięci (LLaMA-2-13B):
- Standardowa implementacja: 24GB VRAM, 32 równoczesne sekwencje
- vLLM z PagedAttention: 24GB VRAM, 128 równoczesnych sekwencji
- Wynik: 4 razy więcej równoczesnych żądań z tą samą pamięcią
Opóźnienia pod obciążeniem (Mixtral-8x7B na 2xA100):
- vLLM: Opóźnienie P50 180ms, P99 420ms przy 100 żądań/s
- Standardowe serwowanie: Opóźnienie P50 650ms, P99 3,200ms przy 100 żądań/s
- Wynik: vLLM utrzymuje spójne opóźnienia pod wysokim obciążeniem
Te benchmarki pokazują, dlaczego vLLM stał się domyślnym standardem dla serwowania LLM w produkcji, gdzie wydajność ma znaczenie.
Analiza kosztów
Zrozumienie implikacji kosztowych wyboru vLLM:
Scenariusz: Obsługa 1M żądań/dzień
Ze standardowym serwowaniem:
- Wymagane: 8x GPU A100 (80GB)
- Koszt AWS: ~$32/godzina × 24 × 30 = $23,040/miesiąc
- Koszt na 1M tokenów: ~$0.75
Z vLLM:
- Wymagane: 2x GPU A100 (80GB)
- Koszt AWS: ~$8/godzina × 24 × 30 = $5,760/miesiąc
- Koszt na 1M tokenów: ~$0.19
- Oszczędności: $17,280/miesiąc (redukcja o 75%)
Ta przewaga kosztowa rośnie ze skalą. Organizacje obsługujące miliardy tokenów miesięcznie oszczędzają setki tysięcy dolarów, używając zoptymalizowanego serwowania vLLM zamiast naiwnych implementacji.
Rozważania bezpieczeństwa
Autentykacja
vLLM nie zawiera autentykacji domyślnie. W produkcji zaimplementuj autentykację na poziomie reverse proxy:
# Konfiguracja Nginx
location /v1/ {
auth_request /auth;
proxy_pass http://vllm-backend:8000;
}
location /auth {
proxy_pass http://auth-service:8080/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
Lub użyj bram API takich jak Kong, Traefik lub AWS API Gateway dla autentykacji i limitowania szybkości klasy enterprise.
Izolacja sieci
Uruchamiaj vLLM w prywatnych sieciach, nie wystawiając bezpośrednio do internetu:
# Przykład NetworkPolicy Kubernetes
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: vllm-access
spec:
podSelector:
matchLabels:
app: vllm
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: api-gateway
ports:
- protocol: TCP
port: 8000
Limitowanie szybkości
Zaimplementuj limitowanie szybkości, aby zapobiec nadużyciom:
# Przykład używający Redis do limitowania szybkości
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
import redis
from datetime import datetime, timedelta
app = FastAPI()
redis_client = redis.Redis(host='localhost', port=6379)
@app.middleware("http")
async def rate_limit_middleware(request, call_next):
client_ip = request.client.host
key = f"rate_limit:{client_ip}"
requests = redis_client.incr(key)
if requests == 1:
redis_client.expire(key, 60) # Okno 60 sekund
if requests > 60: # 60 żądań na minutę
raise HTTPException(status_code=429, detail="Przekroczono limit szybkości")
return await call_next(request)
Kontrola dostępu do modelu
Dla wdrożeń wielotenantowych, kontroluj, którzy użytkownicy mogą uzyskać dostęp do których modeli:
ALLOWED_MODELS = {
"user_tier_1": ["mistralai/Mistral-7B-Instruct-v0.2"],
"user_tier_2": ["mistralai/Mistral-7B-Instruct-v0.2", "meta-llama/Llama-2-13b-chat-hf"],
"admin": ["*"] # Wszystkie modele
}
def verify_model_access(user_tier: str, model: str) -> bool:
allowed = ALLOWED_MODELS.get(user_tier, [])
return "*" in allowed or model in allowed
Przewodnik migracji
Z OpenAI do vLLM
Migracja z OpenAI do samodzielnie hostowanego vLLM jest prosta dzięki kompatybilności API:
Przed (OpenAI):
from openai import OpenAI
client = OpenAI(api_key="sk-...")
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Cześć"}]
)
Po (vLLM):
from openai import OpenAI
client = OpenAI(
base_url="https://twoj-serwer-vllm.com/v1",
api_key="twoj-wewnetrzny-klucz" # Jeśli dodałeś autentykację
)
response = client.chat.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.2",
messages=[{"role": "user", "content": "Cześć"}]
)
Występują tylko dwie zmiany: zaktualizuj base_url i nazwę modelu. Cały inny kod pozostaje identyczny.
Z Ollama do vLLM
Ollama używa innego formatu API. Oto konwersja:
API Ollama:
import requests
response = requests.post('http://localhost:11434/api/generate',
json={
'model': 'llama2',
'prompt': 'Dlaczego niebo jest niebieskie?'
})
Ekwiwalent vLLM:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
response = client.completions.create(
model="meta-llama/Llama-2-7b-chat-hf",
prompt="Dlaczego niebo jest niebieskie?"
)
Będziesz musiał zaktualizować wywołania API w całej bazie kodu, ale biblioteki klienta OpenAI zapewniają lepsze obsługę błędów i funkcje.
Z HuggingFace Transformers do vLLM
Migracja bezpośredniego użycia Pythona:
HuggingFace:
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2")
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2")
inputs = tokenizer("Cześć", return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=100)
result = tokenizer.decode(outputs[0])
vLLM:
from vllm import LLM, SamplingParams
llm = LLM(model="mistralai/Mistral-7B-Instruct-v0.2")
sampling_params = SamplingParams(max_tokens=100)
outputs = llm.generate("Cześć", sampling_params)
result = outputs[0].outputs[0].text
API Pythona vLLM jest prostsze i znacznie szybsze dla inferencji batchowej.
Przyszłość vLLM
vLLM kontynuuje szybki rozwój z ekscytującymi funkcjami na roadmapie:
Serwowanie rozproszone: Oddzielenie prefiksu (przetwarzanie promptu) i dekodowania (generowanie tokenów) na różne GPU, aby zoptymalizować wykorzystanie zasobów. Prefiks jest obciążony obliczeniowo, podczas gdy dekodowanie jest obciążone pamięcią, więc uruchamianie ich na wyspecjalizowanym sprzęcie poprawia efektywność.
Inferencja wielowątkowa: Rozdzielanie bardzo dużych modeli (100 mld+ parametrów) między wiele maszyn, umożliwiając serwowanie modeli zbyt dużych dla ustawień jedno-węzłowych.
Ulepszona kwantyzacja: Wsparcie dla nowych formatów kwantyzacji takich jak GGUF (używany przez llama.cpp) i ulepszona integracja AWQ/GPTQ dla lepszej wydajności z zkwantyzowanymi modelami.
Ulepszenia dekodowania spekulacyjnego: Bardziej efektywne modele szkicowe i adaptacyjne strategie spekulacji, aby osiągnąć wyższe przyspieszenia bez utraty dokładności.
Optymalizacje uwagi: FlashAttention 3, ring attention dla ekstremalnie długich kontekstów (100K+ tokenów) i inne najnowsze mechanizmy uwagi.
Lepsze pokrycie modeli: Rozszerzenie wsparcia dla modeli wielomodalnych (wizja-język), modeli audio i specjalnych architektur, gdy się pojawią.
Projekt vLLM utrzymuje aktywny rozwój z wkładem UC Berkeley, Anyscale i szerszej społeczności open-source. Gdy wdrażanie LLM staje się coraz bardziej krytyczne dla systemów produkcyjnych, rola vLLM jako standardu wydajnościowego nadal rośnie.
Aby uzyskać szersze porównanie vLLM z innymi lokalnymi i chmurowymi infrastrukturami LLM, sprawdź nasz LLM Hosting: Lokalne, Własne i Chmurowe Infrastruktury Porównane.
Przydatne linki
Powiązane artykuły na tej stronie
-
Lokalny hosting LLM: Kompletny przewodnik 2026 - Ollama, vLLM, LocalAI, Jan, LM Studio i więcej - Kompleksowe porównanie 12+ lokalnych narzędzi hostingu LLM, w tym szczegółowa analiza vLLM obok Ollama, LocalAI, Jan, LM Studio i innych. Obejmuje dojrzałość API, wsparcie wywoływania narzędzi, kompatybilność GGUF i benchmarki wydajności, aby pomóc wybrać odpowiednie rozwiązanie.
-
Cheatsheet Ollama - Pełne odniesienie poleceń Ollama i cheatsheet obejmujące instalację, zarządzanie modelami, używanie API i najlepsze praktyki dla lokalnego wdrażania LLM. Niezbędne dla deweloperów używających Ollama obok lub zamiast vLLM.
-
Szybki start llama.cpp z CLI i serwerem - Lekka inferencja C/C++ dla modeli GGUF z llama-cli i OpenAI-compatible llama-server. Idealna, gdy potrzebujesz drobnej kontroli, wdrożenia offline lub minimalnego stosu bez Pythona.
-
Docker Model Runner vs Ollama: Co wybrać? - Pogłębione porównanie Model Runner Dockera i Ollama do lokalnego wdrażania LLM, analizujące wydajność, wsparcie GPU, kompatybilność API i przypadki użycia. Pomaga zrozumieć krajobraz konkurencyjny, w którym działa vLLM.
-
Cheatsheet Docker Model Runner: Polecenia i przykłady - Praktyczny cheatsheet Docker Model Runner z poleceniami i przykładami dla wdrażania modeli AI. Przydatny dla zespołów porównujących podejście Dockera ze specjalizowanymi zdolnościami serwowania LLM vLLM.
Zewnętrzne zasoby i dokumentacja
-
Repozytorium GitHub vLLM - Oficjalny repozytorium vLLM z kodem źródłowym, kompleksową dokumentacją, przewodnikami instalacji i aktywnymi dyskusjami społeczności. Niezbędny zasób do śledzenia najnowszych funkcji i rozwiązywania problemów.
-
Dokumentacja vLLM - Oficjalna dokumentacja obejmująca wszystkie aspekty vLLM od podstawowego ustawienia do zaawansowanej konfiguracji. Obejmuje odniesienia API, przewodniki optymalizacji wydajności i najlepsze praktyki wdrażania.
-
Praca PagedAttention - Praca akademicka wprowadzająca algorytm PagedAttention, który napędza efektywność vLLM. Niezbędne czytanie dla zrozumienia innowacji technicznych za przewagami wydajnościowymi vLLM.
-
Blog vLLM - Oficjalny blog vLLM z ogłoszeniami wydawniczymi, benchmarkami wydajności, pogłębieniami technicznymi i studiami przypadków społeczności z wdrożeń produkcyjnych.
-
Hub modeli HuggingFace - Kompleksowe repozytorium otwartych modeli LLM, które działają z vLLM. Wyszukaj modele według rozmiaru, zadania, licencji i cech wydajnościowych, aby znaleźć odpowiedni model dla Twojego przypadku użycia.
-
Dokumentacja Ray Serve - Dokumentacja frameworku Ray Serve do budowania skalowalnych, rozproszonych wdrożeń vLLM. Ray zapewnia zaawansowane funkcje, takie jak autoskalowanie, serwowanie wielu modeli i zarządzanie zasobami dla systemów produkcyjnych.
-
NVIDIA TensorRT-LLM - TensorRT-LLM NVIDII do wysoce zoptymalizowanej inferencji na GPU NVIDII. Alternatywa dla vLLM z innymi strategiami optymalizacji, przydatna do porównania i zrozumienia krajobrazu optymalizacji inferencji.
-
Odnośnik API OpenAI - Oficjalna dokumentacja API OpenAI, z którą API vLLM jest kompatybilne. Skonsultuj się z tym, gdy budujesz aplikacje, które muszą działać z endpointami OpenAI i samodzielnie hostowanym vLLM zamiennie.