Samouczek: usługa Azure Machine Learning w ciągu dnia
DOTYCZY: Zestaw SDK języka Python azure-ai-ml w wersji 2 (bieżący)
Dowiedz się, jak analityk danych używa usługi Azure Machine Learning do trenowania modelu, a następnie użyj modelu do przewidywania. Ten samouczek pomoże Ci zapoznać się z podstawowymi pojęciami dotyczącymi usługi Azure Machine Learning i ich najczęstszym użyciem.
Dowiesz się, jak przesłać zadanie polecenia w celu uruchomienia skryptu szkoleniowego w określonym zasobie obliczeniowym skonfigurowanym ze środowiskiem zadań niezbędnym do uruchomienia skryptu.
Skrypt szkoleniowy obsługuje przygotowywanie danych, a następnie trenuje i rejestruje model. Po utworzeniu modelu wdrożysz go jako punkt końcowy, a następnie wywołasz punkt końcowy na potrzeby wnioskowania.
Kroki, które wykonasz, to:
- Nawiązywanie połączenia z obszarem roboczym usługi Azure Machine Learning
- Tworzenie zasobu obliczeniowego i środowiska zadań
- Tworzenie skryptu szkoleniowego
- Utwórz i uruchom zadanie polecenia, aby uruchomić skrypt trenowania w zasobie obliczeniowym skonfigurowanym przy użyciu odpowiedniego środowiska zadań
- Wyświetlanie danych wyjściowych skryptu szkoleniowego
- Wdrażanie nowo wytrenowanego modelu jako punktu końcowego
- Wywoływanie punktu końcowego usługi Azure Machine Learning na potrzeby wnioskowania
Wymagania wstępne
Ukończ przewodnik Szybki start: rozpoczynanie pracy z usługą Azure Machine Learning w celu:
- Tworzenie obszaru roboczego.
- Utwórz wystąpienie obliczeniowe oparte na chmurze do użycia dla środowiska deweloperskiego.
Utwórz nowy notes lub skopiuj nasz notes.
- Postępuj zgodnie z przewodnikiem Szybki start: uruchom notes Juypter w Azure Machine Learning studio krokach, aby utworzyć nowy notes.
- Możesz też wykonać kroki opisane w przewodniku Szybki start, aby sklonować folder samouczków w wersji 2, a następnie otworzyć notes z folderu tutorials/azureml-in-a-day/azureml-in-a-day.ipynb w sekcji Plik .
Uruchamianie notesu
Na górnym pasku wybierz wystąpienie obliczeniowe utworzone podczas przewodnika Szybki start: rozpoczynanie pracy z usługą Azure Machine Learning do użycia na potrzeby uruchamiania notesu.
Upewnij się, że jądro znajdujące się w prawym górnym rogu ma wartość
Python 3.10 - SDK v2
. Jeśli nie, użyj listy rozwijanej, aby wybrać to jądro.
Ważne
W pozostałej części tego samouczka znajdują się komórki notesu samouczka. Skopiuj/wklej je do nowego notesu lub przejdź do notesu teraz, jeśli został sklonowany.
Aby uruchomić pojedynczą komórkę kodu w notesie, kliknij komórkę kodu i naciśnij klawisze Shift+Enter. Możesz też uruchomić cały notes, wybierając pozycję Uruchom wszystko na górnym pasku narzędzi.
Nawiązywanie połączenia z obszarem roboczym
Zanim przejdziesz do kodu, musisz nawiązać połączenie z obszarem roboczym usługi Azure Machine Learning. Obszar roboczy jest zasobem najwyższego poziomu dla usługi Azure Machine Learning, który udostępnia scentralizowane miejsce do pracy z wszystkimi tworzonymi podczas korzystania usługi Azure Machine Learning artefaktami.
DefaultAzureCredential
Używamy polecenia , aby uzyskać dostęp do obszaru roboczego.
DefaultAzureCredential
służy do obsługi większości scenariuszy uwierzytelniania zestawu Azure SDK.
# Handle to the workspace
from azure.ai.ml import MLClient
# Authentication package
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
W następnej komórce wprowadź swój identyfikator subskrypcji, nazwę grupy zasobów i nazwę obszaru roboczego. Aby znaleźć następujące wartości:
- Na prawym górnym pasku narzędzi Azure Machine Learning studio wybierz nazwę obszaru roboczego.
- Skopiuj wartość obszaru roboczego, grupy zasobów i identyfikatora subskrypcji do kodu.
- Należy skopiować jedną wartość, zamknąć obszar i wkleić, a następnie wrócić do następnego.
# 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>",
)
Wynikiem jest procedura obsługi obszaru roboczego, którego będziesz używać do zarządzania innymi zasobami i zadaniami.
Ważne
Tworzenie klienta MLClient nie będzie łączyć się z obszarem roboczym. Inicjowanie klienta jest leniwe, będzie czekać po raz pierwszy, aby wykonać wywołanie (w poniższym notesie, który nastąpi podczas tworzenia obliczeń).
Tworzenie zasobu obliczeniowego do uruchamiania zadania
Do uruchamiania zadania potrzebne będzie zasób obliczeniowy. Może to być pojedyncza lub wielowęźleowa maszyna z systemem operacyjnym Linux lub Windows albo konkretna sieć szkieletowa obliczeniowa, na przykład Spark.
Aprowizujesz klaster obliczeniowy systemu Linux. Zobacz pełną listę rozmiarów i cen maszyn wirtualnych .
W tym przykładzie potrzebujesz tylko podstawowego klastra, więc użyjesz modelu Standard_DS3_v2 z 2 rdzeniami procesorów wirtualnych, 7 GB pamięci RAM i utworzysz usługę 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)
Tworzenie środowiska zadań
Aby uruchomić zadanie usługi Azure Machine Learning w zasobie obliczeniowym, potrzebne jest środowisko. Środowisko zawiera listę środowiska uruchomieniowego oprogramowania i bibliotek, które mają być zainstalowane w środowisku obliczeniowym, w którym będziesz trenować. Jest ona podobna do środowiska języka Python na komputerze lokalnym.
Usługa Azure Machine Learning udostępnia wiele wyselekcjonowanych lub gotowych środowisk, które są przydatne w przypadku typowych scenariuszy trenowania i wnioskowania. Możesz również utworzyć własne środowiska niestandardowe przy użyciu obrazu platformy Docker lub konfiguracji conda.
W tym przykładzie utworzysz niestandardowe środowisko conda dla zadań przy użyciu pliku yaml conda.
Najpierw utwórz katalog do przechowywania pliku.
import os
dependencies_dir = "./dependencies"
os.makedirs(dependencies_dir, exist_ok=True)
Teraz utwórz plik w katalogu dependencies. W poniższej komórce użyto magii IPython do zapisania pliku w właśnie utworzonym katalogu.
%%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
Specyfikacja zawiera kilka zwykłych pakietów, które będą używane w zadaniu (numpy, pip).
Odwołaj się do tego pliku yaml , aby utworzyć i zarejestrować to środowisko niestandardowe w obszarze roboczym:
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}"
)
Co to jest zadanie polecenia?
Utworzysz zadanie polecenia usługi Azure Machine Learning, aby wytrenować model na potrzeby przewidywania domyślnego środków. Zadanie polecenia służy do uruchamiania skryptu szkoleniowego w określonym środowisku w określonym zasobie obliczeniowym. Środowisko i zasób obliczeniowy zostały już utworzone. Następnie utworzysz skrypt trenowania.
Skrypt szkoleniowy obsługuje przygotowywanie, trenowanie i rejestrowanie wytrenowanego modelu. W tym samouczku utworzysz skrypt szkoleniowy języka Python.
Zadania poleceń można uruchamiać z poziomu interfejsu wiersza polecenia, zestawu PYTHON SDK lub interfejsu studio. W tym samouczku użyjesz zestawu SDK języka Python usługi Azure Machine Learning w wersji 2, aby utworzyć i uruchomić zadanie polecenia.
Po uruchomieniu zadania szkoleniowego wdrożysz model, a następnie użyjesz go do utworzenia przewidywania.
Tworzenie skryptu szkoleniowego
Zacznijmy od utworzenia skryptu szkoleniowego — main.py pliku języka Python .
Najpierw utwórz folder źródłowy dla skryptu:
import os
train_src_dir = "./src"
os.makedirs(train_src_dir, exist_ok=True)
Ten skrypt obsługuje wstępne przetwarzanie danych, dzieląc je na dane testowe i szkolące. Następnie używa tych danych do trenowania modelu opartego na drzewie i zwracania modelu wyjściowego.
Usługa MLFlow będzie używana do rejestrowania parametrów i metryk podczas uruchamiania potoku.
W poniższej komórce użyto magii IPython do zapisania skryptu szkoleniowego do właśnie utworzonego katalogu.
%%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()
Jak widać w tym skrypsie, po wytrenowanym modelu plik modelu zostanie zapisany i zarejestrowany w obszarze roboczym. Teraz możesz użyć zarejestrowanego modelu w wnioskowaniu punktów końcowych.
Konfigurowanie polecenia
Teraz, gdy masz skrypt, który może wykonywać żądane zadania, użyjesz polecenia ogólnego przeznaczenia, które może uruchamiać akcje wiersza polecenia. Ta akcja wiersza polecenia może bezpośrednio wywoływać polecenia systemowe lub uruchamiając skrypt.
W tym miejscu utworzysz zmienne wejściowe, aby określić dane wejściowe, współczynnik podziału, szybkość nauki i zarejestrowaną nazwę modelu. Skrypt polecenia będzie:
- Użyj utworzonego wcześniej obliczeń, aby uruchomić to polecenie.
- Użyj utworzonego wcześniej środowiska — możesz użyć
@latest
notacji, aby wskazać najnowszą wersję środowiska po uruchomieniu polecenia. - Skonfiguruj niektóre metadane, takie jak nazwa wyświetlana, nazwa eksperymentu itp. Eksperyment jest kontenerem dla wszystkich iteracji, które wykonujesz w określonym projekcie. Wszystkie zadania przesłane pod tą samą nazwą eksperymentu zostaną wyświetlone obok siebie w Azure Machine Learning studio.
- Skonfiguruj samą akcję wiersza polecenia —
python main.py
w tym przypadku. Dane wejściowe/wyjściowe są dostępne w poleceniu za pośrednictwem${{ ... }}
notacji.
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",
)
Przesyłanie zadania
Nadszedł czas, aby przesłać zadanie do uruchomienia w usłudze Azure Machine Learning. Tym razem użyjesz polecenia create_or_update
w usłudze ml_client.jobs
.
ml_client.create_or_update(job)
Wyświetlanie danych wyjściowych zadania i oczekiwanie na ukończenie zadania
Wyświetl zadanie w Azure Machine Learning studio, wybierając link w danych wyjściowych poprzedniej komórki.
Dane wyjściowe tego zadania będą wyglądać następująco w Azure Machine Learning studio. Zapoznaj się z kartami, aby uzyskać różne szczegóły, takie jak metryki, dane wyjściowe itp. Po zakończeniu zadanie zarejestruje model w obszarze roboczym w wyniku trenowania.
Ważne
Przed powrotem do tego notesu poczekaj, aż stan zadania zostanie ukończony. Uruchomienie zadania potrwa od 2 do 3 minut. Może to potrwać dłużej (do 10 minut), jeśli klaster obliczeniowy został przeskalowany w dół do zera węzłów, a środowisko niestandardowe nadal jest kompilowane.
Wdrażanie modelu jako punktu końcowego online
Teraz wdróż model uczenia maszynowego jako usługę internetową w chmurze platformy Azure — online endpoint
.
Aby wdrożyć usługę uczenia maszynowego, zwykle potrzebne są następujące elementy:
- Zasoby modelu (plik, metadane), które chcesz wdrożyć. Te zasoby zostały już zarejestrowane w zadaniu szkoleniowym.
- Niektóre kod do uruchomienia jako usługa. Kod wykonuje model na danym żądaniu wejściowym. Ten skrypt wpisu odbiera dane przesyłane do wdrożonej usługi internetowej i przekazuje je do modelu, a następnie zwraca odpowiedź modelu na klienta. Skrypt jest specyficzny dla modelu. Skrypt wpisu musi zrozumieć dane oczekiwane i zwracane przez model. W przypadku modelu MLFlow, podobnie jak w tym samouczku, ten skrypt jest tworzony automatycznie. Przykłady skryptów oceniania można znaleźć tutaj.
Tworzenie nowego punktu końcowego online
Teraz, gdy masz zarejestrowany model i skrypt wnioskowania, nadszedł czas na utworzenie punktu końcowego online. Nazwa punktu końcowego musi być unikatowa w całym regionie świadczenia usługi Azure. W tym samouczku utworzysz unikatową nazwę przy użyciu polecenia UUID
.
import uuid
# Creating a unique name for the endpoint
online_endpoint_name = "credit-endpoint-" + str(uuid.uuid4())[:8]
Uwaga
Spodziewaj się, że tworzenie punktu końcowego potrwa około 6 do 8 minut.
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}")
Po utworzeniu punktu końcowego możesz pobrać go w następujący sposób:
endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)
print(
f'Endpoint "{endpoint.name}" with provisioning state "{endpoint.provisioning_state}" is retrieved'
)
Wdrażanie modelu w punkcie końcowym
Po utworzeniu punktu końcowego wdróż model za pomocą skryptu wpisu. Każdy punkt końcowy może mieć wiele wdrożeń. Bezpośredni ruch do tych wdrożeń można określić przy użyciu reguł. W tym miejscu utworzysz pojedyncze wdrożenie obsługujące 100% ruchu przychodzącego. Wybraliśmy nazwę koloru wdrożenia, na przykład niebieskie, zielone, czerwone wdrożenia, które są dowolne.
Możesz sprawdzić stronę Modele na Azure Machine Learning studio, aby zidentyfikować najnowszą wersję zarejestrowanego modelu. Alternatywnie poniższy kod pobierze najnowszy numer wersji do użycia.
# 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)]
)
Wdróż najnowszą wersję modelu.
Uwaga
Spodziewaj się, że wdrożenie potrwa około 6 do 8 minut.
# 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()
Testowanie przy użyciu przykładowego zapytania
Po wdrożeniu modelu w punkcie końcowym możesz uruchomić wnioskowanie.
Utwórz przykładowy plik żądania po projekcie oczekiwanym w metodzie run w skrycie oceny.
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",
)
Czyszczenie zasobów
Jeśli nie zamierzasz używać punktu końcowego, usuń go, aby zatrzymać korzystanie z zasobu. Upewnij się, że żadne inne wdrożenia nie używają punktu końcowego przed jego usunięciem.
Uwaga
Ten krok może potrwać około 6 do 8 minut.
ml_client.online_endpoints.begin_delete(name=online_endpoint_name)
Usuń wszystko
Wykonaj następujące kroki, aby usunąć obszar roboczy usługi Azure Machine Learning i wszystkie zasoby obliczeniowe.
Ważne
Utworzone zasoby mogą być używane jako wymagania wstępne dla innych samouczków usługi Azure Machine Learning i artykułów z instrukcjami.
Jeśli nie planujesz korzystać z żadnych utworzonych zasobów, usuń je, aby nie ponosić żadnych opłat:
W witrynie Azure Portal na końcu z lewej strony wybierz pozycję Grupy zasobów.
Z listy wybierz utworzoną przez siebie grupę zasobów.
Wybierz pozycję Usuń grupę zasobów.
Wpisz nazwę grupy zasobów. Następnie wybierz pozycję Usuń.
Następne kroki
- Przekonwertuj ten samouczek na potok gotowy do użycia w środowisku produkcyjnym przy użyciu składników wielokrotnego użytku.
- Dowiedz się więcej o wszystkich opcjach wdrażania usługi Azure Machine Learning.
- Dowiedz się, jak uwierzytelnić się w wdrożonym modelu.