Självstudie: Träna din första maskininlärningsmodell (SDK v1, del 2 av 3)

GÄLLER FÖR:Python SDK azureml v1

Den här självstudien visar hur du tränar en maskininlärningsmodell i Azure Machine Learning. Den här självstudien är del 2 i en självstudieserie i tre delar.

I del 1: Kör "Hello world!" i serien lärde du dig att använda ett kontrollskript för att köra ett jobb i molnet.

I den här självstudien tar du nästa steg genom att skicka ett skript som tränar en maskininlärningsmodell. Det här exemplet hjälper dig att förstå hur Azure Machine Learning förenklar konsekvent beteende mellan lokal felsökning och fjärrkörningar.

I den här kursen får du:

  • Skapa ett träningsskript.
  • Använd Conda för att definiera en Azure Machine Learning-miljö.
  • Skapa ett kontrollskript.
  • Förstå Azure Machine Learning-klasser (Environment, Run, Metrics).
  • Skicka och kör träningsskriptet.
  • Visa dina kodutdata i molnet.
  • Logga mått till Azure Machine Learning.
  • Visa dina mått i molnet.

Förutsättningar

  • Slutförande av del 1 i serien.

Skapa träningsskript

Först definierar du arkitekturen för neurala nätverk i en model.py fil. All träningskod går till underkatalogen src , inklusive model.py.

Träningskoden hämtas från det här introduktionsexemplet från PyTorch. Observera att Azure Machine Learning-begreppen gäller för alla maskininlärningskoder, inte bara PyTorch.

  1. Skapa en model.py fil i undermappen src . Kopiera den här koden till filen:

    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. I verktygsfältet väljer du Spara för att spara filen. Stäng fliken om du vill.

  3. Definiera sedan träningsskriptet, även i undermappen src . Det här skriptet laddar ned CIFAR10-datauppsättningen med hjälp av PyTorch-API torchvision.dataset :er, konfigurerar nätverket som definierats i model.py och tränar den för två epoker med hjälp av standard-SGD och korsentropiförlust.

    Skapa ett train.py skript i undermappen 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. Nu har du följande mappstruktur:

    Katalogstrukturen visar train.py i underkatalogen src

Testa lokalt

Välj Spara och kör skript i terminalen för att köra train.py skriptet direkt på beräkningsinstansen.

När skriptet har slutförts väljer du Uppdatera ovanför filmapparna. Du ser den nya datamappen get-started/data Expandera den här mappen för att visa nedladdade data.

Skärmbild av mappar som visar en ny datamapp som skapats genom att filen körs lokalt.

Skapa en Python-miljö

Azure Machine Learning tillhandahåller konceptet med en miljö som representerar en reproducerbar, versionshanterad Python-miljö för att köra experiment. Det är enkelt att skapa en miljö från en lokal Conda- eller pip-miljö.

Först skapar du en fil med paketberoendena.

  1. Skapa en ny fil i mappen Komma igång med namnet pytorch-env.yml:

    name: pytorch-env
    channels:
        - defaults
        - pytorch
    dependencies:
        - python=3.7
        - pytorch
        - torchvision
    
  2. I verktygsfältet väljer du Spara för att spara filen. Stäng fliken om du vill.

Skapa kontrollskriptet

Skillnaden mellan följande kontrollskript och det som du använde för att skicka "Hello world!" är att du lägger till några extra rader för att ange miljön.

Skapa en ny Python-fil i mappen Komma igång med namnet run-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)

Tips

Om du använde ett annat namn när du skapade beräkningsklustret måste du även justera namnet i koden compute_target='cpu-cluster' .

Förstå kodändringarna

env = ...

Refererar till den beroendefil som du skapade ovan.

config.run_config.environment = env

Lägger till miljön i ScriptRunConfig.

