TensorFlow-modellen op schaal trainen met Azure Machine Learning

VAN TOEPASSING OP: Python SDK azure-ai-ml v2 (actueel)

In dit artikel leert u hoe u uw TensorFlow-trainingsscripts op schaal uitvoert met behulp van Azure Machine Learning Python SDK v2.

De voorbeeldcode in dit artikel traint een TensorFlow-model om handgeschreven cijfers te classificeren met behulp van een deep neural network (DNN); het model registreren; en implementeer deze naar een online-eindpunt.

Of u nu een TensorFlow-model ontwikkelt vanaf de basis of als u een bestaand model naar de cloud brengt, kunt u Azure Machine Learning gebruiken om opensource-trainingstaken uit te schalen met behulp van elastische cloud-rekenresources. U kunt modellen op productieniveau bouwen, implementeren, versien en bewaken met Azure Machine Learning.

Vereisten

Als u wilt profiteren van dit artikel, moet u het volgende doen:

  • Toegang tot een Azure-abonnement. Als u er nog geen hebt, maakt u een gratis account.
  • Voer de code in dit artikel uit met behulp van een Azure Machine Learning-rekenproces of uw eigen Jupyter-notebook.
    • Azure Machine Learning-rekenproces: er zijn geen downloads of installatie nodig
      • Voltooi de zelfstudie Resources maken om aan de slag te gaan om een toegewezen notebookserver te maken die vooraf is geladen met de SDK en de voorbeeldopslagplaats.
      • Zoek in de map Deep Learning-voorbeelden op de notebookserver een voltooid en uitgebreid notebook door naar deze map te navigeren: v2 > sdk > python-taken >> met één stap > tensorflow > train-hyperparameter-tune-deploy-with-tensorflow.
    • Uw Jupyter Notebook-server
  • Download de volgende bestanden:

U kunt ook een voltooide Jupyter Notebook-versie van deze handleiding vinden op de pagina met GitHub-voorbeelden.

Voordat u de code in dit artikel kunt uitvoeren om een GPU-cluster te maken, moet u een quotumverhoging aanvragen voor uw werkruimte.

De taak instellen

In deze sectie wordt de taak voor training ingesteld door de vereiste Python-pakketten te laden, verbinding te maken met een werkruimte, een rekenresource te maken om een opdrachttaak uit te voeren en een omgeving te maken om de taak uit te voeren.

Verbinding maken naar de werkruimte

Eerst moet u verbinding maken met uw Azure Machine Learning-werkruimte. De Azure Machine Learning-werkruimte is de resource op het hoogste niveau voor de service. Het biedt u een centrale locatie om te werken met alle artefacten die u maakt wanneer u Azure Machine Learning gebruikt.

We gebruiken DefaultAzureCredential om toegang te krijgen tot de werkruimte. Deze referentie moet geschikt zijn voor het verwerken van de meeste Azure SDK-verificatiescenario's.

Als DefaultAzureCredential dit niet werkt, raadpleegt azure-identity reference documentation u of Set up authentication voor meer beschikbare referenties.

# Handle to the workspace
from azure.ai.ml import MLClient

# Authentication package
from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()

Als u liever een browser gebruikt om u aan te melden en te verifiëren, moet u de opmerkingen bij de volgende code verwijderen en in plaats daarvan gebruiken.

# Handle to the workspace
# from azure.ai.ml import MLClient

# Authentication package
# from azure.identity import InteractiveBrowserCredential
# credential = InteractiveBrowserCredential()

Haal vervolgens een ingang op voor de werkruimte door uw abonnements-id, resourcegroepnaam en werkruimtenaam op te geven. Ga als volgt te werk om deze parameters te vinden:

  1. Zoek de naam van uw werkruimte in de rechterbovenhoek van de werkbalk Azure Machine Learning-studio.
  2. Selecteer de naam van uw werkruimte om uw resourcegroep en abonnements-id weer te geven.
  3. Kopieer de waarden voor resourcegroep en abonnements-id naar de code.
# 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 van het uitvoeren van dit script is een werkruimtehandgreep die u gebruikt voor het beheren van andere resources en taken.

Notitie

  • Als MLClient de client wordt gemaakt, wordt er geen verbinding gemaakt met de werkruimte. De initialisatie van de client is lui en wacht op de eerste keer dat de client een oproep moet doen. In dit artikel gebeurt dit tijdens het maken van de berekening.

Een rekenresource maken

