Progresywne wdrażanie modeli MLflow w punktach końcowych online
W tym artykule dowiesz się, jak stopniowo aktualizować i wdrażać modele MLflow w punktach końcowych online bez powodowania zakłóceń w działaniu usługi. W celu wprowadzenia nowej wersji usługi internetowej do środowiska produkcyjnego należy użyć wdrożenia niebieskiego zielonego, znanego również jako strategia bezpiecznego wdrażania. Ta strategia umożliwi wdrożenie nowej wersji usługi internetowej w małym podzestawie użytkowników lub żądań przed całkowitym wdrożeniem tej wersji.
Informacje o tym przykładzie
Punkty końcowe online mają koncepcję punktu końcowego i wdrożenia. Punkt końcowy reprezentuje interfejs API używany przez klientów do korzystania z modelu, a wdrożenie wskazuje konkretną implementację tego interfejsu API. To rozróżnienie umożliwia użytkownikom oddzielenie interfejsu API od implementacji i zmianę podstawowej implementacji bez wpływu na użytkownika. W tym przykładzie takie pojęcia będą używane do aktualizowania wdrożonego modelu w punktach końcowych bez wprowadzania zakłóceń w usłudze.
Model, który wdrożymy, jest oparty na zestawie danych choroby serca UCI. Baza danych zawiera 76 atrybutów, ale używamy podzestawu 14 z nich. Model próbuje przewidzieć obecność choroby serca u pacjenta. Jest to liczba całkowita z zakresu od 0 (brak obecności) do 1 (obecność). Został on wytrenowany przy użyciu XGBBoost
klasyfikatora, a wszystkie wymagane przetwarzanie wstępne zostało spakowane jako potok, dzięki czemu ten model jest potokiem kompleksowego scikit-learn
, który przechodzi od nieprzetworzonych danych do przewidywań.
Informacje przedstawione w tym artykule są oparte na przykładach kodu zawartych w repozytorium azureml-examples . Aby uruchomić polecenia lokalnie bez konieczności kopiowania/wklejania plików, sklonuj repozytorium, a następnie zmień katalogi na sdk/using-mlflow/deploy
.
Postępuj zgodnie z instrukcjami w notesach Jupyter Notebook
Możesz wykonać czynności opisane w tym przykładzie w poniższych notesach. W sklonowanym repozytorium otwórz notes: mlflow_sdk_online_endpoints_progresive.ipynb.
Wymagania wstępne
Przed wykonaniem kroków opisanych w tym artykule upewnij się, że masz następujące wymagania wstępne:
- Subskrypcja platformy Azure. Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto. Wypróbuj bezpłatną lub płatną wersję usługi Azure Machine Learning.
- Kontrola dostępu na podstawie ról platformy Azure (Azure RBAC): jest używana do udzielania dostępu do operacji w usłudze Azure Machine Learning. Aby wykonać kroki opisane w tym artykule, twoje konto użytkownika musi mieć przypisaną rolę właściciela lub współautora dla obszaru roboczego usługi Azure Machine Learning lub rolę niestandardową zezwalającą na korzystanie z usługi Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*. Aby uzyskać więcej informacji, zobacz Zarządzanie dostępem do obszaru roboczego usługi Azure Machine Learning.
Ponadto należy wykonać następujące kroki:
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
- Zainstaluj interfejs wiersza polecenia platformy Azure i rozszerzenie ml w interfejsie wiersza polecenia platformy Azure. Aby uzyskać więcej informacji, zobacz Instalowanie, konfigurowanie i używanie interfejsu wiersza polecenia (wersja 2).
Nawiązywanie połączenia z obszarem roboczym
Najpierw nawiążmy połączenie z obszarem roboczym usługi Azure Machine Learning, w którym będziemy pracować.
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Rejestrowanie modelu w rejestrze
Upewnij się, że model został zarejestrowany w rejestrze usługi Azure Machine Learning. Wdrażanie niezarejestrowanych modeli nie jest obsługiwane w usłudze Azure Machine Learning. Nowy model można zarejestrować przy użyciu zestawu MLflow SDK:
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
MODEL_NAME='heart-classifier'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
Tworzenie punktu końcowego online
Punkty końcowe online to punkty końcowe używane do wnioskowania online (w czasie rzeczywistym). Punkty końcowe online zawierają wdrożenia, które są gotowe do odbierania danych od klientów i mogą wysyłać odpowiedzi w czasie rzeczywistym.
Wykorzystamy tę funkcję, wdrażając wiele wersji tego samego modelu w ramach tego samego punktu końcowego. Jednak nowe wdrożenie otrzyma 0% ruchu podczas sugerowania. Po upewnieniu się, że nowy model działa prawidłowo, będziemy stopniowo przenosić ruch z jednego wdrożenia do drugiego.
Punkty końcowe wymagają nazwy, która musi być unikatowa w tym samym regionie. Upewnijmy się, że utworzymy taki, który nie istnieje:
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
ENDPOINT_SUFIX=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-5} | head -n 1) ENDPOINT_NAME="heart-classifier-$ENDPOINT_SUFIX"
Konfigurowanie punktu końcowego
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json name: heart-classifier-edp auth_mode: key
Utwórz punkt końcowy:
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
Uzyskiwanie wpisu tajnego uwierzytelniania dla punktu końcowego.
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
ENDPOINT_SECRET_KEY=$(az ml online-endpoint get-credentials -n $ENDPOINT_NAME | jq -r ".accessToken")
Tworzenie niebieskiego wdrożenia
Do tej pory punkt końcowy jest pusty. Nie ma na nim wdrożeń. Utwórzmy pierwszy, wdrażając ten sam model, nad którymi wcześniej pracowaliśmy. Wywołamy to wdrożenie "domyślne", reprezentując nasze "niebieskie wdrożenie".
Konfigurowanie wdrożenia
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
blue-deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: default endpoint_name: heart-classifier-edp model: azureml:heart-classifier@latest instance_type: Standard_DS2_v2 instance_count: 1
Tworzenie wdrożenia
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
az ml online-deployment create --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
Jeśli punkt końcowy nie ma łączności wychodzącej, użyj pakietu modelu (wersja zapoznawcza), dołączając flagę
--with-package
:az ml online-deployment create --with-package --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
Napiwek
Ustawiliśmy flagę
--all-traffic
w poleceniu create, które przypisze cały ruch do nowego wdrożenia.Przypisywanie całego ruchu do wdrożenia
Do tej pory punkt końcowy ma jedno wdrożenie, ale żaden z jego ruchu nie jest przypisany do niego. Przypiszmy go.
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
Ten krok nie jest wymagany w interfejsie wiersza polecenia platformy Azure, ponieważ użyliśmy
--all-traffic
go podczas tworzenia.Zaktualizuj konfigurację punktu końcowego:
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
Ten krok nie jest wymagany w interfejsie wiersza polecenia platformy Azure, ponieważ użyliśmy
--all-traffic
go podczas tworzenia.Tworzenie przykładowych danych wejściowych w celu przetestowania wdrożenia
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
sample.yml
{ "input_data": { "columns": [ "age", "sex", "cp", "trestbps", "chol", "fbs", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal" ], "data": [ [ 48, 0, 3, 130, 275, 0, 0, 139, 0, 0.2, 1, 0, "normal" ] ] } }
Testowanie wdrożenia
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file sample.json
Tworzenie zielonego wdrożenia w punkcie końcowym
Wyobraźmy sobie, że istnieje nowa wersja modelu utworzona przez zespół deweloperów i jest gotowa do pracy w środowisku produkcyjnym. Możemy najpierw spróbować latać tym modelem, a gdy jesteśmy pewni siebie, możemy zaktualizować punkt końcowy w celu kierowania ruchu do niego.
Rejestrowanie nowej wersji modelu
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
MODEL_NAME='heart-classifier' az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
Pobierzmy numer wersji nowego modelu:
VERSION=$(az ml model show -n heart-classifier --label latest | jq -r ".version")
Konfigurowanie nowego wdrożenia
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
green-deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json name: xgboost-model endpoint_name: heart-classifier-edp model: azureml:heart-classifier@latest instance_type: Standard_DS2_v2 instance_count: 1
Nazwimy wdrożenie w następujący sposób:
GREEN_DEPLOYMENT_NAME="xgboost-model-$VERSION"
Tworzenie nowego wdrożenia
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
az ml online-deployment create -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
Jeśli punkt końcowy nie ma łączności wychodzącej, użyj pakietu modelu (wersja zapoznawcza), dołączając flagę
--with-package
:az ml online-deployment create --with-package -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
Testowanie wdrożenia bez zmieniania ruchu
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name $GREEN_DEPLOYMENT_NAME --request-file sample.json
Napiwek
Zwróć uwagę, że teraz wskazujemy nazwę wdrożenia, które chcemy wywołać.
Stopniowo aktualizuj ruch
Z nowym wdrożeniem mamy pewność, że możemy zaktualizować ruch, aby skierować go do nowego wdrożenia. Ruch jest konfigurowany na poziomie punktu końcowego:
Konfigurowanie ruchu:
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
Ten krok nie jest wymagany w interfejsie wiersza polecenia platformy Azure
Aktualizowanie punktu końcowego
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
Jeśli zdecydujesz się przełączyć cały ruch do nowego wdrożenia, zaktualizuj cały ruch:
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
Ten krok nie jest wymagany w interfejsie wiersza polecenia platformy Azure
Aktualizowanie punktu końcowego
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
Ponieważ stare wdrożenie nie odbiera żadnego ruchu, można go bezpiecznie usunąć:
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
az ml online-deployment delete --endpoint-name $ENDPOINT_NAME --name default
Napiwek
Zwróć uwagę, że w tym momencie poprzednie "niebieskie wdrożenie" zostało usunięte, a nowe "zielone wdrożenie" zajęło miejsce "niebieskiego wdrożenia".
Czyszczenie zasobów
- Interfejs wiersza polecenia platformy Azure
- Python (Zestaw SDK usługi Azure Machine Learning)
- Python (zestaw MLflow SDK)
az ml online-endpoint delete --name $ENDPOINT_NAME --yes
Ważne
Zauważ, że usunięcie punktu końcowego powoduje również usunięcie wszystkich wdrożeń w nim.