PyTorch-modellek betanítása nagy méretekben az Azure Machine Learninggel
A KÖVETKEZŐKRE VONATKOZIK: Python SDK azure-ai-ml v2 (aktuális)
Ebben a cikkben megismerheti a PyTorch-modellek betanítása, hiperparaméter-finomhangolása és üzembe helyezése az Azure Machine Learning Python SDK v2 használatával.
Példaszkriptekkel osztályozhatja a csirke- és pulykarendszerképeket egy mélytanulási neurális hálózat (DNN) létrehozásához a PyTorch átviteli tanulási oktatóanyaga alapján. A tanulás átadása olyan technika, amely az egyik probléma megoldásából nyert tudást egy másik, de kapcsolódó problémára alkalmazza. A tanulás átvitele lerövidíti a betanítási folyamatot azáltal, hogy kevesebb adatot, időt és számítási erőforrást igényel, mint az alapoktól való betanítás. A transzfertanulásról további információt a mély tanulás és a gépi tanulás című témakörben talál.
Akár az alapoktól tanít be mélytanulási PyTorch-modellt, akár meglévő modellt hoz a felhőbe, az Azure Machine Learning segítségével rugalmas felhőbeli számítási erőforrások használatával skálázhatja fel a nyílt forráskódú betanítási feladatokat. Az Azure Machine Learning használatával éles üzemű modelleket hozhat létre, helyezhet üzembe, futtathat és monitorozhat.
Előfeltételek
- Azure-előfizetés. Ha még nem rendelkezik ilyen fiókkal, hozzon létre egy ingyenes fiókot.
- Futtassa a jelen cikkben szereplő kódot egy Azure Machine Learning számítási példány vagy egy saját Jupyter-notebook használatával.
- Azure Machine Learning számítási példány – nincs szükség letöltésre vagy telepítésre:
- Végezze el a rövid útmutatót: Az Azure Machine Learning használatának első lépései az SDK-val és a mintaadattárral előre betöltött dedikált jegyzetfüzet-kiszolgáló létrehozásához.
- A munkaterület Jegyzetfüzetek szakaszÁnak Minták lapján keressen egy befejezett és kibontott jegyzetfüzetet a következő könyvtárra navigálva: SDK v2/sdk/python/jobs/single-step/pytorch/train-hyperparameter-tune-deploy-with-pytorch
- Az Ön Jupyter notebook-kiszolgálója:
- Telepítse az Azure Machine Learning SDK-t (v2).
- Töltse le a betanítási szkriptfájlt pytorch_train.py.
- Azure Machine Learning számítási példány – nincs szükség letöltésre vagy telepítésre:
Az útmutató befejezett Jupyter-notebookverzióját a GitHub-minták oldalán is megtalálhatja.
A feladat beállítása
Ez a szakasz betanításra állítja be a feladatot a szükséges Python-csomagok betöltésével, a munkaterülethez való csatlakozással, egy számítási erőforrás létrehozásával egy parancsfeladat futtatásához, valamint a feladat futtatásához szükséges környezet létrehozásával.
Csatlakozás a munkaterülethez
Először csatlakoznia kell az Azure Machine Learning-munkaterülethez. A munkaterület a szolgáltatás legfelső szintű erőforrása. Központosított helyet biztosít az Azure Machine Learning használatakor létrehozott összes összetevővel való munkához.
A munkaterülethez való hozzáférést használjuk DefaultAzureCredential
. Ennek a hitelesítő adatnak képesnek kell lennie a legtöbb Azure SDK-hitelesítési forgatókönyv kezelésére.
Ha DefaultAzureCredential
nem működik az Ön számára, tekintse meg az azure.identity csomagot , vagy állítsa be a hitelesítést az elérhetőbb hitelesítő adatokért.
# Handle to the workspace
from azure.ai.ml import MLClient
# Authentication package
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
Ha inkább böngészőt használ a bejelentkezéshez és a hitelesítéshez, törölje a következő kódot, és használja helyette.
# Handle to the workspace
# from azure.ai.ml import MLClient
# Authentication package
# from azure.identity import InteractiveBrowserCredential
# credential = InteractiveBrowserCredential()
Ezután szerezze be a munkaterület leíróját az előfizetés azonosítójának, az erőforráscsoport nevének és a munkaterület nevének megadásával. A paraméterek megkeresése:
- Keresse meg a munkaterület nevét az Azure Machine Learning Studio eszköztárának jobb felső sarkában.
- Válassza ki a munkaterület nevét az erőforráscsoport és az előfizetés azonosítójának megjelenítéséhez.
- Másolja az erőforráscsoport és az előfizetés azonosítójának értékeit a kódba.
# 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>",
)
A szkript futtatásának eredménye egy munkaterületi leíró, amellyel más erőforrásokat és feladatokat kezelhet.
Feljegyzés
A létrehozás MLClient
nem csatlakoztatja az ügyfelet a munkaterülethez. Az ügyfél inicializálása lusta, és az első alkalommal várakozik, amikor hívást kell kezdeményeznie. Ebben a cikkben ez a számítás létrehozása során történik.
Számítási erőforrás létrehozása a feladat futtatásához
Az Azure Machine Learningnek számítási erőforrásra van szüksége egy feladat futtatásához. Ez az erőforrás lehet egy- vagy többcsomópontos gép Linux vagy Windows operációs rendszerrel, vagy egy adott számítási háló, például a Spark.
Az alábbi példaszkriptben kiépítünk egy Linux számítási fürtöt. Az Azure Machine Learning díjszabási oldalán megtekintheti a virtuális gépek méreteinek és árainak teljes listáját. Mivel ehhez a példához GPU-fürtre van szükségünk, válasszunk ki egy STANDARD_NC6
modellt, és hozzunk létre egy Azure Machine Learning-számítást.
from azure.ai.ml.entities import AmlCompute
gpu_compute_target = "gpu-cluster"
try:
# let's see if the compute target already exists
gpu_cluster = ml_client.compute.get(gpu_compute_target)
print(
f"You already have a cluster named {gpu_compute_target}, we'll reuse it as is."
)
except Exception:
print("Creating a new gpu compute target...")
# Let's create the Azure ML compute object with the intended parameters
gpu_cluster = AmlCompute(
# Name assigned to the compute cluster
name="gpu-cluster",
# Azure ML Compute is the on-demand VM service
type="amlcompute",
# VM Family
size="STANDARD_NC6s_v3",
# 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",
)
# Now, we pass the object to MLClient's create_or_update method
gpu_cluster = ml_client.begin_create_or_update(gpu_cluster).result()
print(
f"AMLCompute with name {gpu_cluster.name} is created, the compute size is {gpu_cluster.size}"
)
Feladatkörnyezet létrehozása
Azure Machine Learning-feladat futtatásához környezetre van szükség. Az Azure Machine Learning-környezet magában foglalja a számítógép-tanulási betanítási szkript számítási erőforráson való futtatásához szükséges függőségeket (például szoftveres futtatókörnyezetet és kódtárakat). Ez a környezet hasonló a helyi gépen lévő Python-környezethez.
Az Azure Machine Learning lehetővé teszi, hogy válogatott (vagy kész) környezetet használjon, vagy egyéni környezetet hozzon létre Docker-rendszerkép vagy Conda-konfiguráció használatával. Ebben a cikkben újra felhasználja a válogatott Azure Machine Learning-környezetet AzureML-acpt-pytorch-2.2-cuda12.1
. Használja a környezet legújabb verzióját az @latest
irányelv használatával.
curated_env_name = "AzureML-acpt-pytorch-2.2-cuda12.1@latest"
A betanítási feladat konfigurálása és elküldése
Ebben a szakaszban a betanításhoz szükséges adatok bevezetésével kezdjük. Ezután bemutatjuk, hogyan futtathat egy betanítási feladatot egy általunk biztosított betanítási szkripttel. A betanítási feladat összeállításához konfigurálja a betanítási szkript futtatására szolgáló parancsot. Ezután beküldi a betanítási feladatot az Azure Machine Learningben való futtatáshoz.
A betanítási adatok beszerzése
Ebben a tömörített fájlban használhatja az adathalmazt. Ez az adatkészlet körülbelül 120 betanítási képből áll két osztályhoz (pulykákhoz és csirkékhez), és minden osztályhoz 100 érvényesítési kép tartozik. A képek az Open Images v5 Dataset részhalmazai. A betanítási szkript pytorch_train.py letölti és kinyeri az adathalmazt.
A betanítási szkript előkészítése
Az előfeltételek szakaszban a betanítási szkriptet pytorch_train.py. A gyakorlatban képesnek kell lennie bármilyen egyéni betanítási szkriptet használni, és anélkül futtatni az Azure Machine Learningben, hogy módosítania kellene a kódot.
A megadott betanítási szkript letölti az adatokat, betanít egy modellt, és regisztrálja a modellt.
A betanítási feladat létrehozása
Most, hogy rendelkezik a feladat futtatásához szükséges összes eszközzel, itt az ideje, hogy az Azure Machine Learning Python SDK 2-s v2 használatával hozza létre. Ebben a példában létrehozunk egy command
.
Az Azure Machine Learning command
egy erőforrás, amely megadja a betanítási kód felhőben való végrehajtásához szükséges összes részletet. Ezek a részletek tartalmazzák a bemeneteket és kimeneteket, a használandó hardver típusát, a telepíteni kívánt szoftvereket és a kód futtatásának módját. A command
parancsok végrehajtásához szükséges információkat tartalmazza.
A parancs konfigurálása
Az általános célt command
használja a betanítási szkript futtatására és a kívánt feladatok végrehajtására. Hozzon létre egy objektumot command
a betanítási feladat konfigurációs adatainak megadásához.
from azure.ai.ml import command
from azure.ai.ml import Input
job = command(
inputs=dict(
num_epochs=30, learning_rate=0.001, momentum=0.9, output_dir="./outputs"
),
compute=gpu_compute_target,
environment=curated_env_name,
code="./src/", # location of source code
command="python pytorch_train.py --num_epochs ${{inputs.num_epochs}} --output_dir ${{inputs.output_dir}}",
experiment_name="pytorch-birds",
display_name="pytorch-birds-image",
)
- A parancs bemenetei közé tartozik az alapidőszakok száma, a tanulási sebesség, a lendület és a kimeneti könyvtár.
- A paraméterértékek esetében:
- Adja meg a parancs futtatásához létrehozott számítási fürtöt
gpu_compute_target = "gpu-cluster"
. - Adja meg a korábban inicializált válogatott környezetet.
- Ha nem a Minták mappában használja a kész jegyzetfüzetet, adja meg a pytorch_train.py fájl helyét.
- Konfigurálja magát a parancssori műveletet – ebben az esetben a parancs a következő
python pytorch_train.py
. A parancs bemeneteit és kimeneteit a jelölésen keresztül érheti${{ ... }}
el. - Konfigurálja a metaadatokat, például a megjelenítendő nevet és a kísérlet nevét, ahol a kísérlet egy tároló az adott projekten végzett összes iterációhoz. Az azonos kísérletnévvel elküldött összes feladat egymás mellett szerepelne az Azure Machine Learning Studióban.
- Adja meg a parancs futtatásához létrehozott számítási fürtöt
Feladat küldése
Itt az ideje, hogy elküldje a feladatot az Azure Machine Learningben való futtatáshoz. Ezúttal a következőt használja create_or_update
: ml_client.jobs
.
ml_client.jobs.create_or_update(job)
Miután végzett, a feladat regisztrál egy modellt a munkaterületen (a betanítás eredményeként), és egy hivatkozást ad ki a feladat Azure Machine Learning Studióban való megtekintéséhez.
Figyelmeztetés
Az Azure Machine Learning a teljes forráskönyvtár másolásával futtat betanítási szkripteket. Ha olyan bizalmas adatokkal rendelkezik, amelyeket nem szeretne feltölteni, használjon .ignore fájlt , vagy ne vegye fel azokat a forráskönyvtárba.
Mi történik a feladat végrehajtása során?
A feladat végrehajtása során a következő szakaszokon megy keresztül:
Előkészítés: A rendszer létrehoz egy Docker-rendszerképet a megadott környezetnek megfelelően. A rendszerképet a rendszer feltölti a munkaterület tárolóregisztrációs adatbázisára, és gyorsítótárazza a későbbi futtatásokhoz. A naplók a feladatelőzményekbe is streamelhetők, és megtekinthetők a folyamat figyeléséhez. Ha egy válogatott környezet van megadva, a rendszer a gyorsítótárazott rendszerkép-háttérrendszert használja a válogatott környezethez.
Skálázás: A fürt megkísérli a vertikális felskálázást, ha a futtatás végrehajtásához több csomópontra van szükség, mint amennyi jelenleg elérhető.
Futtatás: A szkriptmappa src összes szkriptje fel lesz töltve a számítási célba, az adattárak csatlakoztatva vannak vagy másolódnak, és a szkript végrehajtása megtörténik. Az stdout és a ./logs mappa kimenetei a feladatelőzményekbe kerülnek, és a feladat figyelésére használhatók.
Modell hiperparamétereinek finomhangolása
A modellt egy paraméterkészlettel képezte be, most lássuk, hogy tovább javíthatja-e a modell pontosságát. Az Azure Machine Learning képességeivel hangolhatja és optimalizálhatja a modell hiperparamétereit sweep
.
A modell hiperparamétereinek finomhangolásához adja meg azt a paraméterteret, amelyben a betanítás során keresni szeretne. Ehhez cserélje le a betanítási feladatnak átadott paraméterek egy részét a azure.ml.sweep
csomagból származó speciális bemenetekre.
Mivel a betanítási szkript a tanulási sebesség ütemezését használja a tanulási sebesség több korszakban történő romlásához, beállíthatja a kezdeti tanulási arányt és a lendület paramétereit.
from azure.ai.ml.sweep import Uniform
# we will reuse the command_job created before. we call it as a function so that we can apply inputs
job_for_sweep = job(
learning_rate=Uniform(min_value=0.0005, max_value=0.005),
momentum=Uniform(min_value=0.9, max_value=0.99),
)
Ezután konfigurálhatja a takarítást a parancsfeladaton bizonyos, takarítással kapcsolatos paraméterekkel, például a figyelendő elsődleges metrikával és a használandó mintavételezési algoritmussal.
Az alábbi kódban véletlenszerű mintavételezést használunk a hiperparaméterek különböző konfigurációs készleteinek kipróbálására, hogy maximalizáljuk az elsődleges metrikát. best_val_acc
Meghatározunk egy korai felmondási szabályzatot is, a BanditPolicy
helytelenül teljesítő futtatások korai leállításához.
A BanditPolicy
rendszer leállítja azokat a futtatásokat, amelyek nem tartoznak az elsődleges kiértékelési metrika tartalékidő-tényezőjébe. Ezt a szabályzatot minden korszakban alkalmazza (mivel a metrikát minden korszakban és evaluation_interval
=1-ben jelentjükbest_val_acc
). Figyelje meg, hogy az első szabályzat kiértékelését az első 10 korszak után (delay_evaluation
=10) késleltetjük.
from azure.ai.ml.sweep import BanditPolicy
sweep_job = job_for_sweep.sweep(
compute="gpu-cluster",
sampling_algorithm="random",
primary_metric="best_val_acc",
goal="Maximize",
max_total_trials=8,
max_concurrent_trials=4,
early_termination_policy=BanditPolicy(
slack_factor=0.15, evaluation_interval=1, delay_evaluation=10
),
)
Most már a korábbiakhoz hasonlóan küldheti el ezt a feladatot. Ezúttal egy takarítási feladatot futtat, amely átsöpri a vonatfeladatát.
returned_sweep_job = ml_client.create_or_update(sweep_job)
# stream the output and wait until the job is finished
ml_client.jobs.stream(returned_sweep_job.name)
# refresh the latest status of the job after streaming
returned_sweep_job = ml_client.jobs.get(name=returned_sweep_job.name)
A feladat monitorozásához használja a feladat futtatása során megjelenő studio felhasználói felületi hivatkozást.
A legjobb modell megkeresése
Miután az összes futtatás befejeződött, megtalálhatja a modellt a legnagyobb pontossággal előállító futtatásokat.
from azure.ai.ml.entities import Model
if returned_sweep_job.status == "Completed":
# First let us get the run which gave us the best result
best_run = returned_sweep_job.properties["best_child_run_id"]
# lets get the model from this run
model = Model(
# the script stores the model as "outputs"
path="azureml://jobs/{}/outputs/artifacts/paths/outputs/".format(best_run),
name="run-model-example",
description="Model created from run.",
type="custom_model",
)
else:
print(
"Sweep job status: {}. Please wait until it completes".format(
returned_sweep_job.status
)
)
A modell üzembe helyezése online végpontként
Mostantól online végpontként is üzembe helyezheti a modellt, vagyis webszolgáltatásként az Azure-felhőben.
Gépi tanulási szolgáltatás üzembe helyezéséhez általában a következőkre van szüksége:
- Az üzembe helyezni kívánt modellegységek. Ezek az eszközök tartalmazzák a modell azon fájlját és metaadatait, amelyeket már regisztrált a betanítási feladatban.
- Néhány szolgáltatásként futtatandó kód. A kód egy adott bemeneti kérésen (belépési szkripten) hajtja végre a modellt. Ez a bejegyzésszkript fogadja az üzembe helyezett webszolgáltatásnak küldött adatokat, és továbbítja azokat a modellnek. Miután a modell feldolgozta az adatokat, a szkript visszaadja a modell válaszát az ügyfélnek. A szkript a modellre jellemző, és ismernie kell a modell által várt és visszaadott adatokat. MLFlow-modell használata esetén az Azure Machine Learning automatikusan létrehozza ezt a szkriptet.
További információ az üzembe helyezésről: Gépi tanulási modell üzembe helyezése és pontszáma felügyelt online végponttal Python SDK v2 használatával.
Új online végpont létrehozása
A modell üzembe helyezésének első lépéseként létre kell hoznia az online végpontot. A végpont nevének egyedinek kell lennie a teljes Azure-régióban. Ebben a cikkben egy univerzálisan egyedi azonosító (UUID) használatával hoz létre egyedi nevet.
import uuid
# Creating a unique name for the endpoint
online_endpoint_name = "aci-birds-endpoint-" + str(uuid.uuid4())[:8]
from azure.ai.ml.entities import ManagedOnlineEndpoint
# create an online endpoint
endpoint = ManagedOnlineEndpoint(
name=online_endpoint_name,
description="Classify turkey/chickens using transfer learning with PyTorch",
auth_mode="key",
tags={"data": "birds", "method": "transfer learning", "framework": "pytorch"},
)
endpoint = ml_client.begin_create_or_update(endpoint).result()
print(f"Endpoint {endpoint.name} provisioning state: {endpoint.provisioning_state}")
A végpont létrehozása után az alábbiak szerint kérdezheti le:
endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)
print(
f'Endpint "{endpoint.name}" with provisioning state "{endpoint.provisioning_state}" is retrieved'
)
A modell üzembe helyezése a végponton
Most már üzembe helyezheti a modellt a belépési szkripttel. Egy végpont több üzembe helyezéssel is rendelkezhet. A szabályok használatával a végpont ezután átirányíthatja a forgalmat ezekre az üzemelő példányokra.
Az alábbi kódban egyetlen üzembe helyezést fog létrehozni, amely a bejövő forgalom 100%-át kezeli. Tetszőleges aci-kék színnevet adtunk meg az üzembe helyezéshez. Az üzembe helyezéshez bármilyen más nevet is használhat, például aci-zöld vagy aci-piros nevet.
A modell végponton való üzembe helyezéséhez szükséges kód:
- A korábban regisztrált modell legjobb verzióját helyezi üzembe.
- A modell pontszáma a score.py fájl használatával.
- A (korábban megadott) válogatott környezetet használja a következtetés végrehajtásához.
from azure.ai.ml.entities import (
ManagedOnlineDeployment,
Model,
Environment,
CodeConfiguration,
)
online_deployment_name = "aci-blue"
# create an online deployment.
blue_deployment = ManagedOnlineDeployment(
name=online_deployment_name,
endpoint_name=online_endpoint_name,
model=model,
environment=curated_env_name,
code_configuration=CodeConfiguration(code="./score/", scoring_script="score.py"),
instance_type="Standard_NC6s_v3",
instance_count=1,
)
blue_deployment = ml_client.begin_create_or_update(blue_deployment).result()
Feljegyzés
Az üzembe helyezés várhatóan egy kis időt vesz igénybe.
Az üzembe helyezett modell tesztelése
Most, hogy üzembe helyezte a modellt a végponton, előrejelezheti az üzembe helyezett modell kimenetét a invoke
végponton található metódus használatával.
A végpont teszteléséhez használjunk egy mintaképet az előrejelzéshez. Először jelenítsük meg a képet.
# install pillow if PIL cannot imported
%pip install pillow
import json
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline
plt.imshow(Image.open("test_img.jpg"))
Hozzon létre egy függvényt a kép formázásához és átméretezéséhez.
# install torch and torchvision if needed
%pip install torch
%pip install torchvision
import torch
from torchvision import transforms
def preprocess(image_file):
"""Preprocess the input image."""
data_transforms = transforms.Compose(
[
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
]
)
image = Image.open(image_file)
image = data_transforms(image).float()
image = torch.tensor(image)
image = image.unsqueeze(0)
return image.numpy()
Formázza a képet, és konvertálja JSON-fájllá.
image_data = preprocess("test_img.jpg")
input_data = json.dumps({"data": image_data.tolist()})
with open("request.json", "w") as outfile:
outfile.write(input_data)
Ezután meghívhatja a végpontot ezzel a JSON-val, és kinyomtathatja az eredményt.
# test the blue deployment
result = ml_client.online_endpoints.invoke(
endpoint_name=online_endpoint_name,
request_file="request.json",
deployment_name=online_deployment_name,
)
print(result)
Az erőforrások eltávolítása
Ha már nincs szüksége a végpontra, törölje az erőforrás használatának leállításához. A törlés előtt győződjön meg arról, hogy más üzemelő példányok nem használják a végpontot.
ml_client.online_endpoints.begin_delete(name=online_endpoint_name)
Feljegyzés
Várjon egy kis időt a törlés befejezésére.
Kapcsolódó tartalom
Ebben a cikkben betanított és regisztrált egy mélytanulási neurális hálózatot a PyTorch használatával az Azure Machine Learningben. A modellt egy online végponton is üzembe helyezte. Az Azure Machine Learningről további információt az alábbi cikkekben talál.