Udostępnij za pośrednictwem


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:

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ć.

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:

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.

  1. Punkty końcowe wymagają nazwy, która musi być unikatowa w tym samym regionie. Upewnijmy się, że utworzymy taki, który nie istnieje:

    ENDPOINT_SUFIX=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-5} | head -n 1)
    ENDPOINT_NAME="heart-classifier-$ENDPOINT_SUFIX"
    
  2. Konfigurowanie punktu końcowego

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: heart-classifier-edp
    auth_mode: key
    
  3. Utwórz punkt końcowy:

    az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    
  4. Uzyskiwanie wpisu tajnego uwierzytelniania dla punktu końcowego.

    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".

  1. Konfigurowanie wdrożenia

    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
    
  2. Tworzenie wdrożenia

    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.

  3. 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.

    Ten krok nie jest wymagany w interfejsie wiersza polecenia platformy Azure, ponieważ użyliśmy --all-traffic go podczas tworzenia.

  4. Zaktualizuj konfigurację punktu końcowego:

    Ten krok nie jest wymagany w interfejsie wiersza polecenia platformy Azure, ponieważ użyliśmy --all-traffic go podczas tworzenia.

  5. Tworzenie przykładowych danych wejściowych w celu przetestowania wdrożenia

    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" ]
            ]
        }
    }
    
  6. Testowanie wdrożenia

    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.

  1. Rejestrowanie nowej wersji modelu

    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")
    
  2. Konfigurowanie nowego wdrożenia

    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"
    
  3. Tworzenie nowego wdrożenia

    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
    
  4. Testowanie wdrożenia bez zmieniania ruchu

    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:

  1. Konfigurowanie ruchu:

    Ten krok nie jest wymagany w interfejsie wiersza polecenia platformy Azure

  2. Aktualizowanie punktu końcowego

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
    
  3. Jeśli zdecydujesz się przełączyć cały ruch do nowego wdrożenia, zaktualizuj cały ruch:

    Ten krok nie jest wymagany w interfejsie wiersza polecenia platformy Azure

  4. Aktualizowanie punktu końcowego

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
    
  5. Ponieważ stare wdrożenie nie odbiera żadnego ruchu, można go bezpiecznie usunąć:

    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

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.

Następne kroki