チュートリアル:初めての機械学習モデルをトレーニングする (パート 3/4)Tutorial: Train your first machine learning model (part 3 of 4)

このチュートリアルでは、Azure Machine Learning で機械学習モデルをトレーニングする方法について説明します。This tutorial shows you how to train a machine learning model in Azure Machine Learning.

このチュートリアルは、"4 部構成のチュートリアル シリーズのパート 3 " であり、Azure Machine Learning の基礎を学習し、Azure でジョブベースの機械学習タスクを実行します。This tutorial is part 3 of a four-part tutorial series in which you learn the fundamentals of Azure Machine Learning and complete jobs-based machine learning tasks in Azure. このチュートリアルは次のパートで完了した作業を基にしています。このシリーズの第 1 部: 設定第 2 部:"Hello world!" の実行This tutorial builds on the work that you completed in Part 1: Set up and Part 2: Run "Hello world!" です。of the series.

このチュートリアルでは、機械学習モデルをトレーニングするスクリプトを送信して、次のステップに進みます。In this tutorial, you take the next step by submitting a script that trains a machine learning model. この例は、Azure Machine Learning を使用することで、ローカル デバッグとリモート実行との間で一貫した動作がどのように容易になるかを理解するのに役立ちます。This example will help you understand how Azure Machine Learning eases consistent behavior between local debugging and remote runs.

このチュートリアルでは、次の作業を行いました。In this tutorial, you:

  • トレーニング スクリプトを作成します。Create a training script.
  • Conda を使用して Azure Machine Learning 環境を定義する。Use Conda to define an Azure Machine Learning environment.
  • コントロール スクリプトを作成する。Create a control script.
  • Azure Machine Learning クラス (EnvironmentRunMetrics) について理解する。Understand Azure Machine Learning classes (Environment, Run, Metrics).
  • トレーニング スクリプトを送信して実行する。Submit and run your training script.
  • クラウドでのコード出力を表示する。View your code output in the cloud.
  • メトリックを Azure Machine Learning にログする。Log metrics to Azure Machine Learning.
  • クラウドのメトリックを表示する。View your metrics in the cloud.

前提条件Prerequisites

  • Python の仮想環境を管理してパッケージをインストールするための Anaconda または MinicondaAnaconda or Miniconda to manage Python virtual environments and install packages.
  • このシリーズの第 1 部第 2 部を完了している。Completion of part1 and part 2 of the series.

トレーニング スクリプトを作成するCreate training scripts

まず、model.py ファイルでニューラル ネットワーク アーキテクチャを定義します。First you define the neural network architecture in a model.py file. すべてのトレーニング コードは、src サブディレクトリ (model.py を含む) に入ります。All your training code will go into the src subdirectory, including model.py.

次のコードは、PyTorch のこの入門の例からの抜粋です。The following code is taken from this introductory example from PyTorch. Azure Machine Learning の概念は、PyTorch だけでなく、機械学習コードにも適用されることに注意してください。Note that the Azure Machine Learning concepts apply to any machine learning code, not just PyTorch.

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

次に、トレーニング スクリプトを定義します。Next you define the training script. このスクリプトは、PyTorch torchvision.dataset API を使用して CIFAR10 データセットをダウンロードし、model.py で定義されているネットワークを設定して、標準の SGD とクロスエントロピ損失を使用して 2 つのエポックに対してトレーニングを行います。This script downloads the CIFAR10 dataset by using PyTorch torchvision.dataset APIs, sets up the network defined in model.py, and trains it for two epochs by using standard SGD and cross-entropy loss.

src サブディレクトリに train.py スクリプトを作成します。Create a train.py script in the src subdirectory:

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

これで、次のディレクトリ構造ができました。You now have the following directory structure:

tutorial
└──.azureml
|  └──config.json
└──src
|  └──hello.py
|  └──model.py
|  └──train.py
└──01-create-workspace.py
└──02-create-compute.py
└──03-run-hello.py

新しい Python 環境を作成するCreate a new Python environment

隠しディレクトリ .azuremlpytorch-env.yml という名前のファイルを作成します。Create a file called pytorch-env.yml in the .azureml hidden directory:


name: pytorch-env
channels:
    - defaults
    - pytorch
dependencies:
    - python=3.6.2
    - pytorch
    - torchvision

この環境には、モデルとトレーニング スクリプトに必要なすべての依存関係があります。This environment has all the dependencies that your model and training script require. Azure Machine Learning SDK for Python には依存関係がないことに注意してください。Notice there's no dependency on the Azure Machine Learning SDK for Python.

ローカルでテストするTest locally

ターミナルまたは Anaconda プロンプト ウィンドウから次のコードを使用して、新しい環境のローカルでスクリプトをテストします。In a terminal or Anaconda Prompt window, use the following code to test your script locally in the new environment.

