Delen via


Zelfstudie: Uw eerste Machine Learning-model trainen (SDK v1, deel 2 van 3)

VAN TOEPASSING OP: Python SDK azureml v1

Deze zelfstudie laat zien hoe u een machine learning-model traint in Azure Machine Learning. Deze zelfstudie is deel 2 van een tweedelige reeks zelfstudies.

In deel 1: 'Hallo wereld!' van de reeks uitvoeren, hebt u geleerd hoe u een besturingsscript gebruikt om een taak uit te voeren in de cloud.

In deze zelfstudie voert u de volgende stap uit door een script te verzenden dat een machine learning-model traint. In dit voorbeeld leert u hoe Azure Machine Learning consistent gedrag vereenvoudigt tussen lokale foutopsporing en externe uitvoeringen.

In deze zelfstudie hebt u:

  • Maak een trainingsscript.
  • Conda gebruiken om een Azure Machine Learning-omgeving te definiëren.
  • Een besturingsscript maken.
  • Inzicht krijgen in Azure Machine Learning-klassen (Environment, Run, Metrics).
  • Uw trainingsscript verzenden en uitvoeren.
  • De code-uitvoer weergeven in de cloud.
  • De metrische gegevens vastleggen in Azure Machine Learning.
  • Uw metrische gegevens bekijken in de cloud.

Vereisten

  • Voltooiing van deel 1 van de reeks.

Trainingsscripts maken

Eerst definieert u de neurale netwerkarchitectuur in een model.py-bestand . Al uw trainingscode gaat naar de src submap, inclusief model.py.

De trainingscode is afkomstig uit dit inleidende voorbeeld van PyTorch. De Azure Machine Learning-concepten zijn van toepassing op machine learning-code, niet alleen Op PyTorch.

  1. Maak een model.py-bestand in de src-submap . Kopieer deze code naar het bestand:

    import torch.nn as nn
    import torch.nn.functional as F
    
    
    class Net(nn.Module):
        def __init__(self):
            super(Net, self).__init__()
            self.conv1 = nn.Conv2d(3, 6, 5)
            self.pool = nn.MaxPool2d(2, 2)
            self.conv2 = nn.Conv2d(6, 16, 5)
            self.fc1 = nn.Linear(16 * 5 * 5, 120)
            self.fc2 = nn.Linear(120, 84)
            self.fc3 = nn.Linear(84, 10)
    
        def forward(self, x):
            x = self.pool(F.relu(self.conv1(x)))
            x = self.pool(F.relu(self.conv2(x)))
            x = x.view(-1, 16 * 5 * 5)
            x = F.relu(self.fc1(x))
            x = F.relu(self.fc2(x))
            x = self.fc3(x)
            return x
    
  2. Selecteer Opslaan op de werkbalk om het bestand op te slaan. Sluit desgewenst het tabblad.

  3. Definieer vervolgens het trainingsscript, ook in de src-submap . Met dit script wordt de CIFAR10-gegevensset gedownload met behulp van PyTorch-API's torchvision.dataset , wordt het netwerk ingesteld dat is gedefinieerd in model.py en wordt deze getraind voor twee tijdvakken met behulp van standaard-SGD- en entropieverlies.

    Maak een train.py script in de submap src :

    import torch
    import torch.optim as optim
    import torchvision
    import torchvision.transforms as transforms
    
    from model import Net
    
    # download CIFAR 10 data
    trainset = torchvision.datasets.CIFAR10(
        root="../data",
        train=True,
        download=True,
        transform=torchvision.transforms.ToTensor(),
    )
    trainloader = torch.utils.data.DataLoader(
        trainset, batch_size=4, shuffle=True, num_workers=2
    )
    
    
    if __name__ == "__main__":
    
        # define convolutional network
        net = Net()
    
        # set up pytorch loss /  optimizer
        criterion = torch.nn.CrossEntropyLoss()
        optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
    
        # train the network
        for epoch in range(2):
    
            running_loss = 0.0
            for i, data in enumerate(trainloader, 0):
                # unpack the data
                inputs, labels = data
    
                # zero the parameter gradients
                optimizer.zero_grad()
    
                # forward + backward + optimize
                outputs = net(inputs)
                loss = criterion(outputs, labels)
                loss.backward()
                optimizer.step()
    
                # print statistics
                running_loss += loss.item()
                if i % 2000 == 1999:
                    loss = running_loss / 2000
                    print(f"epoch={epoch + 1}, batch={i + 1:5}: loss {loss:.2f}")
                    running_loss = 0.0
    
        print("Finished Training")
    
  4. U hebt nu de volgende mapstructuur:

    Mapstructuur toont train.py in de submap van src

