共用方式為


教學課程:上傳資料並定型模型 (SDK v1,第 3 部分,共 3 部分)

適用於:Python SDK azureml v1

本教學課程會示範如何上傳和使用您自己的資料,以在 Azure Machine Learning 中訓練機器學習模型。 本教學課程是三部分教學課程系列的第 3 部分

第 2 部分:定型模型中,您使用 PyTorch 的樣本資料,在雲端中定型模型。 您也會在 PyTorch API 中,透過 torchvision.datasets.CIFAR10 方法來下載該資料。 在本教學課程中,您將使用下載的資料來學習工作流程,以在 Azure Machine Learning 中使用您自己的資料。

在本教學課程中,您:

  • 將資料上傳至 Azure。
  • 建立控制指令碼。
  • 了解新的 Azure Machine Learning 概念 (傳遞參數、資料集、資料存放區)。
  • 提交並執行您的訓練指令碼。
  • 在雲端中檢視程式碼輸出。

必要條件

您將需要先前教學課程中下載的資料。 確定您已完成這些步驟:

  1. 建立訓練指令碼
  2. 本機測試

調整訓練指令碼

現在,Azure Machine Learning 中有執行中的定型指令碼 (get-started/src/train.py),而且您可以監視模型效能。 讓我們藉由引進引數來將訓練指令碼參數化。 使用引數可讓您輕鬆比較不同的超參數。

我們的定型指令碼目前設定為每次執行時下載 CIFAR10 資料集。 下列 Python 程式碼已調整為從目錄讀取資料。

注意

使用 argparse 參數化指令碼。

  1. 開啟 train.py,並將其取代為此程式碼:

    import os
    import argparse
    import torch
    import torch.optim as optim
    import torchvision
    import torchvision.transforms as transforms
    from model import Net
    from azureml.core import Run
    run = Run.get_context()
    if __name__ == "__main__":
        parser = argparse.ArgumentParser()
        parser.add_argument(
            '--data_path',
            type=str,
            help='Path to the training data'
        )
        parser.add_argument(
            '--learning_rate',
            type=float,
            default=0.001,
            help='Learning rate for SGD'
        )
        parser.add_argument(
            '--momentum',
            type=float,
            default=0.9,
            help='Momentum for SGD'
        )
        args = parser.parse_args()
        print("===== DATA =====")
        print("DATA PATH: " + args.data_path)
        print("LIST FILES IN DATA PATH...")
        print(os.listdir(args.data_path))
        print("================")
        # prepare DataLoader for CIFAR10 data
        transform = transforms.Compose([
            transforms.ToTensor(),
            transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
        ])
        trainset = torchvision.datasets.CIFAR10(
            root=args.data_path,
            train=True,
            download=False,
            transform=transform,
        )
        trainloader = torch.utils.data.DataLoader(
            trainset,
            batch_size=4,
            shuffle=True,
            num_workers=2
        )
        # define convolutional network
        net = Net()
        # set up pytorch loss /  optimizer
        criterion = torch.nn.CrossEntropyLoss()
        optimizer = optim.SGD(
            net.parameters(),
            lr=args.learning_rate,
            momentum=args.momentum,
        )
        # 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
                    run.log('loss', loss)  # log loss metric to AML
                    print(f'epoch={epoch + 1}, batch={i + 1:5}: loss {loss:.2f}')
                    running_loss = 0.0
        print('Finished Training')
    
  2. 儲存檔案。 如果有需要,請關閉索引標籤。

了解程式碼變更

train.py 中的程式碼已使用 argparse 程式庫來設定 data_pathlearning_ratemomentum

# .... other code
parser = argparse.ArgumentParser()
parser.add_argument('--data_path', type=str, help='Path to the training data')
parser.add_argument('--learning_rate', type=float, default=0.001, help='Learning rate for SGD')
parser.add_argument('--momentum', type=float, default=0.9, help='Momentum for SGD')
args = parser.parse_args()
# ... other code

此外,train.py 指令碼已經過調整,可更新最佳化工具來使用使用者定義的參數:

optimizer = optim.SGD(
    net.parameters(),
    lr=args.learning_rate,     # get learning rate from command-line argument
    momentum=args.momentum,    # get momentum from command-line argument
)

將資料上傳至 Azure

若要在 Azure Machine Learning 中執行此指令碼,您必須讓您的訓練資料可在 Azure 中使用。 您的 Azure Machine Learning 工作區配備「預設」 資料存放區。 這是您可以用來儲存訓練資料的 Azure Blob 儲存體帳戶。

注意

