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

適用於:Python SDK azureml v1

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

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

在本教學課程中,您會透過提交可訓練機器學習模型的指令碼來進行下一步。 此範例可協助您瞭解 Azure 機器學習 如何簡化本機偵錯與遠端執行之間的一致行為。

在本教學課程中,您已:

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

必要條件

建立訓練指令碼

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

定型程式碼取自 PyTorch 的此簡介範例。 Azure 機器學習 概念適用於任何機器學習程序代碼,而不只是 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. 您會在開啟的終端機視窗中看到連結。 選取連結以檢視作業。

    注意

    您可能會看到開頭為 Failure while loading azureml_run_type_providers... 的警告。您可以忽略這些警告。 使用這些警告底部的連結來檢視您的輸出。

檢視輸出

  1. 在開啟的頁面中,您會看到作業狀態。 第一次執行此腳本時,Azure 機器學習 會從 PyTorch 環境建置新的 Docker 映射。 整個作業可能需要約 10 分鐘才能完成。 此映像將在未來作業中重複使用,因此執行速度會變得更快。
  2. 您可以在 Azure Machine Learning 工作室中檢視 Docker 組建記錄檔。 若要檢視組建記錄:
    1. 選取 [輸出 + 記錄] 索引標籤。
    2. 選取 azureml-logs 資料夾。
    3. 選取 [20_image_build_log.txt]。
  3. 當作業狀態為 [已完成] 時,請選取 [輸出 + 記錄]
  4. 選取 [user_logs],然後 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 分鐘的時間,定型才會開始。

[計量] 索引標籤上的定型遺失圖表。

清除資源

如果您打算立即繼續進行另一個教學課程,或開始自己的訓練作業,請跳至 [相關資源]。

停止計算執行個體

如果現在不打算使用,請停止計算執行個體:

  1. 在工作室的左側,選取 [計算]
  2. 在頂端索引標籤中,選取 [計算執行個體]
  3. 選取清單中的計算執行個體。
  4. 在頂端工具列中,選取 [停止]

刪除所有資源

重要

您所建立的資源可用來作為其他 Azure Machine Learning 教學課程和操作說明文章的先決條件。

如果不打算使用您建立的任何資源,請刪除以免產生任何費用:

  1. 在 Azure 入口網站中,選取最左邊的 [資源群組]

  2. 從清單中,選取您所建立的資源群組。

  3. 選取 [刪除資源群組]

    要刪除 Azure 入口網站 中資源群組之選取項目的螢幕快照。

  4. 輸入資源群組名稱。 接著選取刪除

您也可以保留資源群組,但刪除單一工作區。 顯示工作區屬性,然後選取 [刪除]

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

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