Azure Machine Learning SDK (v1) を使用して PyTorch モデルを大規模にトレーニングする

適用対象:Python SDK azureml v1

この記事では、Azure Machine Learning を使用して、PyTorch トレーニング スクリプトをエンタープライズ規模で実行する方法について説明します。

この記事のサンプル スクリプトは、PyTorch の転移学習チュートリアルに基づいてニワトリと七面鳥の画像を分類し、ディープ ラーニング ニューラル ネットワーク (DNN) を構築するために使用されます。 転移学習は、ある問題を解決することで得られた知識を、異なるが関連している問題に適用する手法です。 転移学習では、最初からトレーニングするよりも必要なデータ、時間、コンピューティング リソースが少なくなるので、トレーニング プロセスを短縮できます。 転移学習の詳細については、ディープ ラーニングと機械学習に関する記事を参照してください。

PyTorch のディープ ラーニング モデルを一からトレーニングする場合でも、既存のモデルをクラウドに持ち込む場合でも、Azure Machine Learning のエラスティック クラウド コンピューティング リソースを使用して、オープンソースのトレーニング ジョブをスケールアウトできます。 Azure Machine Learning を使用して、運用レベルのモデルをビルド、デプロイ、バージョン管理、および監視することができます。

前提条件

このコードは、次の環境のいずれかで実行してください。

この記事のコードを実行して GPU クラスターを作成する前に、ワークスペースのクォータの引き上げを要求する必要があります。

実験を設定する

このセクションでは、必要な Python パッケージを読み込み、ワークスペースを初期化し、コンピューティング先を作成し、トレーニング環境を定義することで、トレーニング実験を設定します。

パッケージをインポートする

まず、必要な Python ライブラリをインポートします。

import os
import shutil

from azureml.core.workspace import Workspace
from azureml.core import Experiment
from azureml.core import Environment

from azureml.core.compute import ComputeTarget, AmlCompute
from azureml.core.compute_target import ComputeTargetException

ワークスペースを初期化する

Azure Machine Learning ワークスペースは、サービス用の最上位のリソースです。 作成されるすべての成果物を操作できる一元的な場所が用意されています。 Python SDK では、workspace オブジェクトを作成することでワークスペースの成果物にアクセスできます。

config.jsonで作成した config.json ファイルからワークスペース オブジェクトを作成します。

ws = Workspace.from_config()

データを取得する

データセットは、七面鳥と鶏のそれぞれについて約 120 のトレーニング画像で構成され、クラスごとに 100 の検証用画像があります。 トレーニング スクリプト pytorch_train.py の一部として、データセットをダウンロードして展開します。 画像は Open Images v5 Dataset のサブセットです。 独自のデータを使用してトレーニングする JSONL を作成する手順の詳細については、この Jupyter ノートブックを参照してください。

トレーニング スクリプトを準備する

このチュートリアルでは、トレーニング スクリプトの pytorch_train.py は既に用意されています。 実際には、任意のカスタム トレーニング スクリプトをそのまま使用し、Azure Machine Learning で実行できます。

トレーニング スクリプト用のフォルダーを作成します。

project_folder = './pytorch-birds'
os.makedirs(project_folder, exist_ok=True)
shutil.copy('pytorch_train.py', project_folder)

コンピューティング ターゲットを作成する

PyTorch ジョブを実行するためのコンピューティング先を作成します。 この例では、GPU 対応の Azure Machine Learning コンピューティング クラスターを作成します。

重要

GPU クラスターを作成する前に、ワークスペースのクォータの引き上げを要求する必要があります。


# Choose a name for your CPU cluster
cluster_name = "gpu-cluster"

# Verify that cluster does not exist already
try:
    compute_target = ComputeTarget(workspace=ws, name=cluster_name)
    print('Found existing compute target')
except ComputeTargetException:
    print('Creating a new compute target...')
    compute_config = AmlCompute.provisioning_configuration(vm_size='STANDARD_NC6', 
                                                           max_nodes=4)

    # Create the cluster with the specified name and configuration
    compute_target = ComputeTarget.create(ws, cluster_name, compute_config)

    # Wait for the cluster to complete, show the output log
    compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)

代わりに CPU クラスターを作成する場合は、別の VM サイズを vm_size パラメーターに指定します (例: STANDARD_D2_V2)。

コンピューティング先の詳細については、コンピューティング先の概要に関する記事を参照してください。

環境を定義する