Azure Machine Learning heeft een rekenresource nodig om een taak uit te voeren. Deze resource kan machines met één of meerdere knooppunten zijn met Linux- of Windows-besturingssysteem, of een specifieke rekeninfrastructuur zoals Spark.

In het volgende voorbeeldscript richten we een Linux compute clusterin. U ziet de Azure Machine Learning pricing pagina voor de volledige lijst met VM-grootten en -prijzen. Omdat we voor dit voorbeeld een GPU-cluster nodig hebben, kiezen we een STANDARD_NC6 model en maken we een Azure Machine Learning-rekenproces.

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}"
)

Een taakomgeving maken

Als u een Azure Machine Learning-taak wilt uitvoeren, hebt u een omgeving nodig. Een Azure Machine Learning-omgeving bevat de afhankelijkheden (zoals softwareruntime en bibliotheken) die nodig zijn om uw machine learning-trainingsscript uit te voeren op uw rekenresource. Deze omgeving is vergelijkbaar met een Python-omgeving op uw lokale computer.

Met Azure Machine Learning kunt u een gecureerde (of kant-en-klare) omgeving gebruiken, handig voor algemene trainings- en deductiescenario's, of een aangepaste omgeving maken met behulp van een Docker-installatiekopie of een Conda-configuratie.

In dit artikel gebruikt u de gecureerde Azure Machine Learning-omgeving AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpuopnieuw. U gebruikt de nieuwste versie van deze omgeving met behulp van de @latest instructie.

curated_env_name = "AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu@latest"

Uw trainingstaak configureren en verzenden

In deze sectie beginnen we met het introduceren van de gegevens voor training. Vervolgens bespreken we hoe u een trainingstaak uitvoert met behulp van een trainingsscript dat we hebben opgegeven. U leert hoe u de trainingstaak bouwt door de opdracht voor het uitvoeren van het trainingsscript te configureren. Vervolgens dient u de trainingstaak in om te worden uitgevoerd in Azure Machine Learning.

De trainingsgegevens verkrijgen

U gebruikt gegevens uit de database Modified National Institute of Standards and Technology (MNIST) met handgeschreven cijfers. Deze gegevens zijn afkomstig van de website van Yan LeCun en opgeslagen in een Azure-opslagaccount.

web_path = "wasbs://datasets@azuremlexamples.blob.core.windows.net/mnist/"

Ga naar de website van Yan LeCun voor meer informatie over de MNIST-gegevensset.

Het trainingsscript voorbereiden

In dit artikel hebben we het trainingsscript tf_mnist.py gegeven. In de praktijk moet u elk aangepast trainingsscript kunnen gebruiken en uitvoeren met Azure Machine Learning zonder dat u uw code hoeft te wijzigen.

Het opgegeven trainingsscript doet het volgende:

  • verwerkt de voorverwerking van gegevens, het splitsen van de gegevens in test- en traingegevens;
  • traint een model met behulp van de gegevens; En
  • retourneert het uitvoermodel.

Tijdens de pijplijnuitvoering gebruikt u MLFlow om de parameters en metrische gegevens te registreren. Zie ML-experimenten en -modellen bijhouden met MLflow voor meer informatie over het inschakelen van MLFlow-tracering.

In het trainingsscript tf_mnist.pymaken we een eenvoudig deep neural network (DNN). Deze DNN heeft:

  • Een invoerlaag met 28 * 28 = 784 neuronen. Elke neuron vertegenwoordigt een afbeeldings pixel.
  • Twee verborgen lagen. De eerste verborgen laag heeft 300 neuronen en de tweede verborgen laag heeft 100 neuronen.
  • Een uitvoerlaag met 10 neuronen. Elke neuron vertegenwoordigt een doellabel van 0 tot 9.

Diagram met een diep neuraal netwerk met 784 neuronen op de invoerlaag, twee verborgen lagen en 10 neuronen op de uitvoerlaag.

De trainingstaak bouwen

Nu u alle assets hebt die nodig zijn om uw taak uit te voeren, is het tijd om deze te bouwen met behulp van de Azure Machine Learning Python SDK v2. In dit voorbeeld maken we een command.

Een Azure Machine Learning command is een resource waarmee alle details worden opgegeven die nodig zijn om uw trainingscode in de cloud uit te voeren. Deze details omvatten de invoer en uitvoer, het type hardware dat moet worden gebruikt, de software die moet worden geïnstalleerd en hoe u uw code uitvoert. De command bevat informatie voor het uitvoeren van één opdracht.

De opdracht configureren