Skicka körningen till Azure Machine Learning

  1. Välj Spara och kör skript i terminalen för att köra run-pytorch.py skriptet.

  2. Du ser en länk i terminalfönstret som öppnas. Välj länken för att visa jobbet.

    Anteckning

    Du kan se några varningar som börjar med Fel vid inläsning av azureml_run_type_providers.... Du kan ignorera dessa varningar. Använd länken längst ned i dessa varningar för att visa dina utdata.

Visa utdata

  1. På sidan som öppnas visas jobbstatusen. Första gången du kör det här skriptet skapar Azure Machine Learning en ny Docker-avbildning från PyTorch-miljön. Hela jobbet kan ta cirka 10 minuter att slutföra. Den här avbildningen återanvänds i framtida jobb så att de körs mycket snabbare.
  2. Du kan visa Docker-byggloggar i Azure Machine Learning-studio. Välj fliken Utdata + loggar och välj sedan 20_image_build_log.txt.
  3. När jobbets status är Slutförd väljer du Utdata + loggar.
  4. Välj std_log.txt för att visa utdata för jobbet.
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

Om du ser ett fel Your total snapshot size exceeds the limitfinns datamappen i värdet source_directory som används i ScriptRunConfig.

Välj ... i slutet av mappen och välj sedan Flytta för att flytta data till mappen Komma igång .

Träningsmått för loggar

Nu när du har en modellutbildning i Azure Machine Learning börjar du spåra vissa prestandamått.

Det aktuella träningsskriptet skriver ut mått till terminalen. Azure Machine Learning tillhandahåller en mekanism för loggning av mått med fler funktioner. Genom att lägga till några rader kod får du möjlighet att visualisera mått i studion och jämföra mått mellan flera jobb.

Ändra train.py för att inkludera loggning

  1. Ändra ditt train.py skript så att det innehåller ytterligare två kodrader:

    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. Spara den här filen och stäng sedan fliken om du vill.

Förstå de ytterligare två kodraderna

I train.py kommer du åt körningsobjektet från själva träningsskriptet Run.get_context() med hjälp av metoden och använder den för att logga mått:

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

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

Mått i Azure Machine Learning är:

  • Ordnas efter experiment och körning, så det är enkelt att hålla reda på och jämföra mått.
  • Utrustad med ett användargränssnitt så att du kan visualisera träningsprestanda i studion.
  • Utformad för att skala, så att du behåller dessa fördelar även när du kör hundratals experiment.

Uppdatera Conda-miljöfilen

Skriptet train.py tog just ett nytt beroende av azureml.core. Uppdatera pytorch-env.yml för att återspegla den här ändringen:

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

Se till att spara filen innan du skickar körningen.

Skicka körningen till Azure Machine Learning

Välj fliken för run-pytorch.py skriptet och välj sedan Spara och kör skript i terminalen för att köra run-pytorch.py skriptet igen. Kontrollera att du har sparat ändringarna till pytorch-env.yml först.

Den här gången när du besöker studion går du till fliken Mått där du nu kan se liveuppdateringar om modellträningsförlusten! Det kan ta 1 till 2 minuter innan träningen börjar.

Diagram över träningsförlust på fliken Mått.

Nästa steg

I den här sessionen har du uppgraderat från ett grundläggande "Hello World!"-skript till ett mer realistiskt träningsskript som krävde att en specifik Python-miljö kördes. Du såg hur du använder organiserade Azure Machine Learning-miljöer. Slutligen såg du hur du i några rader med kod kan logga mått till Azure Machine Learning.

Det finns andra sätt att skapa Azure Machine Learning-miljöer, till exempel från en pip-requirements.txt fil eller från en befintlig lokal Conda-miljö.

I nästa session får du se hur du arbetar med data i Azure Machine Learning genom att ladda upp CIFAR10-datauppsättningen till Azure.

Anteckning

Kom ihåg att rensa dina resurser om du vill slutföra självstudieserien här och inte gå vidare till nästa steg.