トレーニング スクリプトの依存関係をカプセル化する Azure Machine Learning 環境を定義するには、カスタム環境を定義するか、Azure Machine Learning のキュレーションされた環境を使用します。

選別された環境を使用する

独自のイメージを作成しない場合には、事前に構築され、キュレーションされた環境が Azure Machine Learning によって提供されます。 異なるバージョンの PyTorch に対応する PyTorch 用にキュレーションされた CPU および GPU 環境がいくつか用意されています。

キュレーションが行われた環境を使用する場合は、代わりに次のコマンドを実行できます。

curated_env_name = 'AzureML-PyTorch-1.6-GPU'
pytorch_env = Environment.get(workspace=ws, name=curated_env_name)

キュレーションされた環境に含まれるパッケージを確認するために、conda の依存関係をディスクに書き出すことができます。

pytorch_env.save_to_directory(path=curated_env_name)

キュレーションされた環境に、トレーニング スクリプトに必要なすべての依存関係が含まれていることを確認します。 含まれていない場合は、環境を変更し、不足している依存関係を含める必要があります。 環境が変更された場合は、キュレーションされた環境用に "AzureML" プレフィックスが予約されているため、新しい名前を指定する必要があります。 conda の依存関係 YAML ファイルを変更した場合は、それから、新しい名前で新しい環境を作成できます。次に例を示します。

pytorch_env = Environment.from_conda_specification(name='pytorch-1.6-gpu', file_path='./conda_dependencies.yml')

そうではなく、キュレーションされた環境のオブジェクトを直接変更した場合は、新しい名前でその環境をクローンすることができます。

pytorch_env = pytorch_env.clone(new_name='pytorch-1.6-gpu')

カスタム環境を作成する

トレーニング スクリプトの依存関係をカプセル化する独自の Azure Machine Learning 環境を作成することもできます。

最初に、YAML ファイルで conda の依存関係を定義します (この例では、ファイルの名前は conda_dependencies.yml です)。

channels:
- conda-forge
dependencies:
- python=3.7
- pip=21.3.1
- pip:
  - azureml-defaults
  - torch==1.6.0
  - torchvision==0.7.0
  - future==0.17.1
  - pillow

この conda 環境仕様から Azure Machine Learning 環境を作成します。 環境は、実行時に Docker コンテナーにパッケージ化されます。

ベース イメージが指定されていない場合、Azure Machine Learning では既定により CPU イメージ azureml.core.environment.DEFAULT_CPU_IMAGE がベース イメージとして使用されます。 この例では GPU クラスター上でトレーニングを実行するため、必要な GPU ドライバーと依存関係が含まれる GPU ベース イメージを指定する必要があります。 Azure Machine Learning は、使用できる Microsoft Container Registry (MCR) に公開された一連のベース イメージを保持します。 詳細については、AzureML-Containers GitHub リポジトリを参照してください。

pytorch_env = Environment.from_conda_specification(name='pytorch-1.6-gpu', file_path='./conda_dependencies.yml')

# Specify a GPU base image
pytorch_env.docker.enabled = True
pytorch_env.docker.base_image = 'mcr.microsoft.com/azureml/openmpi3.1.2-cuda10.1-cudnn7-ubuntu18.04'

ヒント

必要に応じて、カスタムの Docker イメージまたは Dockerfile にすべての依存関係を直接キャプチャするだけで、それから環境を作成できます。 詳細については、カスタム イメージを使用したトレーニングに関するページを参照してください。

環境の作成と使用の詳細について詳しくは、「Azure Machine Learning でソフトウェア環境を作成して使用する」を参照してください。

トレーニングの実行を構成して送信する

ScriptRunConfig を作成する

ScriptRunConfig オブジェクトを作成して、トレーニング スクリプト、使用する環境、実行対象のコンピューティング先など、トレーニング ジョブの構成の詳細を指定します。 トレーニング スクリプトへの引数は、arguments パラメーターで指定されている場合、すべてコマンド ラインで渡されます。 次のコードでは、単一ノードの PyTorch ジョブを構成します。

from azureml.core import ScriptRunConfig

src = ScriptRunConfig(source_directory=project_folder,
                      script='pytorch_train.py',
                      arguments=['--num_epochs', 30, '--output_dir', './outputs'],
                      compute_target=compute_target,
                      environment=pytorch_env)

警告