U gebruikt het algemene doel command om het trainingsscript uit te voeren en uw gewenste taken uit te voeren. Maak een Command object om de configuratiegegevens van uw trainingstaak op te geven.

from azure.ai.ml import command
from azure.ai.ml import UserIdentityConfiguration
from azure.ai.ml import Input

web_path = "wasbs://datasets@azuremlexamples.blob.core.windows.net/mnist/"

job = command(
    inputs=dict(
        data_folder=Input(type="uri_folder", path=web_path),
        batch_size=64,
        first_layer_neurons=256,
        second_layer_neurons=128,
        learning_rate=0.01,
    ),
    compute=gpu_compute_target,
    environment=curated_env_name,
    code="./src/",
    command="python tf_mnist.py --data-folder ${{inputs.data_folder}} --batch-size ${{inputs.batch_size}} --first-layer-neurons ${{inputs.first_layer_neurons}} --second-layer-neurons ${{inputs.second_layer_neurons}} --learning-rate ${{inputs.learning_rate}}",
    experiment_name="tf-dnn-image-classify",
    display_name="tensorflow-classify-mnist-digit-images-with-dnn",
)
  • De invoer voor deze opdracht omvat de gegevenslocatie, batchgrootte, het aantal neuronen in de eerste en tweede laag en het leerpercentage. U ziet dat we het webpad rechtstreeks als invoer hebben doorgegeven.

  • Voor de parameterwaarden:

    • geef het rekencluster gpu_compute_target = "gpu-cluster" op dat u hebt gemaakt voor het uitvoeren van deze opdracht;
    • geef de gecureerde omgeving curated_env_name op die u eerder hebt gedeclareerd;
    • configureert u de opdrachtregelactie zelf, in dit geval is de opdracht python tf_mnist.py. U kunt de invoer en uitvoer in de opdracht openen via de ${{ ... }} notatie; en
    • metagegevens zoals de weergavenaam en experimentnaam configureren; waarbij een experiment een container is voor alle iteraties die op een bepaald project worden uitgevoerd. Alle taken die onder dezelfde experimentnaam worden ingediend, worden naast elkaar weergegeven in Azure Machine Learning-studio.
  • In dit voorbeeld gebruikt u de UserIdentity opdracht om de opdracht uit te voeren. Als u een gebruikersidentiteit gebruikt, betekent dit dat de opdracht uw identiteit gebruikt om de taak uit te voeren en toegang te krijgen tot de gegevens uit de blob.

De taak verzenden

Het is nu tijd om de taak in te dienen om te worden uitgevoerd in Azure Machine Learning. Deze keer gebruikt create_or_update u deze ml_client.jobskeer.

ml_client.jobs.create_or_update(job)

Zodra de taak is voltooid, registreert de taak een model in uw werkruimte (als gevolg van training) en voert u een koppeling uit om de taak in Azure Machine Learning-studio weer te geven.

Waarschuwing

Azure Machine Learning voert trainingsscripts uit door de volledige bronmap te kopiëren. Als u gevoelige gegevens hebt die u niet wilt uploaden, gebruikt u een .ignore-bestand of neemt u het niet op in de bronmap.

Wat gebeurt er tijdens het uitvoeren van de taak

Terwijl de taak wordt uitgevoerd, doorloopt deze de volgende fasen:

  • Voorbereiden: Er wordt een Docker-installatiekopieën gemaakt op basis van de gedefinieerde omgeving. De installatiekopieën worden geüpload naar het containerregister van de werkruimte en in de cache opgeslagen voor latere uitvoeringen. Logboeken worden ook gestreamd naar de taakgeschiedenis en kunnen worden bekeken om de voortgang te controleren. Als er een gecureerde omgeving is opgegeven, wordt de back-up van de gecureerde omgeving in de cache gebruikt.

  • Schalen: Het cluster probeert omhoog te schalen als er meer knooppunten nodig zijn om de uitvoering uit te voeren dan momenteel beschikbaar is.

  • Wordt uitgevoerd: Alle scripts in de scriptmap src worden geüpload naar het rekendoel, gegevensarchieven worden gekoppeld of gekopieerd en het script wordt uitgevoerd. Uitvoer van stdout en de map ./logs worden naar de taakgeschiedenis gestreamd en kunnen worden gebruikt om de taak te bewaken.

Modelhyperparameters afstemmen

Nu u hebt gezien hoe u een TensorFlow-training uitvoert met behulp van de SDK, gaan we kijken of u de nauwkeurigheid van uw model verder kunt verbeteren. U kunt de hyperparameters van uw model afstemmen en optimaliseren met behulp van de mogelijkheden van sweep Azure Machine Learning.

Als u de hyperparameters van het model wilt afstemmen, definieert u de parameterruimte waarin tijdens de training moet worden gezocht. U doet dit door enkele van de parameters (batch_size, first_layer_neurons, second_layer_neuronsen learning_rate) die aan de trainingstaak zijn doorgegeven, te vervangen door speciale invoer uit het azure.ml.sweep pakket.

from azure.ai.ml.sweep import Choice, LogUniform

# we will reuse the command_job created before. we call it as a function so that we can apply inputs
# we do not apply the 'iris_csv' input again -- we will just use what was already defined earlier
job_for_sweep = job(
    batch_size=Choice(values=[32, 64, 128]),
    first_layer_neurons=Choice(values=[16, 64, 128, 256, 512]),
    second_layer_neurons=Choice(values=[16, 64, 256, 512]),
    learning_rate=LogUniform(min_value=-6, max_value=-1),
)

Vervolgens configureert u opruimen voor de opdrachttaak met behulp van enkele opruimende parameters, zoals de primaire metrische waarde die u wilt bekijken en het sampling-algoritme dat moet worden gebruikt.

In de volgende code gebruiken we willekeurige steekproeven om verschillende configuratiesets van hyperparameters uit te proberen in een poging om onze primaire metrische gegevens te maximaliseren. validation_acc

We definiëren ook een beleid voor vroegtijdige beëindiging , de BanditPolicy. Dit beleid werkt door elke twee iteraties de taak te controleren. Als de primaire metrische waarde validation_accbuiten het bovenste bereik van 10 procent valt, beëindigt Azure Machine Learning de taak. Hierdoor wordt het model opgeslagen van het blijven verkennen van hyperparameters die geen belofte tonen om de doelmetriek te bereiken.

from azure.ai.ml.sweep import BanditPolicy

sweep_job = job_for_sweep.sweep(
    compute=gpu_compute_target,
    sampling_algorithm="random",
    primary_metric="validation_acc",
    goal="Maximize",
    max_total_trials=8,
    max_concurrent_trials=4,
    early_termination_policy=BanditPolicy(slack_factor=0.1, evaluation_interval=2),
)

U kunt deze taak nu indienen zoals voorheen. Deze keer voert u een sweep-taak uit die over uw trainingstaak veegt.

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)

U kunt de taak controleren met behulp van de gebruikersinterfacekoppeling van studio die wordt weergegeven tijdens de taakuitvoering.

Het beste model zoeken en registreren

Zodra alle uitvoeringen zijn voltooid, kunt u de uitvoering vinden die het model heeft geproduceerd met de hoogste nauwkeurigheid.

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 "model"
        path="azureml://jobs/{}/outputs/artifacts/paths/outputs/model/".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
        )
    )

U kunt dit model vervolgens registreren.

registered_model = ml_client.models.create_or_update(model=model)

Het model implementeren als een online-eindpunt

Nadat u uw model hebt geregistreerd, kunt u het implementeren als een online-eindpunt, dat wil gezegd, als een webservice in de Azure-cloud.

Voor het implementeren van een machine learning-service hebt u doorgaans het volgende nodig:

  • De modelassets die u wilt implementeren. Deze assets omvatten het bestand en de metagegevens van het model die u al hebt geregistreerd in uw trainingstaak.
  • Sommige code die moet worden uitgevoerd als een service. De code voert het model uit op een bepaalde invoeraanvraag (een invoerscript). Dit invoerscript ontvangt gegevens die zijn verzonden naar een geïmplementeerde webservice en geeft deze door aan het model. Nadat het model de gegevens heeft verwerkt, retourneert het script het antwoord van het model op de client. Het script is specifiek voor uw model en moet de gegevens begrijpen die het model verwacht en retourneert. Wanneer u een MLFlow-model gebruikt, maakt Azure Machine Learning dit script automatisch voor u.

Zie Een machine learning-model implementeren en beoordelen met een beheerd online-eindpunt met behulp van Python SDK v2 voor meer informatie over implementatie.

Een nieuw online-eindpunt maken

Als eerste stap voor het implementeren van uw model moet u uw online-eindpunt maken. De eindpuntnaam moet uniek zijn in de hele Azure-regio. Voor dit artikel maakt u een unieke naam met behulp van een UUID (Universally Unique Identifier).

import uuid

# Creating a unique name for the endpoint
online_endpoint_name = "tff-dnn-endpoint-" + str(uuid.uuid4())[:8]
from azure.ai.ml.entities import (
    ManagedOnlineEndpoint,
    ManagedOnlineDeployment,
    Model,
    Environment,
)