conda deactivate                                # If you are still using the tutorial environment, exit it
conda env create -f .azureml/pytorch-env.yml    # create the new Conda environment
conda activate pytorch-env                      # activate new Conda environment
python src/train.py                             # train model

このスクリプトを実行すると、tutorial/data という名前のディレクトリにダウンロードされたデータが表示されます。After you run this script, you'll see the data downloaded into a directory called tutorial/data.

コントロール スクリプトを作成するCreate the control script

下のコントロール スクリプトと "Hello World" の送信に使用したコントロール スクリプトとの違いは、環境を設定するための行をいくつか追加することです。The difference between the following control script and the one that you used to submit "Hello world!" is that you add a couple of extra lines to set the environment.

tutorial ディレクトリに 04-run-pytorch.py という名前の新しい Python ファイルを作成します。Create a new Python file in the tutorial directory called 04-run-pytorch.py:

# 04-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='./.azureml/pytorch-env.yml'
    )
    config.run_config.environment = env

    run = experiment.submit(config)

    aml_url = run.get_portal_url()
    print(aml_url)

コードの変更を理解するUnderstand the code changes

env = ...

Azure Machine Learning では、実験を実行するための、再現可能でバージョン管理された Python 環境を表す環境の概念が提供されます。Azure Machine Learning provides the concept of an environment to represent a reproducible, versioned Python environment for running experiments. ローカルの Conda 環境または pip 環境から環境を簡単に作成できます。It's easy to create an environment from a local Conda or pip environment.

config.run_config.environment = env

ScriptRunConfig に環境を追加します。Adds the environment to ScriptRunConfig.

Azure Machine Learning に実行を送信するSubmit the run to Azure Machine Learning

Azure Machine Learning SDK for Python がインストールされている tutorial 環境に再び切り替えてください。Switch back to the tutorial environment that has the Azure Machine Learning SDK for Python installed. トレーニング コードが自分のコンピューターで実行されるわけではないので、PyTorch をインストールする必要はありません。Since the training code isn't running on your computer, you don't need to have PyTorch installed. ただし、tutorial 環境に含まれている azureml-sdk は必要です。But you do need the azureml-sdk, which is in the tutorial environment.

conda deactivate
conda activate tutorial
python 04-run-pytorch.py

注意

このスクリプトを初めて実行すると、Azure Machine Learning によって PyTorch 環境から新しい Docker イメージが構築されます。The first time you run this script, Azure Machine Learning will build a new Docker image from your PyTorch environment. 実行全体が完了するまでに 5 分から 10 分かかることがあります。The whole run might take 5 to 10 minutes to complete.

Docker ビルド ログは、Azure Machine Learning スタジオで確認できます。You can see the Docker build logs in the Azure Machine Learning studio. リンクをたどってスタジオにアクセスし、 [出力 + ログ] タブを選択して、20_image_build_log.txt を選択します。Follow the link to the studio, select the Outputs + logs tab, and then select 20_image_build_log.txt.

このイメージは、今後の実行で再利用され、実行がさらに高速化されます。This image will be reused in future runs to make them run much quicker.

イメージがビルドされたら、70_driver_log.txt を選択してトレーニング スクリプトの出力を表示します。After your image is built, select 70_driver_log.txt to see the output of your training script.

Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz
...
Files already downloaded and verified
epoch=1, batch= 2000: loss 2.19
epoch=1, batch= 4000: loss 1.82
epoch=1, batch= 6000: loss 1.66
epoch=1, batch= 8000: loss 1.58
epoch=1, batch=10000: loss 1.52
epoch=1, batch=12000: loss 1.47
epoch=2, batch= 2000: loss 1.39
epoch=2, batch= 4000: loss 1.38
epoch=2, batch= 6000: loss 1.37
epoch=2, batch= 8000: loss 1.33
epoch=2, batch=10000: loss 1.31
epoch=2, batch=12000: loss 1.27
Finished Training

警告

"Your total snapshot size exceeds the limit" というエラーが表示された場合、ScriptRunConfig で使用されている値 source_directorydata ディレクトリが存在します。If you see an error Your total snapshot size exceeds the limit, the data directory is located in the source_directory value used in ScriptRunConfig.

datasrc の外に移動してください。Move data outside src.

環境は env.register(ws) を使用してワークスペースに登録できます。Environments can be registered to a workspace with env.register(ws). そのため、共有、再利用、バージョン管理が簡単にできます。They can then be easily shared, reused, and versioned. 環境を使用すると、以前の結果の再現や、チームとの共同作業が容易に行えます。Environments make it easy to reproduce previous results and to collaborate with your team.