Azure Machine Learning では、ソース ディレクトリ全体をコピーすることで、トレーニング スクリプトが実行されます。 アップロードしたくない機密データがある場合は、.ignore ファイルを使用するか、ソース ディレクトリに含めないようにします。 代わりに、Azure Machine Learning データセットを使用してデータにアクセスします。

ScriptRunConfig を使用したジョブの構成の詳細については、トレーニングの実行の構成と送信に関する記事をご覧ください。

警告

以前に PyTorch Estimator を使用して PyTorch トレーニング ジョブを構成していた場合は、1.19.0 SDK のリリース以降では、Estimator が非推奨になっていることに注意してください。 Azure Machine Learning SDK 1.15.0 以降では、ディープ ラーニング フレームワークを使用するものを含めて、ScriptRunConfig がトレーニング ジョブを構成する場合に推奨される方法です。 移行に関する一般的な質問については、Estimator から ScriptRunConfig への移行に関するガイドを参照してください。

実行を送信する

実行オブジェクトには、ジョブの実行中および完了後の実行履歴へのインターフェイスが用意されています。

run = Experiment(ws, name='Tutorial-pytorch-birds').submit(src)
run.wait_for_completion(show_output=True)

実行実施中の動作

実行は、以下の段階を経て実施されます。

  • 準備:Docker イメージは、定義されている環境に従って作成されます。 イメージはワークスペースのコンテナー レジストリにアップロードされ、後で実行するためにキャッシュされます。 ログは実行履歴にもストリーミングされ、進行状況を監視するために表示することができます。 代わりに、キュレーションされた環境が指定されている場合は、そのキュレーションされた環境を補足するキャッシュ済みのイメージが使用されます。

  • 拡大縮小:Batch AI クラスターでの実行に現在使用可能な数より多くのノードが必要な場合、クラスターはスケールアップを試みます。

  • 実行中: スクリプト フォルダー内のすべてのスクリプトがコンピューティング先にアップロードされ、データ ストアがマウントまたはコピーされて、script が実行されます。 stdout からの出力と ./logs フォルダーが実行履歴にストリーミングされるので、実行の監視のために使用できます。

  • 後処理:実行の ./outputs フォルダーが実行履歴にコピーされます。

モデルを登録またはダウンロードする

モデルのトレーニングが終わったら、それをワークスペースに登録できます。 モデルの登録を使用すると、モデルをワークスペースに格納し、バージョン管理して、モデルの管理とデプロイを簡単にすることができます。

model = run.register_model(model_name='pytorch-birds', model_path='outputs/model.pt')

ヒント

デプロイ方法にはモデルの登録に関するセクションが含まれていますが、登録済みのモデルが既にあるため、デプロイのためにコンピューティング先の作成に直接スキップできます。

実行オブジェクトを使用してモデルのローカル コピーをダウンロードすることもできます。 トレーニング スクリプトの pytorch_train.py では、PyTorch 保存オブジェクトによってモデルがローカル フォルダー (コンピューティング先に対するローカル) に永続化されます。 実行オブジェクトを使用してコピーをダウンロードすることができます。

# Create a model folder in the current directory
os.makedirs('./model', exist_ok=True)

# Download the model from run history
run.download_file(name='outputs/model.pt', output_file_path='./model/model.pt'), 

分散トレーニング

Azure Machine Learning では、トレーニング ワークロードをスケーリングできるように、マルチノードの分散 PyTorch ジョブもサポートされています。 分散 PyTorch ジョブは簡単に実行でき、オーケストレーションの管理は Azure Machine Learning service によって自動的に行われます。

Azure Machine Learning では、Horovod と PyTorch の両方について、DistributedDataParallel 組み込みモジュールを使用した分散 PyTorch ジョブの実行がサポートされています。

分散トレーニングの詳細については、「分散 GPU トレーニング ガイド」を参照してください。

ONNX にエクスポートする

ONNX Runtime での推論を最適化するために、トレーニングされた PyTorch モデルを ONNX 形式に変換します。 推論、つまりモデル スコアリングとは、通常は運用環境のデータに基づいて、デプロイしたモデルを使用して予測を行うフェーズです。 例については、PyTorch から ONNX へのモデルのエクスポートに関するチュートリアルを参照してください。

次のステップ

この記事では、Azure Machine Learning で PyTorch を使用して、ディープ ラーニング ニューラル ネットワークをトレーニングして登録しました。 モデルをデプロイする方法を学習するには、モデル デプロイの記事に進んでください。