# create an online endpoint
endpoint = ManagedOnlineEndpoint(
    name=online_endpoint_name,
    description="Classify handwritten digits using a deep neural network (DNN) using TensorFlow",
    auth_mode="key",
)

endpoint = ml_client.begin_create_or_update(endpoint).result()

print(f"Endpint {endpoint.name} provisioning state: {endpoint.provisioning_state}")

Zodra u het eindpunt hebt gemaakt, kunt u het als volgt ophalen:

endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)

print(
    f'Endpint "{endpoint.name}" with provisioning state "{endpoint.provisioning_state}" is retrieved'
)

Het model implementeren op het eindpunt

Nadat u het eindpunt hebt gemaakt, kunt u het model implementeren met het invoerscript. Een eindpunt kan meerdere implementaties hebben. Met behulp van regels kan het eindpunt vervolgens verkeer naar deze implementaties leiden.

In de volgende code maakt u één implementatie die 100% van het binnenkomende verkeer verwerkt. We gebruiken een willekeurige kleurnaam (tff-blauw) voor de implementatie. U kunt ook een andere naam gebruiken, zoals tff-groen of tff-rood voor de implementatie. De code voor het implementeren van het model op het eindpunt doet het volgende:

  • implementeert de beste versie van het model dat u eerder hebt geregistreerd;
  • beoordeelt het model met behulp van het score.py bestand; en
  • gebruikt dezelfde gecureerde omgeving (die u eerder hebt gedeclareerd) om deductie uit te voeren.
model = registered_model

from azure.ai.ml.entities import CodeConfiguration

# create an online deployment.
blue_deployment = ManagedOnlineDeployment(
    name="tff-blue",
    endpoint_name=online_endpoint_name,
    model=model,
    code_configuration=CodeConfiguration(code="./src", scoring_script="score.py"),
    environment=curated_env_name,
    instance_type="Standard_DS3_v2",
    instance_count=1,
)

blue_deployment = ml_client.begin_create_or_update(blue_deployment).result()

Notitie

Verwacht dat het even duurt voordat deze implementatie is voltooid.

De implementatie testen met een voorbeeldquery

Nadat u het model op het eindpunt hebt geïmplementeerd, kunt u de uitvoer van het geïmplementeerde model voorspellen met behulp van de invoke methode op het eindpunt. Als u de deductie wilt uitvoeren, gebruikt u het voorbeeldaanvraagbestand sample-request.json uit de aanvraagmap .

# # predict using the deployed model
result = ml_client.online_endpoints.invoke(
    endpoint_name=online_endpoint_name,
    request_file="./request/sample-request.json",
    deployment_name="tff-blue",
)

Vervolgens kunt u de geretourneerde voorspellingen afdrukken en deze samen met de invoerafbeeldingen uitzetten. Gebruik rode tekstkleur en omgekeerde afbeelding (wit op zwart) om de verkeerd geclassificeerde voorbeelden te markeren.

# compare actual value vs. the predicted values:
import matplotlib.pyplot as plt

i = 0
plt.figure(figsize=(20, 1))

for s in sample_indices:
    plt.subplot(1, n, i + 1)
    plt.axhline("")
    plt.axvline("")

    # use different color for misclassified sample
    font_color = "red" if y_test[s] != result[i] else "black"
    clr_map = plt.cm.gray if y_test[s] != result[i] else plt.cm.Greys

    plt.text(x=10, y=-10, s=result[i], fontsize=18, color=font_color)
    plt.imshow(X_test[s].reshape(28, 28), cmap=clr_map)

    i = i + 1
plt.show()

Notitie

Omdat de nauwkeurigheid van het model hoog is, moet u de cel mogelijk een paar keer uitvoeren voordat u een verkeerd geclassificeerd voorbeeld ziet.

Resources opschonen

Als u het eindpunt niet gebruikt, verwijdert u het om te stoppen met het gebruik van de resource. Zorg ervoor dat er geen andere implementaties het eindpunt gebruiken voordat u het verwijdert.

ml_client.online_endpoints.begin_delete(name=online_endpoint_name)

Notitie

Verwacht dat het even duurt voordat deze opschoonactie is voltooid.

Volgende stappen

In dit artikel hebt u een TensorFlow-model getraind en geregistreerd. U hebt het model ook geïmplementeerd op een online-eindpunt. Zie deze andere artikelen voor meer informatie over Azure Machine Learning.