Lokaal testen

Selecteer Opslaan en script uitvoeren in terminal om het train.py script rechtstreeks op het rekenproces uit te voeren.

Nadat het script is voltooid, selecteert u Vernieuwen boven de bestandsmappen. U ziet de nieuwe gegevensmap aan de slag /gegevens Vouw deze map uit om de gedownloade gegevens weer te geven.

Schermopname van mappen met nieuwe gegevensmap die is gemaakt door het bestand lokaal uit te voeren.

Een Python-omgeving maken

Azure Machine Learning biedt het concept van een omgeving als een reproduceerbare Python-omgeving met versies waarin u experimenten kunt uitvoeren. Het is eenvoudig om een omgeving te maken op basis van een lokale Conda- of PIP-omgeving.

Eerst maakt u een bestand met de pakketafhankelijkheden.

  1. Maak een nieuw bestand in de map Aan de slag met de naampytorch-env.yml:

    name: pytorch-env
    channels:
        - defaults
        - pytorch
    dependencies:
        - python=3.7
        - pytorch
        - torchvision
    
  2. Selecteer Opslaan op de werkbalk om het bestand op te slaan. Sluit desgewenst het tabblad.

Het besturingsscript maken

Het verschil tussen het volgende besturingsscript en het script dat u hebt gebruikt om 'Hallo wereld!' in te dienen, is dat u een aantal extra regels toevoegt om de omgeving in te stellen.

Maak een nieuw Python-bestand in de map Aan de slag met de naamrun-pytorch.py:

# run-pytorch.py
from azureml.core import Workspace
from azureml.core import Experiment
from azureml.core import Environment
from azureml.core import ScriptRunConfig

if __name__ == "__main__":
    ws = Workspace.from_config()
    experiment = Experiment(workspace=ws, name='day1-experiment-train')
    config = ScriptRunConfig(source_directory='./src',
                             script='train.py',
                             compute_target='cpu-cluster')

    # set up pytorch environment
    env = Environment.from_conda_specification(
        name='pytorch-env',
        file_path='pytorch-env.yml'
    )
    config.run_config.environment = env

    run = experiment.submit(config)

    aml_url = run.get_portal_url()
    print(aml_url)

Tip

Als u een andere naam hebt gebruikt bij het maken van uw rekencluster, moet u ook de naam in de code compute_target='cpu-cluster' aanpassen.

De codewijzigingen begrijpen

env = ...

Verwijst naar het afhankelijkheidsbestand dat u hierboven hebt gemaakt.

config.run_config.environment = env

De omgeving wordt toegevoegd aan ScriptRunConfig.

De uitvoering versturen naar Microsoft Azure Machine Learning

  1. Selecteer Opslaan en script uitvoeren in terminal om het run-pytorch.py script uit te voeren.

  2. U ziet een koppeling in het terminalvenster dat wordt geopend. Selecteer de koppeling om de taak weer te geven.

    Notitie

    Er worden mogelijk enkele waarschuwingen weergegeven die beginnen met fouten tijdens het laden van azureml_run_type_providers.... U kunt deze waarschuwingen negeren. Gebruik de koppeling onder aan deze waarschuwingen om de uitvoer weer te geven.

De uitvoer weergeven

  1. Op de pagina die wordt geopend, ziet u de taakstatus. De eerste keer dat u dit script uitvoert, bouwt Azure Machine Learning een nieuwe Docker-installatiekopieën uit uw PyTorch-omgeving. Het kan ongeveer 10 minuten duren voordat de hele taak is voltooid. Deze installatiekopieën worden in toekomstige taken opnieuw gebruikt om ze veel sneller uit te voeren.
  2. U kunt de Build-logboeken van Docker bekijken in de Azure Machine Learning-studio. om de buildlogboeken weer te geven:
    1. Selecteer het tabblad Uitvoer en logboeken.
    2. Selecteer de map azureml-logs .
    3. Selecteer 20_image_build_log.txt.
  3. Wanneer de status van de taak is voltooid, selecteert u Uitvoer en logboeken.
  4. Selecteer user_logs en std_log.txt om de uitvoer van uw taak weer te geven.
Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ../data/cifar-10-python.tar.gz
Extracting ../data/cifar-10-python.tar.gz to ../data
epoch=1, batch= 2000: loss 2.19
epoch=1, batch= 4000: loss 1.82
epoch=1, batch= 6000: loss 1.66
...
epoch=2, batch= 8000: loss 1.51
epoch=2, batch=10000: loss 1.49
epoch=2, batch=12000: loss 1.46
Finished Training

Als er een fout wordt weergegeven Your total snapshot size exceeds the limit, bevindt de gegevensmap zich in de source_directory waarde die wordt gebruikt in ScriptRunConfig.

Selecteer de ... aan het einde van de map en selecteer vervolgens Verplaatsen om gegevens naar de map Aan de slag te verplaatsen.

Metrische gegevens van training registreren

Nu u een modeltraining in Azure Machine Learning hebt, kunt u een aantal prestatiegegevens gaan bijhouden.

Met het huidige trainingsscript worden metrische gegevens naar de terminal afgedrukt. Azure Machine Learning biedt een mechanisme voor het vastleggen van metrische gegevens met meer functionaliteit. Door een paar regels code toe te voegen, krijgt u de mogelijkheid om metrische gegevens in de studio te visualiseren en metrische gegevens tussen meerdere taken te vergelijken.

Train.py wijzigen om logboekregistratie op te nemen

  1. Wijzig uw train.py script zodat er nog twee regels code worden opgenomen:

    import torch
    import torch.optim as optim
    import torchvision
    import torchvision.transforms as transforms
    from model import Net
    from azureml.core import Run
    
    
    # ADDITIONAL CODE: get run from the current context
    run = Run.get_context()
    
    # download CIFAR 10 data
    trainset = torchvision.datasets.CIFAR10(
        root='./data',
        train=True,
        download=True,
        transform=torchvision.transforms.ToTensor()
    )
    trainloader = torch.utils.data.DataLoader(
        trainset,
        batch_size=4,
        shuffle=True,
        num_workers=2
    )
    
    
    if __name__ == "__main__":
        # define convolutional network
        net = Net()
        # set up pytorch loss /  optimizer
        criterion = torch.nn.CrossEntropyLoss()
        optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
        # train the network
        for epoch in range(2):
            running_loss = 0.0
            for i, data in enumerate(trainloader, 0):
                # unpack the data
                inputs, labels = data
                # zero the parameter gradients
                optimizer.zero_grad()
                # forward + backward + optimize
                outputs = net(inputs)
                loss = criterion(outputs, labels)
                loss.backward()
                optimizer.step()
                # print statistics
                running_loss += loss.item()
                if i % 2000 == 1999:
                    loss = running_loss / 2000
                    # ADDITIONAL CODE: log loss metric to AML
                    run.log('loss', loss)
                    print(f'epoch={epoch + 1}, batch={i + 1:5}: loss {loss:.2f}')
                    running_loss = 0.0
        print('Finished Training')
    
  2. Sla dit bestand op en sluit het tabblad desgewenst.

Meer informatie over de twee extra regels code

In train.py opent u het uitvoeringsobject vanuit het trainingsscript zelf met behulp van de Run.get_context() methode en gebruikt u het om metrische gegevens te registreren:

# ADDITIONAL CODE: get run from the current context
run = Run.get_context()

...
# ADDITIONAL CODE: log loss metric to AML
run.log('loss', loss)

De metrische gegevens in Azure Machine Learning zijn:

  • Geordend op experiment en uitvoering, zodat u gemakkelijk metrische gegevens kunt bijhouden en vergelijken.
  • Voorzien van een gebruikersinterface, zodat u de trainingsprestaties in de studio kunt visualiseren.
  • Ontworpen om te worden geschaald, dus u behoudt deze voordelen, zelfs als u honderden experimenten uitvoert.

Het Conda-omgevingsbestand bijwerken

Het train.py-script heeft zojuist een nieuwe afhankelijkheid van azureml.core gekregen. Werk pytorch-env.yml bij om deze wijziging weer te geven:

name: pytorch-env
channels:
    - defaults
    - pytorch
dependencies:
    - python=3.7
    - pytorch
    - torchvision
    - pip
    - pip:
        - azureml-sdk

Zorg ervoor dat u dit bestand opslaat voordat u de uitvoering verzendt.

De uitvoering versturen naar Microsoft Azure Machine Learning

Selecteer het tabblad voor het run-pytorch.py script en selecteer vervolgens Opslaan en script uitvoeren in terminal om het run-pytorch.py script opnieuw uit te voeren. Zorg ervoor dat u de wijzigingen pytorch-env.yml eerst opslaat.

Wanneer u deze keer de studio bezoekt, gaat u naar het tabblad Metrische gegevens, waar u nu live-updates kunt zien van het modeltrainingsverlies. Het kan 1 tot 2 minuten duren voordat de training begint.

Grafiek met trainingsverlies op het tabblad Metrische gegevens.

Resources opschonen

Als u van plan bent om nu door te gaan naar een andere zelfstudie of als u uw eigen trainingstaken wilt starten, gaat u verder met gerelateerde resources.

Rekenproces stoppen

Als u deze nu niet gaat gebruiken, stopt u het rekenproces:

  1. Selecteer Compute in de studio aan de linkerkant.
  2. Selecteer op de bovenste tabbladen Rekeninstanties
  3. Selecteer het rekenproces in de lijst.
  4. Selecteer Stoppen op de bovenste werkbalk.

Alle resources 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:

  1. Voer in azure Portal in het zoekvak resourcegroepen in en selecteer deze in de resultaten.

  2. Selecteer de resourcegroep die u hebt gemaakt uit de lijst.

  3. Selecteer op de pagina Overzicht de optie Resourcegroep verwijderen.

    Schermopname van de selecties voor het verwijderen van een resourcegroep in de Azure-portal.

  4. Voer de naam van de resourcegroup in. Selecteer daarna Verwijderen.

U kunt de resourcegroep ook bewaren en slechts één werkruimte verwijderen. Bekijk de eigenschappen van de werkruimte en selecteer Verwijderen.

In deze sessie hebt u een upgrade uitgevoerd van een eenvoudig Hallo wereld-script naar een realistischer trainingsscript waarvoor een specifieke Python-omgeving moest worden uitgevoerd. U hebt gezien hoe u gecureerde Azure Machine Learning-omgevingen gebruikt. Ten slotte hebt u gezien hoe u in een paar regels code de metrische gegevens kunt vastleggen voor Azure Machine Learning.

Er zijn andere manieren om Azure Machine Learning-omgevingen te maken, zoals van een TXT-bestand met PIP-vereisten of van een bestaande lokale Conda-omgeving.