Progressiv distribution av MLflow-modeller till onlineslutpunkter
Artikel
I den här artikeln får du lära dig hur du progressivt kan uppdatera och distribuera MLflow-modeller till onlineslutpunkter utan att orsaka avbrott i tjänsten. Du använder blågrön distribution, även kallad säker distributionsstrategi, för att introducera en ny version av en webbtjänst i produktion. Med den här strategin kan du distribuera din nya version av webbtjänsten till en liten delmängd av användare eller begäranden innan du distribuerar den helt.
Om det här exemplet
Onlineslutpunkter har begreppet Slutpunkt och distribution. En slutpunkt representerar det API som kunder använder för att använda modellen, medan distributionen anger den specifika implementeringen av api:et. Den här skillnaden gör det möjligt för användare att frikoppla API:et från implementeringen och ändra den underliggande implementeringen utan att påverka konsumenten. Det här exemplet använder sådana begrepp för att uppdatera den distribuerade modellen i slutpunkter utan att införa tjänststörningar.
Den modell som vi ska distribuera baseras på datauppsättningen för UCI-hjärtsjukdomar. Databasen innehåller 76 attribut, men vi använder en delmängd av 14 av dem. Modellen försöker förutsäga förekomsten av hjärtsjukdomar hos en patient. Det är heltalsvärde från 0 (ingen närvaro) till 1 (närvaro). Den har tränats med en XGBBoost klassificerare och all nödvändig förbearbetning har paketerats som en scikit-learn pipeline, vilket gör den här modellen till en pipeline från slutpunkt till slutpunkt som går från rådata till förutsägelser.
Informationen i den här artikeln baseras på kodexempel som finns i lagringsplatsen azureml-examples . Om du vill köra kommandona lokalt utan att behöva kopiera/klistra in filer klonar du lagringsplatsen och ändrar sedan katalogerna till sdk/using-mlflow/deploy.
Rollbaserade åtkomstkontroller i Azure (Azure RBAC) används för att bevilja åtkomst till åtgärder i Azure Machine Learning. Om du vill utföra stegen i den här artikeln måste ditt användarkonto tilldelas rollen ägare eller deltagare för Azure Machine Learning-arbetsytan, eller en anpassad roll som tillåter Microsoft.MachineLearningServices/arbetsytor/onlineEndpoints/*. Mer information finns i Hantera åtkomst till en Azure Machine Learning-arbetsyta.
Installera Mlflow SDK-paketet mlflow och Azure Machine Learning-plugin-programmet för MLflow azureml-mlflow.
pip install mlflow azureml-mlflow
Om du inte kör i Azure Machine Learning-beräkning konfigurerar du URI:n för MLflow-spårning eller MLflows register-URI så att den pekar på den arbetsyta som du arbetar med. Lär dig hur du konfigurerar MLflow för Azure Machine Learning.
Anslut till din arbetsyta
Först ska vi ansluta till Azure Machine Learning-arbetsytan där vi ska arbeta med.
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Arbetsytan är resursen på den översta nivån i Azure Machine Learning, och är en central plats där du kan arbeta med alla artefakter du skapar när du använder Azure Machine Learning. I det här avsnittet ansluter vi till arbetsytan där du ska utföra distributionsuppgifter.
Importera de bibliotek som krävs:
from azure.ai.ml import MLClient, Input
from azure.ai.ml.entities import ManagedOnlineEndpoint, ManagedOnlineDeployment, Model
from azure.ai.ml.constants import AssetTypes
from azure.identity import DefaultAzureCredential
Konfigurera information om arbetsytan och få ett handtag till arbetsytan:
Kontrollera att din modell är registrerad i Azure Machine Learning-registret. Distribution av oregistrerade modeller stöds inte i Azure Machine Learning. Du kan registrera en ny modell med hjälp av MLflow SDK:
Onlineslutpunkter är slutpunkter som används för onlineinferenser (realtid). Onlineslutpunkter innehåller distributioner som är redo att ta emot data från klienter och kan skicka svar i realtid.
Vi kommer att utnyttja den här funktionen genom att distribuera flera versioner av samma modell under samma slutpunkt. Den nya distributionen tar dock emot 0 % av trafiken vid tiggeriet. När vi är säkra på att den nya modellen fungerar korrekt kommer vi att gradvis flytta trafik från en distribution till en annan.
Slutpunkter kräver ett namn som måste vara unikt i samma region. Nu ska vi se till att skapa en som inte finns:
import random
import string
# Creating a unique endpoint name by including a random suffix
allowed_chars = string.ascii_lowercase + string.digits
endpoint_suffix = "".join(random.choice(allowed_chars) for x in range(5))
endpoint_name = "heart-classifier-" + endpoint_suffix
print(f"Endpoint name: {endpoint_name}")
import random
import string
# Creating a unique endpoint name by including a random suffix
allowed_chars = string.ascii_lowercase + string.digits
endpoint_suffix = "".join(random.choice(allowed_chars) for x in range(5))
endpoint_name = "heart-classifier-" + endpoint_suffix
print(f"Endpoint name: {endpoint_name}")
endpoint = ManagedOnlineEndpoint(
name=endpoint_name,
description="An endpoint to serve predictions of the UCI heart disease problem",
auth_mode="key",
)
Vi kan konfigurera egenskaperna för den här slutpunkten med hjälp av en konfigurationsfil. Vi konfigurerar autentiseringsläget för slutpunkten som "nyckel" i följande exempel:
Den här funktionen är inte tillgänglig i MLflow SDK. Gå till Azure Machine Learning-studio, navigera till slutpunkten och hämta den hemliga nyckeln därifrån.
Skapa en blå distribution
Än så länge är slutpunkten tom. Det finns inga distributioner på den. Nu ska vi skapa den första genom att distribuera samma modell som vi arbetade med tidigare. Vi kallar den här distributionen "standard", som representerar vår "blå distribution".
Följande kodexempel 5 observationer från träningsdatauppsättningen target tar bort kolumnen (som modellen förutsäger den) och skapar en begäran i filen sample.json som kan användas med modelldistributionen.
samples = (
pd.read_csv("data/heart.csv")
.sample(n=5)
.drop(columns=["target"])
.reset_index(drop=True)
)
with open("sample.json", "w") as f:
f.write(
json.dumps(
{"input_data": json.loads(samples.to_json(orient="split", index=False))}
)
)
Följande kodexempel 5 observationer från träningsdatauppsättningen target , tar bort kolumnen (som modellen förutsäger den) och skapar en begäran.
Anta att det finns en ny version av modellen som skapats av utvecklingsteamet och att den är redo att vara i produktion. Vi kan först försöka flyga den här modellen och när vi är säkra kan vi uppdatera slutpunkten för att dirigera trafiken till den.
Vi använder samma maskinvarubekräftelse som anges i deployment-config-file. Det finns dock inga krav på att ha samma konfiguration. Du kan konfigurera olika maskinvara för olika modeller beroende på kraven.
Skriv konfigurationen till en fil:
deployment_config_path = "deployment_config.json"
with open(deployment_config_path, "w") as outfile:
outfile.write(json.dumps(deploy_config))
Observera hur vi nu anger namnet på den distribution som vi vill anropa.
Uppdatera trafiken progressivt
Som vi är säkra på med den nya distributionen kan vi uppdatera trafiken för att dirigera en del av den till den nya distributionen. Trafiken konfigureras på slutpunktsnivå: