Share via


教學課程:將您的第一個機器學習模型 (SDK v1,3 部分之中的第 2 部分) 定型

適用於:Python SDK azureml 第 1 版

本教學課程說明如何在 Azure Machine Learning 中定型機器學習模型。 此教學課程是三個部分教學課程系列的第 2 個部分

在系列的第 1 個部分:執行 "Hello world!" 時,您已了解如何使用控制指令碼在雲端中執行作業。

在本教學課程中,您會透過提交可定型機器學習模型的指令碼來進行下一步。 此範例將協助您了解 Azure Machine Learning 如何在本機偵錯和遠端執行之間,輕鬆地達成一致的行為。

在本教學課程中,您:

  • 建立定型指令碼。
  • 使用 Conda 來定義 Azure Machine Learning 環境。
  • 建立控制指令碼。
  • 了解 Azure Machine Learning 類別 (EnvironmentRunMetrics)。
  • 提交並執行您的訓練指令碼。
  • 在雲端中檢視程式碼輸出。
  • 將計量記錄到 Azure Machine Learning。
  • 在雲端中檢視您的計量。

Prerequisites

建立定型指令碼

首先,您會在 model.py 檔案中定義神經網路架構。 您的所有定型程式碼都會進入 src 子目錄,包括 model.py

定型程式碼取自 PyTorch 的此簡介範例。 請注意,Azure Machine Learning 的概念適用於任何機器學習服務程式碼,而不只是 PyTorch。

  1. src 子資料夾中建立 model.py 檔案。 將此程式碼複製到檔案:

    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. 在工具列上,選取 [儲存] 以儲存檔案。 如果想要,請關閉索引標籤。

  3. 接下來,也在 src 子資料夾中定義定型指令碼。 此指令碼會使用 PyTorch torchvision.dataset API 來下載 CIFAR10 資料集、設定 model.py 中定義的網路,以及使用標準 SGD 和交叉熵損失,針對兩個 epoch 來進行定型。

    src 子資料夾中建立 train.py 指令碼:

    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. 您現在有下列資料夾結構:

    在 src 子目錄顯示 train.py 的目錄結構

本機測試

選取 [儲存並在終端機中執行指令碼],直接在計算執行個體上執行 train.py 指令碼。

指令碼完成後,請選取檔案資料夾上方的 [重新整理]。 您會看到名為 get-started/data 的新資料夾。展開此資料夾,以檢視下載的資料。

此資料夾的螢幕擷取畫面顯示在本機執行檔案建立的新資料夾。

建立 Python 環境

Azure Machine Learning 提供環境概念來代表可重現且已建立版本的 Python 環境,用於執行實驗。 從本機 Conda 或 pip 環境中建立環境很容易。

首先,您將建立具有套件相依性的檔案。

  1. get-started 資料夾中建立名為 pytorch-env.yml 的新檔案:

    name: pytorch-env
    channels:
        - defaults
        - pytorch
    dependencies:
        - python=3.7
        - pytorch
        - torchvision
    
  2. 在工具列上,選取 [儲存] 以儲存檔案。 如果想要,請關閉索引標籤。

建立控制項指令碼

下列控制指令碼與您用來提交 "Hello world!" 的控制之間的差異在於,您可以新增幾行額外的程式碼來設定環境。

get-started 資料夾中建立名為 run-pytorch.py 的新 Python 檔案:

# 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)

提示

如果您在建立計算叢集時使用不同的名稱,請務必同時調整程式碼 compute_target='cpu-cluster' 中的名稱。

了解程式碼變更

env = ...

參考您在上面建立的相依性檔案。

config.run_config.environment = env

將環境新增至 ScriptRunConfig

提交執行至 Azure Machine Learning

  1. 選取 [儲存並在終端機中執行指令碼] 以執行 run-pytorch.py 指令碼。

  2. 您會在開啟的終端機視窗中看到連結。 請選取該連結以檢視作業。

    注意

    您可能會看到開頭為載入 azureml_run_type_providers 時失敗... 的一些警告。您可以忽略這些警告。 使用這些警告底部的連結來檢視您的輸出。

檢視輸出

  1. 在開啟的分頁上,您會看到作業狀態。 第一次執行此指令碼時,Azure Machine Learning 會從您的 PyTorch 環境中建立新的 Docker 映像。 整個作業可能需要約 10 分鐘才能完成。 此映像將在未來作業中重複使用,因此執行速度會變得更快。
  2. 您可以在 Azure Machine Learning 工作室中檢視 Docker 組建記錄檔。 選取 [輸出 + 記錄] 索引標籤,然後選取 20_image_build_log.txt
  3. 當作業狀態為 [已完成] 時,請選取 [輸出 + 記錄]。
  4. 請選取 [std_log.txt] 以檢視作業的輸出。
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

如果您看到錯誤 Your total snapshot size exceeds the limit,表示 data 目錄位於 ScriptRunConfig 所使用的 source_directory 值中。

選取資料夾結尾的 ...,然後選取 [移動] 以將 data 移至 get-started 資料夾。

記錄定型計量

現在,您已在 Azure Machine Learning 中進行模型定型,接著您可以開始追蹤一些效能計量。

目前的定型指令碼會將計量列印到終端機。 Azure Machine Learning 提供一種機制來記錄具有更多功能的計量。 加入幾行程式碼,您就能將 Studio 中的計量視覺化,並將多項作業間的計量進行比較。

修改 train.py 以包含記錄

  1. 修改您的 train.py 指令碼,使其再多包含兩行程式碼:

    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. 儲存此檔案,然後視需要關閉該索引標籤。

了解額外的兩行程式碼

train.py 中,您可以使用 Run.get_context() 方法,在定型指令碼本身存取執行物件,並用其來記錄計量:

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

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

Azure Machine Learning 中的計量有以下特點:

  • 透過實驗和執行進行整理,讓您可以輕鬆地追蹤和比較計量。
  • 搭配 UI,讓您可以在 Studio 中將定型效能視覺化。
  • 專為擴充而設計,因此您可以在執行數百個實驗後,依然保有這些優點。

更新 Conda 環境檔案

train.py 指令碼只會在 azureml.core 上採用新的相依性。 更新 pytorch-env.yml 以反映這種變更:

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

提交執行之前,請務必儲存此檔案。

提交執行至 Azure Machine Learning

選取 run-pytorch.py 指令碼的索引標籤,然後選取 [儲存並在終端機中執行指令碼],以重新執行 run-pytorch.py 指令碼。 請確定您已先將變更儲存至 pytorch-env.yml

這次當您造訪 Studio 時,請移至 [計量] 索引標籤,您現在可以在此查看模型定型損失的即時更新! 可能需要 1 到 2 分鐘的時間,定型才會開始。

[計量] 索引標籤上的訓練損失圖形。

後續步驟

在此課程中,您已從基本的 "Hello world!" 指令碼升級為需要特定 Python 環境才能執行的更實際定型指令碼。 您已了解如何使用策展 Azure Machine Learning 環境。 最後,您已了解如何透過幾行程式碼,將計量記錄到 Azure Machine Learning。

還有其他方法可以建立 Azure Machine Learning 環境,包括從 pip requirements.txt,或從現有的本機 Conda 環境

在下一個課程中,您將了解如何將 CIFAR10 資料集上傳至 Azure,以使用 Azure Machine Learning 中的資料。

注意

如果您想要在此完成教學課程系列,而不是前往下一個步驟,請記得清除您的資源