Azure Machine Learning 可讓您連結其他雲端式資料存放區來儲存您的資料。 如需詳細資訊,請參閱資料存放區文件

  1. 在 [get-started] 資料夾中,建立新的 Python 控制指令碼 (請確定它是在 [get-started] 中,而不是在 [/src] 資料夾中)。 命名指令碼 upload-data.py,並將此程式碼複製到檔案:

    # upload-data.py
    from azureml.core import Workspace
    from azureml.core import Dataset
    from azureml.data.datapath import DataPath
    
    ws = Workspace.from_config()
    datastore = ws.get_default_datastore()
    Dataset.File.upload_directory(src_dir='data', 
                                  target=DataPath(datastore, "datasets/cifar10")
                                 )  
    

    target_path 值會指定資料存放區上用來上傳 CIFAR10 資料的路徑。

    提示

    雖然您使用 Azure Machine Learning 來上傳資料,但您可以使用 Azure 儲存體總管來上傳特定檔案。 如果您需要 ETL 工具,可以使用 Azure Data Factory 將您的資料內嵌到 Azure 中。

  2. 選取 [儲存並在終端機中執行指令碼],以執行 upload-data.py 指令碼。

    您應該會看到下列標準輸出:

    Uploading ./data\cifar-10-batches-py\data_batch_2
    Uploaded ./data\cifar-10-batches-py\data_batch_2, 4 files out of an estimated total of 9
    .
    .
    Uploading ./data\cifar-10-batches-py\data_batch_5
    Uploaded ./data\cifar-10-batches-py\data_batch_5, 9 files out of an estimated total of 9
    Uploaded 9 files
    

建立控制指令碼

如同您先前所做的,在 [get-started] 資料夾中,建立名為 run-pytorch-data.py 的新 Python 控制指令碼:

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

if __name__ == "__main__":
    ws = Workspace.from_config()
    datastore = ws.get_default_datastore()
    dataset = Dataset.File.from_files(path=(datastore, 'datasets/cifar10'))

    experiment = Experiment(workspace=ws, name='day1-experiment-data')

    config = ScriptRunConfig(
        source_directory='./src',
        script='train.py',
        compute_target='cpu-cluster',
        arguments=[
            '--data_path', dataset.as_named_input('input').as_mount(),
            '--learning_rate', 0.003,
            '--momentum', 0.92],
    )

    # 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("Submitted to compute cluster. Click link below")
    print("")
    print(aml_url)

提示

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

了解程式碼變更

控制指令碼類似於此系列第 3 部分的指令碼,但新增了下列幾行:

dataset = Dataset.File.from_files( ... )

資料集會用來參考您上傳至 Azure Blob 儲存體的資料。 資料集是在您資料之上的抽象層,其設計目的是為了改善可靠性和可信度。

config = ScriptRunConfig(...)

ScriptRunConfig 已修改為包含將傳遞至 train.py 的引數清單。 dataset.as_named_input('input').as_mount() 引數表示指定的目錄將會「掛接」至計算目標。

提交回合至 Azure Machine Learning

選取 [儲存並在終端機中執行指令碼],以執行 run-pytorch-data.py 指令碼。 此執行將會使用您上傳的資料,在計算叢集上定型模型。

此程式碼會在 Azure Machine Learning Studio 中列印實驗的 URL。 如果您移至該連結,就能夠看到您的程式碼正在執行。

注意

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

檢查記錄檔

在 Studio 中,移至實驗作業 (藉由選取先前的 URL 輸出),後面接著 [輸出 + 記錄]。 選取 std_log.txt 檔案。 在記錄檔中向下捲動,直到您看見下列輸出:

Processing 'input'.
Processing dataset FileDataset
{
  "source": [
    "('workspaceblobstore', 'datasets/cifar10')"
  ],
  "definition": [
    "GetDatastoreFiles"
  ],
  "registration": {
    "id": "XXXXX",
    "name": null,
    "version": null,
    "workspace": "Workspace.create(name='XXXX', subscription_id='XXXX', resource_group='X')"
  }
}
Mounting input to /tmp/tmp9kituvp3.
Mounted input to /tmp/tmp9kituvp3 as folder.
Exit __enter__ of DatasetContextManager
Entering Job History Context Manager.
Current directory:  /mnt/batch/tasks/shared/LS_root/jobs/dsvm-aml/azureml/tutorial-session-3_1600171983_763c5381/mounts/workspaceblobstore/azureml/tutorial-session-3_1600171983_763c5381
Preparing to call script [ train.py ] with arguments: ['--data_path', '$input', '--learning_rate', '0.003', '--momentum', '0.92']
After variable expansion, calling script [ train.py ] with arguments: ['--data_path', '/tmp/tmp9kituvp3', '--learning_rate', '0.003', '--momentum', '0.92']

Script type = None
===== DATA =====
DATA PATH: /tmp/tmp9kituvp3
LIST FILES IN DATA PATH...
['cifar-10-batches-py', 'cifar-10-python.tar.gz']

注意:

  • Azure Machine Learning 已自動為您將 Blob 儲存體掛接到計算叢集。
  • 控制指令碼中使用的 dataset.as_named_input('input').as_mount() 會解析為掛接點。

清除資源

如果您打算繼續進行另一個教學課程,或開始自己的定型作業,請跳至下一個步驟

停止計算執行個體

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

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

刪除所有資源

重要

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

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

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

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

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

    在 Azure 入口網站中刪除資源群組選項的螢幕擷取畫面。

  4. 輸入資源群組名稱。 然後選取 [刪除]。

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

後續步驟

在本教學課程中,我們已了解如何使用 Datastore 將資料上傳至 Azure。 資料存放區會作為您工作區的雲端儲存體,提供您持久且彈性的位置來保存資料。

您已了解如何修改您的訓練指令碼,以透過命令列接受資料路徑。 藉由使用 Dataset,您已能夠將目錄掛接至遠端作業。

現在您已有了模型,接著請了解: