Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ważna
Ta funkcja jest dostępna w wersji beta. Administratorzy obszaru roboczego mogą kontrolować dostęp do tej funkcji ze strony Podglądy . Zobacz Zarządzanie wersjami zapoznawczami usługi Azure Databricks.
Ta strona pokazuje, jak wdrażać niestandardowe duże modele językowe (LLM) w Model Serving przy użyciu silnika vLLM. Użyj tego przepływu pracy do udostępniania modeli dostrojonych, wariantów PEFT, modeli multimodalnych oraz innych modeli bazowych, które nie są dostępne w interfejsach API modeli bazowych (FMAPI). Notatnik startowy znajdujący się na końcu tej strony zawiera cały kod gotowy do uruchomienia, potrzebny do wykonania poniższych kroków.
Kiedy używać niestandardowej usługi LLM
Azure Databricks zaleca użycie niestandardowej usługi LLM, jeśli masz jeden z następujących przypadków użycia:
- Modele w pełni dostrojone z niestandardowymi wagami, które wytrenowano na platformie Azure Databricks.
- Modele z Hugging Face, które nie są dostępne w FMAPI.
- Niestandardowe przepisy PEFT, których interfejs FMAPI nie obsługuje.
- Wyspecjalizowane modele poza wykazem FMAPI, takie jak MedGemma.
- Modele wielomodalne (język przetwarzania obrazów), takie jak
Qwen/Qwen2.5-VL-3B-Instruct. - Osadzanie modeli, które nie są dostępne w interfejsie FMAPI, takich jak
nomic-ai/nomic-embed-text-v2-moe. - Każdy model, który pasuje do 1xH100 (80 GB pamięci procesora GPU).
Requirements
Niestandardowa obsługa LLM jest w wersji beta. Administratorzy obszaru roboczego mogą włączać lub wyłączać tę funkcję na stronie Podglądy . Zobacz Zarządzanie wersjami zapoznawczami usługi Azure Databricks.
Bezserwerowe obliczenia procesora GPU. Procesor GPU A10 jest zalecanym środowiskiem programistycznym dla mniejszych modeli, H100 dla większych modeli.
MLflow 3.12 lub nowszy i
databricks-sdk>=0.102.0. Notatnik startowy przypisuje na stałemlflow==3.12.0i zgodną wersję zestawu SDK. Jeśli tworzysz własne środowisko, dopasuj je do tych wersji. We wcześniejszych wersjach zestawu SDK może dochodzić do przekroczenia limitu czasu podczas przesyłania artefaktów modelu w trakcie rejestracji. Zobacz Limit czasu przekazywania artefaktów podczas rejestracji.
Krok 1. Konfigurowanie środowiska
Utwórz notatnik w bezserwerowym środowisku obliczeniowym GPU z procesorem graficznym A10. Zainstaluj program vLLM i jego zależności. Początkowy notatnik określa przetestowaną wersję vLLM.
Można również określić zależności za pośrednictwem środowiska bezserwerowego , a nie za pomocą polecenia %pip install.
Ważna
Ustaw katalog roboczy na lokalny dysk twardy (na przykład przy użyciu polecenia tempfile.mkdtemp()). System /Workspace plików nie obsługuje dużych plików, takich jak wagi modelu.
Krok 2. Pobieranie modelu
Pobierz wagi modelu z Hugging Face przy użyciu snapshot_download. Notes początkowy używa Qwen/Qwen3-4B jako przykładu, ale możesz zastąpić go dowolnym modelem, który mieści się w limicie pamięci wybranego procesora GPU, w tym na przykład następującymi:
- Modele wielomodalne, takie jak
Qwen/Qwen2.5-VL-3B-Instruct, do zastosowań wizyjno-językowych. - Większe modele pasujące do 1xH100, takie jak
openai/gpt-oss-120b.
Wybierz procesor GPU na podstawie potrzeb dotyczących pamięci i wydajności modelu.
| procesor GPU | Pamięć procesora GPU | workload_type |
|---|---|---|
| T4 | 16 GB | GPU_SMALL |
| A100 | 80 GB | GPU_LARGE |
Krok 3. Testowanie modelu lokalnie przy użyciu maszyny wirtualnej vLLM
Przed wdrożeniem przetestuj model bezpośrednio w notatniku z bezserwerowym GPU, uruchamiając lokalny serwer vLLM. Testowanie lokalne umożliwia zweryfikowanie modelu, eksperymentowanie z parametrami vLLM i rozwiązywanie problemów przed utworzeniem punktu końcowego obsługującego.
Najważniejsze kwestie do poznania:
- Bezserwerowe obliczenia procesora GPU umożliwiają testowanie lokalne tylko na portach 3000–3999. Wybierz port z tego zakresu; notatnik startowy używa portu 3080.
- Serwer vLLM uwidacznia interfejs API zgodny z interfejsem OpenAI pod adresem
/invocations. - Możesz przetestować zarówno regularne, jak i przesyłane strumieniowo żądania.
- Dostraj parametry, takie jak
--dtype,--max-model-leni--gpu-memory-utilization, dla swojego modelu. - Dodaj
--enforce-eager, aby przyspieszyć uruchamianie, kosztem części wydajności wnioskowania. - W przypadku większych modeli użyj wariantu bezserwerowego procesora GPU H100 do testowania lokalnego.
Gdy uznasz konfigurację za odpowiednią, zatrzymaj lokalny serwer przed kontynuowaniem.
Krok 4. Rejestrowanie modelu przy użyciu niestandardowego punktu wejścia
Ten krok łączy konfigurację lokalną z obsługą modelu i ma następujące wymagania dotyczące konfiguracji:
-
taskmusi być"llm/v1/chat"(modele czatu, w tym wielomodalne) lub"llm/v1/embeddings"(modele osadzające). Zobacz Obsługiwane zadania. - Punkt wejścia musi zostać otwarty na porcie 8080— oczekiwany jest port obsługujący model.
- Polecenie punktu wejścia musi odzwierciedlać to, co przetestowano w kroku 3, przy użyciu portu 8080 zamiast portu lokalnego.
- Punkt wejścia uruchamia się z folderu artefaktów modelu MLflow, więc ścieżki do modelu są względne względem tego folderu.
W przypadku modelu czatu:
metadata = {
"task": "llm/v1/chat",
"entrypoint": (
"python -u -m vllm.entrypoints.openai.api_server "
"--model qwen3 --served-model-name qwen "
"--host 0.0.0.0 --port 8080 "
"--dtype float16 --max-model-len 16384 "
"--gpu-memory-utilization 0.85"
),
}
W przypadku modelu embeddingów ustaw task na "llm/v1/embeddings" i uruchom serwer w trybie embeddingów. W przypadku używanej tutaj wersji vLLM, czyli --runner pooling (starsze wersje vLLM używają --task embed):
metadata = {
"task": "llm/v1/embeddings",
"entrypoint": (
"python -u -m vllm.entrypoints.openai.api_server "
"--model nomic-embed --served-model-name nomic-embed "
"--runner pooling "
"--host 0.0.0.0 --port 8080 "
"--gpu-memory-utilization 0.85"
),
}
Obsługiwane zadania
task |
Typ modelu | Powierzchnia zapytań |
|---|---|---|
llm/v1/chat |
Modele rozmów, w tym wielomodalne (język obrazów) | chat.completions |
llm/v1/embeddings |
Osadzanie modeli | embeddings |
To, co deklarujesz jako task, musi odpowiadać temu, co punkt wejścia rzeczywiście udostępnia: punkt wejścia musi udostępniać interfejs API zgodny z OpenAI dla tego zadania na porcie 8080. Powyższe przykłady używają maszyny wirtualnej vLLM, ale każdy serwer, który spełnia ten kontrakt, działa. Inne typy zadań, takie jak llm/v1/completions, nie są obsługiwane.
Krok 5: Zarejestrować model w usłudze Unity Catalog
Zarejestruj model w Unity Catalog za pomocą mlflow.register_model. Udostępnianie niestandardowych modeli LLM jest oparte na wdrożeniach Express, więc do rejestracji używa się parametru env_pack="databricks_model_serving", a także wymagane są mlflow>=3.12 i databricks-sdk>=0.102.0.
Dodaj na przykład następujący kod do notesu:
model_version = mlflow.register_model(model_info.model_uri, UC_MODEL_NAME, env_pack="databricks_model_serving")
Krok 6. Tworzenie punktu końcowego obsługującego
Utwórz punkt końcowy z interfejsu użytkownika lub programowo za pomocą zestawu SDK Azure Databricks. Kluczowe decyzje dotyczą typu obliczeń, rozmiaru obciążenia i zachowania skalowania do zera.
Wybierz workload_type w zależności od modelu i chmury:
workload_type |
procesor GPU | Notatki |
|---|---|---|
GPU_SMALL |
1x T4 (16 GB) | Najmniejsza opcja. |
GPU_LARGE |
1x A100 (80 GB) | Zalecane w przypadku dużych obciążeń LLM. |
workload_size (Small, Medium lub Large) określa liczbę aprowizowanych replik dla punktu końcowego. Używaj Small do programowania i obciążeń o niewielkim natężeniu ruchu.
W poniższym przykładzie przedstawiono typową konfigurację:
ServedEntityInput(
entity_name="main.<catalog>.<model_name>",
entity_version="<version>",
workload_type=ServingModelWorkloadType.GPU_MEDIUM,
workload_size="Small",
scale_to_zero_enabled=True,
)
Skalowanie do zera i planowanie wydajności
Niestandardowe udostępnianie modeli LLM w fazie beta udostępnia stałą liczbę replik dla punktu końcowego.
Skalowanie automatyczne do więcej niż zera replik nie jest jeszcze obsługiwane, więc musisz dobrać odpowiedni rozmiar workload_type i workload_size pod kątem szczytowego natężenia ruchu. Punkt końcowy umieszcza w kolejce żądania przekraczające wydajność przydzielonych replik.
Ustaw scale_to_zero_enabled=True wartość , aby umożliwić skalowanie punktu końcowego w dół do zera replik w przypadku bezczynności. Zimne uruchomienia są powolne — ładowanie wag modelu i uruchamianie vLLM zwykle trwa od jednej do kilku minut.
W przypadku obciążeń wrażliwych na opóźnienia lub krytycznych dla produkcji ustaw scale_to_zero_enabled=False i dobierz rozmiar workload_size pod kątem szczytowego ruchu z wyprzedzeniem.
Ostrzeżenie
Możliwość zwiększenia skali nie jest gwarantowana. Za każdym razem, gdy usługa Azure Databricks musi przydzielić nowy procesor GPU dla punktu końcowego — podczas tworzenia, podczas zwiększania workload_size lub gdy punkt końcowy wybudza się ze stanu zerowego — żądanie może przestać odpowiadać, jeśli dostawca chmury nie dysponuje dostępnymi zasobami GPU w Twoim regionie. Dotyczy to wszystkich typów procesorów GPU. Databricks łagodzi ten problem dzięki ciepłym pulom i wcześniejszej rezerwacji, które utrzymują zasoby GPU w gotowości i dostępności.
Krok 7: Wykonaj zapytanie do swojego punktu końcowego
Gdy punkt końcowy będzie gotowy, pojawi się automatycznie w AI Playground na stronie punktu końcowego. Możesz również wykonać zapytanie programowe przy użyciu zestawu SDK usługi Databricks, zestawu OpenAI SDK lub narzędzia curl.
Modele rozmów (llm/v1/chat):
Databricks SDK
w.serving_endpoints.query(
name="<endpoint-name>",
messages=[ChatMessage(role=ChatMessageRole.USER, content="Hello")],
)
OpenAI SDK
client = OpenAI(
api_key=DATABRICKS_TOKEN,
base_url=f"{DATABRICKS_HOST}/serving-endpoints",
)
client.chat.completions.create(
model="<endpoint-name>",
messages=[{"role": "user", "content": "Hello"}],
)
curl
curl -X POST \
-u "token:$DATABRICKS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"messages":[{"role":"user","content":"Hello"}]}' \
https://<workspace-url>/serving-endpoints/<endpoint-name>/invocations
Osadzanie modeli (llm/v1/embeddings):
OpenAI SDK
client = OpenAI(
api_key=DATABRICKS_TOKEN,
base_url=f"{DATABRICKS_HOST}/serving-endpoints",
)
client.embeddings.create(
model="<endpoint-name>",
input=["The quick brown fox jumps over the lazy dog."],
)
curl
curl -X POST \
-u "token:$DATABRICKS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"input":["The quick brown fox jumps over the lazy dog."]}' \
https://<workspace-url>/serving-endpoints/<endpoint-name>/invocations
Niektóre modele osadzania oczekują prefiksu zależnego od zadania dla każdego elementu wejściowego (na przykład nomic-embed-text-v2-moe używa search_query: i search_document:). Sprawdź kartę modelu pod kątem konwencji wejściowych.
Monitoruj swój punkt końcowy
Niestandardowe udostępnianie modeli LLM korzysta z tej samej infrastruktury obserwowalności co standardowe punkty końcowe udostępniania modeli niestandardowych, ale zawiera kilka dodatkowych funkcji specyficznych dla vLLM, opisanych w poniższych sekcjach.
Dzienniki na żywo
Zakładka Dzienniki na stronie punktu końcowego w interfejsie Serving UI pokazuje w czasie rzeczywistym elementy stdout i stderr z procesu vLLM. Możesz również otworzyć te dane wyjściowe za pomocą interfejsu API dzienników.
Utrwalone dzienniki i metryki
Po włączeniu telemetrii zarówno dzienniki, jak i metryki są zapisywane w tabelach Delta w Unity Catalog w celu długoterminowego przechowywania danych, wykonywania zapytań SQL i zapewnienia zgodności. Pełne instrukcje konfiguracji, wymagania i schematy tabel można znaleźć tutaj: Utrwalanie niestandardowych danych udostępniania modeli w Unity Catalog.
W przypadku niestandardowych usług LLM obsługujących specjalnie:
-
Dzienniki:
stdoutistderrz procesu vLLM są przechwytywane automatycznie. Nie jest wymagany kod rejestrowania po stronie aplikacji. -
Metrics: Azure Databricks automatycznie pobiera metryki z punktu końcowego Prometheus serwera vLLM
/metricsi zapisuje je wraz z dziennikami. Domyślnie otrzymujesz opóźnienie dla każdego żądania, przepustowość, liczbę tokenów, głębokość kolejki i wykorzystanie pamięci podręcznej KV.
Wykonywanie zapytań dotyczących danych telemetrycznych
W wersji beta nie ma interfejsu użytkownika do wizualizacji dzienników lub metryk. Wysyłaj zapytania do zapisanych danych bezpośrednio w Unity Catalog za pomocą języka SQL lub notatnika. Zapoznaj się ze schematami metryk i logów opisanymi w artykule Trwałe zapisywanie niestandardowych danych obsługi modelu w katalogu Unity Catalog.
W poniższym notatniku pokazano, jak parsować i wizualizować zapisane metryki vLLM:
Niestandardowy notatnik metryk obsługi LLM
Przykładowy notatnik
Opracuj i przetestuj model w notatniku z bezserwerowym procesorem GPU, a następnie zaloguj i wdróż tę samą konfigurację jako punkt końcowy udostępniania. Poniższy notatnik zawiera kompletny przepływ, który można uruchomić, opisany w tym przewodniku.
Niestandardowy notes początkowy obsługujący usługę LLM
Ograniczenia
Następujące ograniczenia dotyczą wersji beta.
- Brak skalowania automatycznego między replikami. Skalowanie do zera jest obsługiwane.
- Obsługiwane są tylko zadania czatu (
llm/v1/chatw tym wielomodalne) i osadzania (llm/v1/embeddings). Zobacz Obsługiwane zadania. - Brak optymalizacji tras.
- Brak interfejsu użytkownika do wizualizacji dzienników lub metryk. Wysyłaj zapytania do danych telemetrycznych bezpośrednio w Unity Catalog.
Skontaktuj się z zespołem ds. kont Azure Databricks, aby uzyskać opinię lub pytania.
Upłynął limit czasu przekazywania artefaktu podczas rejestracji
Podczas rejestrowania modelu za pomocą env_pack usługa Azure Databricks przesyła spakowane wagi modelu i środowisko jako artefakty (model_version.tar i model_environment.tar). W przypadku wersji databricks-sdk wcześniejszych niż 0.102.0 przesyłanie dużych artefaktów LLM może zakończyć się przekroczeniem limitu czasu po pięciu minutach, a rejestracja może zakończyć się niepowodzeniem z błędem podobnym do poniższego:
MlflowException: The following failures occurred while uploading one or more artifacts to
/Models/<catalog>/<schema>/<model>/<version>: {
'.../model_environment.tar': "TimeoutError('Timed out after 0:05:00')",
'.../model_version.tar': "TimeoutError('Timed out after 0:05:00')"
}
Aby rozwiązać ten problem, uaktualnij model do databricks-sdk>=0.102.0 i zarejestruj go ponownie:
%pip install databricks-sdk>=0.102.0