Zelfstudie: Azure Machine Learning op een dag
VAN TOEPASSING OP: Python SDK azure-ai-ml v2 (current)
Meer informatie over hoe een data scientist Azure Machine Learning gebruikt om een model te trainen en vervolgens het model te gebruiken voor voorspelling. Deze zelfstudie helpt u vertrouwd te raken met de kernconcepten van Azure Machine Learning en hun meest voorkomende gebruik.
U leert hoe u een opdrachttaak verzendt om uw trainingsscript uit te voeren op een opgegeven rekenresource, geconfigureerd met de taakomgeving die nodig is om het script uit te voeren.
Het trainingsscript verwerkt de gegevensvoorbereiding, traint en registreert vervolgens een model. Zodra u het model hebt, implementeert u het als een eindpunt en roept u het eindpunt aan voor deductie.
De stappen die u moet uitvoeren zijn:
- Verbinding maken met uw Azure Machine Learning-werkruimte
- Uw rekenresource en taakomgeving maken
- Uw trainingsscript maken
- Uw opdrachttaak maken en uitvoeren om het trainingsscript uit te voeren op de rekenresource, geconfigureerd met de juiste taakomgeving
- De uitvoer van uw trainingsscript weergeven
- Het zojuist getrainde model implementeren als eindpunt
- Het Azure Machine Learning-eindpunt aanroepen voor deductie
Vereisten
Voltooi de Quickstart: Aan de slag met Azure Machine Learning om het volgende te doen:
- Maak een werkruimte.
- Maak een cloudgebasd rekenproces dat u wilt gebruiken voor uw ontwikkelomgeving.
Maak een nieuw notitieblok of kopieer ons notitieblok.
- Volg de quickstart: Juypter-notebook uitvoeren in Azure Machine Learning-studio stappen om een nieuw notebook te maken.
- Of gebruik de stappen in de quickstart om de map v2-zelfstudies te klonen en open vervolgens het notebook vanuit de map tutorials/azureml-in-a-day/azureml-in-a-day.ipynb in de sectie Bestand .
Uw notebook uitvoeren
Selecteer in de bovenste balk het rekenproces dat u hebt gemaakt tijdens de Quickstart: Aan de slag met Azure Machine Learning om te gebruiken voor het uitvoeren van het notebook.
Zorg ervoor dat de kernel rechtsboven is
Python 3.10 - SDK v2
. Als dat niet het probleem is, gebruikt u de vervolgkeuzelijst om deze kernel te selecteren.
Belangrijk
De rest van deze zelfstudie bevat cellen van het zelfstudienotitieblok. Kopieer/plak ze in uw nieuwe notitieblok of schakel nu over naar het notitieblok als u het hebt gekloond.
Als u één codecel in een notebook wilt uitvoeren, klikt u op de codecel en drukt u op Shift+Enter. U kunt ook de hele notebook uitvoeren door Alle uitvoeren te kiezen op de bovenste werkbalk.
Verbinding maken met de werkruimte
Voordat u in de code duikt, moet u verbinding maken met uw Azure Machine Learning-werkruimte. De werkruimte is de resource op het hoogste niveau voor Azure Machine Learning en biedt een gecentraliseerde werkplek met alle artefacten die u maakt in Azure Machine Learning.
We gebruiken DefaultAzureCredential
om toegang te krijgen tot de werkruimte.
DefaultAzureCredential
wordt gebruikt voor het afhandelen van de meeste Azure SDK-verificatiescenario's.
# Handle to the workspace
from azure.ai.ml import MLClient
# Authentication package
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
Voer in de volgende cel uw abonnements-id, de naam van de resourcegroep en de naam van de werkruimte in. Deze waarden zoeken:
- Selecteer in de rechterbovenhoek Azure Machine Learning-studio werkbalk de naam van uw werkruimte.
- Kopieer de waarde voor werkruimte, resourcegroep en abonnements-id in de code.
- U moet één waarde kopiëren, het gebied sluiten en plakken en vervolgens terugkomen voor de volgende waarde.
# Get a handle to the workspace
ml_client = MLClient(
credential=credential,
subscription_id="<SUBSCRIPTION_ID>",
resource_group_name="<RESOURCE_GROUP>",
workspace_name="<AML_WORKSPACE_NAME>",
)
Het resultaat is een handler voor de werkruimte die u gebruikt voor het beheren van andere resources en taken.
Belangrijk
Als u MLClient maakt, wordt er geen verbinding gemaakt met de werkruimte. De initialisatie van de client is lui. Er wordt gewacht op de eerste keer dat er een aanroep moet worden uitgevoerd (in het onderstaande notebook gebeurt dat tijdens het maken van de rekenkracht).
Een rekenresource maken om uw taak uit te voeren
U hebt een rekenresource nodig om een taak uit te voeren. Dit kunnen machines met één of meerdere knooppunten zijn met linux- of Windows-besturingssysteem, of een specifieke rekeninfrastructuur zoals Spark.
U gaat een Linux-rekencluster inrichten. Zie de volledige lijst met VM-grootten en prijzen .
Voor dit voorbeeld hebt u alleen een basiscluster nodig, dus gebruikt u een Standard_DS3_v2-model met 2 vCPU-kernen, 7 GB RAM en maakt u een Azure Machine Learning Compute.
from azure.ai.ml.entities import AmlCompute
# Name assigned to the compute cluster
cpu_compute_target = "cpu-cluster"
try:
# let's see if the compute target already exists
cpu_cluster = ml_client.compute.get(cpu_compute_target)
print(
f"You already have a cluster named {cpu_compute_target}, we'll reuse it as is."
)
except Exception:
print("Creating a new cpu compute target...")
# Let's create the Azure ML compute object with the intended parameters
cpu_cluster = AmlCompute(
name=cpu_compute_target,
# Azure ML Compute is the on-demand VM service
type="amlcompute",
# VM Family
size="STANDARD_DS3_V2",
# Minimum running nodes when there is no job running
min_instances=0,
# Nodes in cluster
max_instances=4,
# How many seconds will the node running after the job termination
idle_time_before_scale_down=180,
# Dedicated or LowPriority. The latter is cheaper but there is a chance of job termination
tier="Dedicated",
)
print(
f"AMLCompute with name {cpu_cluster.name} will be created, with compute size {cpu_cluster.size}"
)
# Now, we pass the object to MLClient's create_or_update method
cpu_cluster = ml_client.compute.begin_create_or_update(cpu_cluster)
Een taakomgeving maken
Als u uw Azure Machine Learning-taak wilt uitvoeren op uw rekenresource, hebt u een omgeving nodig. Een omgeving bevat de softwareruntime en bibliotheken die u wilt installeren op de berekening waar u gaat trainen. Het is vergelijkbaar met uw Python-omgeving op uw lokale computer.
Azure Machine Learning biedt veel gecureerde of kant-en-klare omgevingen, die handig zijn voor algemene trainings- en deductiescenario's. U kunt ook uw eigen aangepaste omgevingen maken met behulp van een Docker-installatiekopieën of een Conda-configuratie.
In dit voorbeeld maakt u een aangepaste Conda-omgeving voor uw taken met behulp van een Conda Yaml-bestand.
Maak eerst een map om het bestand in op te slaan.
import os
dependencies_dir = "./dependencies"
os.makedirs(dependencies_dir, exist_ok=True)
Maak nu het bestand in de map met afhankelijkheden. In de onderstaande cel wordt IPython Magic gebruikt om het bestand te schrijven naar de map die u zojuist hebt gemaakt.
%%writefile {dependencies_dir}/conda.yml
name: model-env
channels:
- conda-forge
dependencies:
- python=3.8
- numpy=1.21.2
- pip=21.2.4
- scikit-learn=0.24.2
- scipy=1.7.1
- pandas>=1.1,<1.2
- pip:
- inference-schema[numpy-support]==1.3.0
- xlrd==2.0.1
- mlflow== 1.26.1
- azureml-mlflow==1.42.0
- psutil>=5.8,<5.9
- tqdm>=4.59,<4.60
- ipykernel~=6.0
- matplotlib
De specificatie bevat enkele gebruikelijke pakketten, die u in uw taak gaat gebruiken (numpy, pip).
Raadpleeg dit YAML-bestand om deze aangepaste omgeving in uw werkruimte te maken en te registreren:
from azure.ai.ml.entities import Environment
custom_env_name = "aml-scikit-learn"
pipeline_job_env = Environment(
name=custom_env_name,
description="Custom environment for Credit Card Defaults pipeline",
tags={"scikit-learn": "0.24.2"},
conda_file=os.path.join(dependencies_dir, "conda.yml"),
image="mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:latest",
)
pipeline_job_env = ml_client.environments.create_or_update(pipeline_job_env)
print(
f"Environment with name {pipeline_job_env.name} is registered to workspace, the environment version is {pipeline_job_env.version}"
)
Wat is een opdrachttaak?
U maakt een Azure Machine Learning-opdrachttaak om een model te trainen voor standaardvoorspelling van tegoed. De opdrachttaak wordt gebruikt om een trainingsscript uit te voeren in een opgegeven omgeving op een opgegeven rekenresource. U hebt de omgeving en de rekenresource al gemaakt. Vervolgens maakt u het trainingsscript.
Het trainingsscript verwerkt de gegevensvoorbereiding, training en registratie van het getrainde model. In deze zelfstudie maakt u een Python-trainingsscript.
Opdrachttaken kunnen worden uitgevoerd vanuit cli, Python SDK of studio-interface. In deze zelfstudie gebruikt u de Azure Machine Learning Python SDK v2 om de opdrachttaak te maken en uit te voeren.
Nadat u de trainingstaak hebt uitgevoerd, implementeert u het model en gebruikt u het om een voorspelling te produceren.
Trainingsscript maken
Laten we beginnen met het maken van het trainingsscript: het main.py Python-bestand.
Maak eerst een bronmap voor het script:
import os
train_src_dir = "./src"
os.makedirs(train_src_dir, exist_ok=True)
Dit script verwerkt de voorverwerking van de gegevens en splitst deze op in test- en trainingsgegevens. Vervolgens worden deze gegevens gebruikt om een model op basis van een structuur te trainen en het uitvoermodel te retourneren.
MLFlow wordt gebruikt om de parameters en metrische gegevens te registreren tijdens de pijplijnuitvoering.
In de onderstaande cel wordt gebruikgemaakt van IPython-magie om het trainingsscript te schrijven naar de map die u zojuist hebt gemaakt.
%%writefile {train_src_dir}/main.py
import os
import argparse
import pandas as pd
import mlflow
import mlflow.sklearn
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
def main():
"""Main function of the script."""
# input and output arguments
parser = argparse.ArgumentParser()
parser.add_argument("--data", type=str, help="path to input data")
parser.add_argument("--test_train_ratio", type=float, required=False, default=0.25)
parser.add_argument("--n_estimators", required=False, default=100, type=int)
parser.add_argument("--learning_rate", required=False, default=0.1, type=float)
parser.add_argument("--registered_model_name", type=str, help="model name")
args = parser.parse_args()
# Start Logging
mlflow.start_run()
# enable autologging
mlflow.sklearn.autolog()
###################
#<prepare the data>
###################
print(" ".join(f"{k}={v}" for k, v in vars(args).items()))
print("input data:", args.data)
credit_df = pd.read_excel(args.data, header=1, index_col=0)
mlflow.log_metric("num_samples", credit_df.shape[0])
mlflow.log_metric("num_features", credit_df.shape[1] - 1)
train_df, test_df = train_test_split(
credit_df,
test_size=args.test_train_ratio,
)
####################
#</prepare the data>
####################
##################
#<train the model>
##################
# Extracting the label column
y_train = train_df.pop("default payment next month")
# convert the dataframe values to array
X_train = train_df.values
# Extracting the label column
y_test = test_df.pop("default payment next month")
# convert the dataframe values to array
X_test = test_df.values
print(f"Training with data of shape {X_train.shape}")
clf = GradientBoostingClassifier(
n_estimators=args.n_estimators, learning_rate=args.learning_rate
)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))
###################
#</train the model>
###################
##########################
#<save and register model>
##########################
# Registering the model to the workspace
print("Registering the model via MLFlow")
mlflow.sklearn.log_model(
sk_model=clf,
registered_model_name=args.registered_model_name,
artifact_path=args.registered_model_name,
)
# Saving the model to a file
mlflow.sklearn.save_model(
sk_model=clf,
path=os.path.join(args.registered_model_name, "trained_model"),
)
###########################
#</save and register model>
###########################
# Stop Logging
mlflow.end_run()
if __name__ == "__main__":
main()
Zoals u in dit script kunt zien, wordt het modelbestand na het trainen van het model opgeslagen en geregistreerd in de werkruimte. U kunt nu het geregistreerde model gebruiken in eindpunten voor deductie.
De opdracht configureren
Nu u een script hebt waarmee de gewenste taken kunnen worden uitgevoerd, gebruikt u de opdracht voor algemeen gebruik waarmee opdrachtregelacties kunnen worden uitgevoerd. Deze opdrachtregelactie kan systeemopdrachten rechtstreeks aanroepen of door een script uit te voeren.
Hier maakt u invoervariabelen om de invoergegevens, de split ratio, de leersnelheid en de naam van het geregistreerde model op te geven. Het opdrachtscript doet het volgende:
- Gebruik de rekenkracht die u eerder hebt gemaakt om deze opdracht uit te voeren.
- Gebruik de omgeving die u eerder hebt gemaakt. U kunt de
@latest
notatie gebruiken om de nieuwste versie van de omgeving aan te geven wanneer de opdracht wordt uitgevoerd. - Configureer bepaalde metagegevens, zoals de weergavenaam, de naam van het experiment, enzovoort. Een experiment is een container voor alle iteraties die u op een bepaald project uitvoert. Alle taken die onder dezelfde experimentnaam zijn ingediend, worden naast elkaar weergegeven in Azure Machine Learning-studio.
- Configureer in dit geval de opdrachtregelactie zelf
python main.py
. De invoer/uitvoer is toegankelijk in de opdracht via de${{ ... }}
notatie.
from azure.ai.ml import command
from azure.ai.ml import Input
registered_model_name = "credit_defaults_model"
job = command(
inputs=dict(
data=Input(
type="uri_file",
path="https://archive.ics.uci.edu/ml/machine-learning-databases/00350/default%20of%20credit%20card%20clients.xls",
),
test_train_ratio=0.2,
learning_rate=0.25,
registered_model_name=registered_model_name,
),
code="./src/", # location of source code
command="python main.py --data ${{inputs.data}} --test_train_ratio ${{inputs.test_train_ratio}} --learning_rate ${{inputs.learning_rate}} --registered_model_name ${{inputs.registered_model_name}}",
environment="aml-scikit-learn@latest",
compute="cpu-cluster",
experiment_name="train_model_credit_default_prediction",
display_name="credit_default_prediction",
)
De taak verzenden
Het is nu tijd om de taak te verzenden en uit te voeren in Azure Machine Learning. Deze keer gebruikt create_or_update
u op ml_client.jobs
.
ml_client.create_or_update(job)
Taakuitvoer weergeven en wachten tot de taak is voltooid
Bekijk de taak in Azure Machine Learning-studio door de koppeling in de uitvoer van de vorige cel te selecteren.
De uitvoer van deze taak ziet er als volgt uit in de Azure Machine Learning-studio. Verken de tabbladen voor verschillende details, zoals metrische gegevens, uitvoer, enzovoort. Zodra de taak is voltooid, wordt er een model in uw werkruimte geregistreerd als gevolg van de training.
Belangrijk
Wacht totdat de status van de taak is voltooid voordat u terugkeert naar dit notitieblok om door te gaan. Het uitvoeren van de taak duurt 2 tot 3 minuten. Het kan langer duren (maximaal 10 minuten) als het rekencluster omlaag is geschaald naar nul knooppunten en er nog steeds een aangepaste omgeving wordt gebouwd.
Het model implementeren als een online-eindpunt
Implementeer nu uw machine learning-model als een webservice in de Azure-cloud, een online endpoint
.
Voor het implementeren van een machine learning-service hebt u meestal het volgende nodig:
- De modelassets (bestand, metagegevens) die u wilt implementeren. U hebt deze assets al geregistreerd in uw trainingstaak.
- Code die moet worden uitgevoerd als een service. Met de code wordt het model uitgevoerd op een bepaalde invoeraanvraag. Dit invoerscript ontvangt gegevens die zijn verzonden naar een geïmplementeerde webservice en geeft deze door aan het model en retourneert vervolgens het antwoord van het model naar de client. Het script is specifiek voor uw model. Het invoerscript moet de gegevens begrijpen die het model verwacht en retourneert. Met een MLFlow-model, zoals in deze zelfstudie, wordt dit script automatisch voor u gemaakt. Voorbeelden van scorescripts vindt u hier.
Een nieuw online-eindpunt maken
Nu u een geregistreerd model en een deductiescript hebt, is het tijd om uw online-eindpunt te maken. De naam van het eindpunt moet uniek zijn in de hele Azure-regio. Voor deze zelfstudie maakt u een unieke naam met behulp van UUID
.
import uuid
# Creating a unique name for the endpoint
online_endpoint_name = "credit-endpoint-" + str(uuid.uuid4())[:8]
Notitie
Het maken van het eindpunt duurt ongeveer 6 tot 8 minuten.
from azure.ai.ml.entities import (
ManagedOnlineEndpoint,
ManagedOnlineDeployment,
Model,
Environment,
)
# create an online endpoint
endpoint = ManagedOnlineEndpoint(
name=online_endpoint_name,
description="this is an online endpoint",
auth_mode="key",
tags={
"training_dataset": "credit_defaults",
"model_type": "sklearn.GradientBoostingClassifier",
},
)
endpoint = ml_client.online_endpoints.begin_create_or_update(endpoint).result()
print(f"Endpoint {endpoint.name} provisioning state: {endpoint.provisioning_state}")
Nadat u een eindpunt hebt gemaakt, kunt u dit ophalen zoals hieronder:
endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)
print(
f'Endpoint "{endpoint.name}" with provisioning state "{endpoint.provisioning_state}" is retrieved'
)
Het model implementeren op het eindpunt
Zodra het eindpunt is gemaakt, implementeert u het model met het invoerscript. Elk eindpunt kan meerdere implementaties hebben. Verkeer omleiden naar deze implementaties kan worden opgegeven met behulp van regels. Hier maakt u één implementatie die 100% van het binnenkomende verkeer verwerkt. We hebben een kleurnaam gekozen voor de implementatie, bijvoorbeeld blauwe, groene of rode implementaties, wat willekeurig is.
U kunt de pagina Modellen op de Azure Machine Learning-studio controleren om de nieuwste versie van uw geregistreerde model te identificeren. Met de onderstaande code wordt ook het meest recente versienummer opgehaald dat u kunt gebruiken.
# Let's pick the latest version of the model
latest_model_version = max(
[int(m.version) for m in ml_client.models.list(name=registered_model_name)]
)
Implementeer de nieuwste versie van het model.
Notitie
Verwacht dat deze implementatie ongeveer 6 tot 8 minuten duurt.
# picking the model to deploy. Here we use the latest version of our registered model
model = ml_client.models.get(name=registered_model_name, version=latest_model_version)
# create an online deployment.
blue_deployment = ManagedOnlineDeployment(
name="blue",
endpoint_name=online_endpoint_name,
model=model,
instance_type="Standard_DS3_v2",
instance_count=1,
)
blue_deployment = ml_client.begin_create_or_update(blue_deployment).result()
Testen met een voorbeeldquery
Nu het model is geïmplementeerd op het eindpunt, kunt u hiermee deductie uitvoeren.
Maak een voorbeeldaanvraagbestand volgens het ontwerp dat wordt verwacht in de run-methode in het scorescript.
deploy_dir = "./deploy"
os.makedirs(deploy_dir, exist_ok=True)
%%writefile {deploy_dir}/sample-request.json
{
"input_data": {
"columns": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22],
"index": [0, 1],
"data": [
[20000,2,2,1,24,2,2,-1,-1,-2,-2,3913,3102,689,0,0,0,0,689,0,0,0,0],
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, 9, 8]
]
}
}
# test the blue deployment with some sample data
ml_client.online_endpoints.invoke(
endpoint_name=online_endpoint_name,
request_file="./deploy/sample-request.json",
deployment_name="blue",
)
Resources opschonen
Als u het eindpunt niet gaat gebruiken, verwijdert u het om de resource niet meer te gebruiken. Zorg ervoor dat er geen andere implementaties gebruikmaken van een eindpunt voordat u het verwijdert.
Notitie
Deze stap duurt ongeveer 6 tot 8 minuten.
ml_client.online_endpoints.begin_delete(name=online_endpoint_name)
Alles verwijderen
Gebruik deze stappen om uw Azure Machine Learning-werkruimte en alle rekenresources te verwijderen.
Belangrijk
De resources die u hebt gemaakt, kunnen worden gebruikt als de vereisten voor andere Azure Machine Learning-zelfstudies en artikelen met procedures.
Als u niet van plan bent om een van de resources te gebruiken die u hebt gemaakt, verwijdert u deze zodat er geen kosten in rekening worden gebracht:
Selecteer Resourcegroepen links in Azure Portal.
Selecteer de resourcegroep die u hebt gemaakt uit de lijst.
Selecteer Resourcegroep verwijderen.
Voer de naam van de resourcegroup in. Selecteer vervolgens Verwijderen.
Volgende stappen
- Converteer deze zelfstudie naar een pijplijn die klaar is voor productie met herbruikbare onderdelen.
- Meer informatie over alle implementatieopties voor Azure Machine Learning.
- Meer informatie over het verifiëren van het geïmplementeerde model.