Azure Machine Learning では、キュレーションされた環境のコレクションも保持されます。Azure Machine Learning also maintains a collection of curated environments. これらの環境は、一般的な機械学習のシナリオを対象とし、キャッシュされた Docker イメージによってサポートされています。These environments cover common machine learning scenarios and are backed by cached Docker images. キャッシュされた Docker イメージによって、最初のリモート実行が高速になります。Cached Docker images make the first remote run faster.

つまり、登録済み環境を使用すると時間を節約できます。In short, using registered environments can save you time! 詳細については、環境の使用方法に関するページを参照してください。Read How to use environments for more information.

トレーニング メトリックをログするLog training metrics

これで Azure Machine Learning でのモデル トレーニングが完了したので、いくつかのパフォーマンス メトリックの追跡を開始します。Now that you have a model training in Azure Machine Learning, start tracking some performance metrics.

現在のトレーニング スクリプトは、メトリックをターミナルに出力します。The current training script prints metrics to the terminal. Azure Machine Learning には、より多くの機能を備えたメトリックをログするためのメカニズムが用意されています。Azure Machine Learning provides a mechanism for logging metrics with more functionality. 数行のコードを追加することで、スタジオでメトリックを視覚化したり、複数の実行間でメトリックを比較したりできるようになります。By adding a few lines of code, you gain the ability to visualize metrics in the studio and to compare metrics between multiple runs.

ログを含めるように train.py を変更するModify train.py to include logging

train.py スクリプトを変更して、2 行のコードを追加します。Modify your train.py script to include two more lines of code:

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 AML 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 行のコードを理解するUnderstand the additional two lines of code

train.py で、Run.get_context() メソッドを使用してトレーニング スクリプト自体の "内部" から実行オブジェクトにアクセスし、それを使用してメトリックをログします。In train.py, you access the run object from within the training script itself by using the Run.get_context() method and use it to log metrics:

# in train.py
run = Run.get_context()

...

run.log('loss', loss)

Azure Machine Learning のメトリックは次のとおりです。Metrics in Azure Machine Learning are:

  • 実験ごとに整理されて実行されるため、メトリックの追跡と比較が簡単です。Organized by experiment and run, so it's easy to keep track of and compare metrics.
  • UI を備えているため、スタジオでトレーニングのパフォーマンスを視覚化できます。Equipped with a UI so you can visualize training performance in the studio.
  • スケーリングするように設計されているため、数百回の実験を実行してもこれらのベネフィットを維持できます。Designed to scale, so you keep these benefits even as you run hundreds of experiments.

Conda 環境ファイルを更新するUpdate the Conda environment file

train.py スクリプトにより、azureml.core に対して新しい依存関係が作成されました。The train.py script just took a new dependency on azureml.core. この変更を反映するように pytorch-env.yml を更新します。Update pytorch-env.yml to reflect this change:

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

Azure Machine Learning に実行を送信するSubmit the run to Azure Machine Learning

このスクリプトをもう一度送信します。Submit this script once more:

python 04-run-pytorch.py

今回は、スタジオにアクセスしたら、 [メトリック] タブに移動します。このタブで、モデル トレーニングの損失に関するライブ更新を確認できます。This time when you visit the studio, go to the Metrics tab where you can now see live updates on the model training loss!

[メトリック] タブのトレーニング損失グラフ

次の手順Next steps

このセッションでは、基本的な "Hello world!" スクリプトから、In this session, you upgraded from a basic "Hello world!" 特定の Python 環境を実行する必要がある、より現実的なトレーニング スクリプトにアップグレードしました。script to a more realistic training script that required a specific Python environment to run. Azure Machine Learning 環境を使用してローカルの Conda 環境をクラウドに移動する方法を確認しました。You saw how to take a local Conda environment to the cloud with Azure Machine Learning environments. 最後に、数行のコードでメトリックを Azure Machine Learning にログする方法を確認しました。Finally, you saw how in a few lines of code you can log metrics to Azure Machine Learning.

Azure Machine Learning 環境を作成する方法は他にもあります。たとえば、pip requirements.txt ファイルから、または既存のローカル Conda 環境から作成することができます。There are other ways to create Azure Machine Learning environments, including from a pip requirements.txt file or from an existing local Conda environment.

次のセッションでは、CIFAR10 データセットを Azure にアップロードして Azure Machine Learning のデータを操作する方法について説明します。In the next session, you'll see how to work with data in Azure Machine Learning by uploading the CIFAR10 dataset to Azure.

注意

チュートリアル シリーズをここで終了し、次の手順に進まない場合は、必ずリソースをクリーンアップしてください。If you want to finish the tutorial series here and not progress to the next step, remember to clean up your resources.