Azure Machine Learning SDK (v1) を使用して大規模な TensorFlow モデルをトレーニングする
適用対象: Python SDK azureml v1
この記事では、Azure Machine Learning を使用して、大規模な TensorFlow トレーニング スクリプトを実行する方法について説明します。
この例では、ディープ ニューラル ネットワーク (DNN) を使用して手書きの数字を分類するための TensorFlow モデルをトレーニングして登録します。
TensorFlow モデルを一から開発する場合でも、既存のモデルをクラウドに取り込む場合でも、Azure Machine Learning を使用してオープンソースのトレーニング ジョブをスケールアウトし、運用グレードのモデルの構築、デプロイ、バージョン管理、監視を行うことができます。
前提条件
このコードは、次の環境のいずれかで実行してください。
Azure Machine Learning コンピューティング インスタンス - ダウンロードやインストールは必要なし
- 「クイック スタート: Azure Machine Learning の利用を開始」を完了して、SDK およびサンプル リポジトリが事前に読み込まれた専用のノートブック サーバーを作成します。
- ノートブック サーバー上のディープ ラーニングの samples フォルダーで、how-to-use-azureml > ml-frameworks > tensorflow > train-hyperparameter-tune-deploy-with-tensorflow フォルダーまでディレクトリを移動して、完成した展開済みノートブックを見つけます。
独自の Jupyter Notebook サーバー
- Azure Machine Learning SDK (1.15.0 以降) をインストールします。
- ワークスペース構成ファイルを作成します。
- サンプル スクリプト ファイル
tf_mnist.py
およびutils.py
をダウンロードする
このガイドの完成した Jupyter Notebook バージョンは、GitHub サンプル ページにもあります。 このノートブックには、インテリジェントなハイパーパラメーター調整、モデル デプロイ、およびノートブックのウィジェットを示す展開済みセクションが含まれています。
この記事のコードを実行して GPU クラスターを作成する前に、ワークスペースのクォータの引き上げを要求する必要があります。
実験を設定する
このセクションでは、必要な Python パッケージを読み込み、ワークスペースを初期化し、コンピューティング先を作成し、トレーニング環境を定義することで、トレーニング実験を設定します。
パッケージをインポートする
まず、必要な Python ライブラリをインポートします。
import os
import urllib
import shutil
import azureml
from azureml.core import Experiment
from azureml.core import Workspace, Run
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()
ファイル データセットの作成
FileDataset
オブジェクトでは、ご利用のワークスペース データストアまたはパブリック URL 内の 1 つまたは複数のファイルが参照されます。 ファイルは任意の形式にすることができ、クラスには、ファイルのダウンロードまたはご利用のコンピューティングへのファイルのマウントを行うための機能が用意されています。 FileDataset
を作成することにより、データソースの場所への参照を作成します。 データ セットに変換を適用した場合は、それらの変換もデータ セットに格納されます。 データは既存の場所に残るので、追加のストレージ コストは発生しません。 Dataset
パッケージについて詳しくは、データ セットの作成と登録の方法に関する記事を参照してください。
from azureml.core.dataset import Dataset
web_paths = [
'http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz',
'http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz',
'http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz',
'http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz'
]
dataset = Dataset.File.from_files(path = web_paths)
他のユーザーと共有したり、さまざまな実験で再利用したり、トレーニング スクリプト内で名前で参照したりできるように、データセットをご利用のワークスペースに登録するには、register()
メソッドを使います。
dataset = dataset.register(workspace=ws,
name='mnist-dataset',
description='training and test dataset',
create_new_version=True)
# list the files referenced by dataset
dataset.to_path()
コンピューティング ターゲットを作成する
TensorFlow ジョブを実行するためのコンピューティング先を作成します。 この例では、GPU 対応の Azure Machine Learning コンピューティング クラスターを作成します。
重要
GPU クラスターを作成する前に、ワークスペースのクォータの引き上げを要求する必要があります。
cluster_name = "gpu-cluster"
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)
compute_target = ComputeTarget.create(ws, cluster_name, compute_config)
compute_target.wait_for_completion(show_output=True, min_node_count=None, timeout_in_minutes=20)
コンピューティング先の詳細については、コンピューティング先の概要に関する記事を参照してください。
環境を定義する
トレーニング スクリプトの依存関係をカプセル化する Azure Machine Learning 環境を定義するには、カスタム環境を定義するか、Azure Machine Learning のキュレーションされた環境を使用します。
選別された環境を使用する
独自のイメージを作成しない場合には、事前に構築され、キュレーションされた環境が Azure Machine Learning によって提供されます。 Azure Machine Learning には、異なるバージョンの TensorFlow に対応する TensorFlow 用にキュレーションされた CPU および GPU 環境がいくつか用意されています。 @latest
ディレクティブを使用して、この環境の最新バージョンを使用します。 詳細については、「Azure Machine Learning のキュレーションされた環境」を参照してください。
キュレーションされた環境を使用する場合、コードは次の例のようになります。
curated_env_name = 'AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu'
tf_env = Environment.get(workspace=ws, name=curated_env_name)
キュレーションされた環境に含まれるパッケージを確認するために、conda の依存関係をディスクに書き出すことができます。
tf_env.save_to_directory(path=curated_env_name)
キュレーションされた環境に、トレーニング スクリプトに必要なすべての依存関係が含まれていることを確認します。 含まれていない場合は、環境を変更し、不足している依存関係を含める必要があります。 環境が変更された場合は、キュレーションされた環境用に "AzureML" プレフィックスが予約されているため、新しい名前を指定する必要があります。 conda の依存関係 YAML ファイルを変更した場合は、それから、新しい名前で新しい環境を作成できます。次に例を示します。
tf_env = Environment.from_conda_specification(name='AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu', file_path='./conda_dependencies.yml')
そうではなく、キュレーションされた環境のオブジェクトを直接変更した場合は、新しい名前でその環境をクローンすることができます。
tf_env = tf_env.clone(new_name='my-AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu')
カスタム環境を作成する
トレーニング スクリプトの依存関係をカプセル化する独自の Azure Machine Learning 環境を作成することもできます。
最初に、YAML ファイルで conda の依存関係を定義します (この例では、ファイルの名前は conda_dependencies.yml
です)。
channels:
- conda-forge
dependencies:
- python=3.7
- pip:
- azureml-defaults
- tensorflow-gpu==2.2.0
この 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) に公開された、お客様が使用できる 1 組のベース イメージを保持しています。詳細については、Azure/AzureML-Containers GitHub リポジトリを参照してください。
tf_env = Environment.from_conda_specification(name='AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu', file_path='./conda_dependencies.yml')
# Specify a GPU base image
tf_env.docker.enabled = True
tf_env.docker.base_image = 'mcr.microsoft.com/azureml/openmpi3.1.2-cuda10.1-cudnn7-ubuntu18.04'
ヒント
必要に応じて、カスタムの Docker イメージまたは Dockerfile にすべての依存関係を直接キャプチャするだけで、それから環境を作成できます。 詳細については、カスタム イメージを使用したトレーニングに関するページを参照してください。
環境の作成と使用の詳細について詳しくは、「Azure Machine Learning でソフトウェア環境を作成して使用する」を参照してください。
トレーニングの実行を構成して送信する
ScriptRunConfig を作成する
ScriptRunConfig オブジェクトを作成して、トレーニング スクリプト、使用する環境、実行対象のコンピューティング先など、トレーニング ジョブの構成の詳細を指定します。 トレーニング スクリプトへの引数は、arguments
パラメーターで指定されている場合、すべてコマンド ラインで渡されます。
from azureml.core import ScriptRunConfig
args = ['--data-folder', dataset.as_mount(),
'--batch-size', 64,
'--first-layer-neurons', 256,
'--second-layer-neurons', 128,
'--learning-rate', 0.01]
src = ScriptRunConfig(source_directory=script_folder,
script='tf_mnist.py',
arguments=args,
compute_target=compute_target,
environment=tf_env)
警告
Azure Machine Learning では、ソース ディレクトリ全体をコピーすることで、トレーニング スクリプトが実行されます。 アップロードしたくない機密データがある場合は、.ignore ファイルを使用するか、ソース ディレクトリに含めないようにします。 代わりに、Azure Machine Learning データセットを使用してデータにアクセスします。
ScriptRunConfig を使用したジョブの構成の詳細については、トレーニングの実行の構成と送信に関する記事をご覧ください。
警告
以前に TensorFlow Estimator を使用して TensorFlow トレーニング ジョブを構成していた場合は、1.19.0 SDK のリリース以降では、Estimator が非推奨になっていることに注意してください。 Azure Machine Learning SDK 1.15.0 以降では、ディープ ラーニング フレームワークを使用するものを含めて、ScriptRunConfig がトレーニング ジョブを構成する場合に推奨される方法です。 移行に関する一般的な質問については、Estimator から ScriptRunConfig への移行に関するガイドを参照してください。
実行を送信する
実行オブジェクトには、ジョブの実行中および完了後の実行履歴へのインターフェイスが用意されています。
run = Experiment(workspace=ws, name='Tutorial-TF-Mnist').submit(src)
run.wait_for_completion(show_output=True)
実行実施中の動作
実行は、以下の段階を経て実施されます。
準備:Docker イメージは、定義されている環境に従って作成されます。 イメージはワークスペースのコンテナー レジストリにアップロードされ、後で実行するためにキャッシュされます。 ログは実行履歴にもストリーミングされ、進行状況を監視するために表示することができます。 代わりに、キュレーションされた環境が指定されている場合は、そのキュレーションされた環境を補足するキャッシュ済みのイメージが使用されます。
拡大縮小:Batch AI クラスターでの実行に現在使用可能な数より多くのノードが必要な場合、クラスターはスケールアップを試みます。
実行中: スクリプト フォルダー内のすべてのスクリプトがコンピューティング先にアップロードされ、データ ストアがマウントまたはコピーされて、
script
が実行されます。 stdout からの出力と ./logs フォルダーが実行履歴にストリーミングされるので、実行の監視のために使用できます。後処理:実行の ./outputs フォルダーが実行履歴にコピーされます。
モデルを登録またはダウンロードする
モデルのトレーニングが終わったら、それをワークスペースに登録できます。 モデルの登録を使用すると、モデルをワークスペースに格納し、バージョン管理して、モデルの管理とデプロイを簡単にすることができます。
必要に応じてパラメーター model_framework
、model_framework_version
、および resource_configuration
を指定することによって、コードなしのモデル デプロイが使用可能になります。 これにより、登録済みのモデルからモデルを Web サービスとして直接デプロイできるようになり、ResourceConfiguration
オブジェクトによって Web サービスのコンピューティング リソースが定義されます。
from azureml.core import Model
from azureml.core.resource_configuration import ResourceConfiguration
model = run.register_model(model_name='tf-mnist',
model_path='outputs/model',
model_framework=Model.Framework.TENSORFLOW,
model_framework_version='2.0',
resource_configuration=ResourceConfiguration(cpu=1, memory_in_gb=0.5))
実行オブジェクトを使用してモデルのローカル コピーをダウンロードすることもできます。 トレーニング スクリプトの tf_mnist.py
では、TensorFlow セーバー オブジェクトによってモデルがローカル フォルダー (コンピューティング先に対するローカル) に永続化されます。 実行オブジェクトを使用してコピーをダウンロードすることができます。
# Create a model folder in the current directory
os.makedirs('./model', exist_ok=True)
run.download_files(prefix='outputs/model', output_directory='./model', append_prefix=False)
分散トレーニング
Azure Machine Learning では、トレーニング ワークロードをスケーリングできるように、マルチノードの分散 TensorFlow ジョブもサポートされています。 分散 TensorFlow ジョブは簡単に実行でき、オーケストレーションの管理は Azure Machine Learning によって自動的に行われます。
Azure Machine Learning では、Horovod と TensorFlow の両方について、組み込みの分散トレーニング API を使用した分散 TensorFlow ジョブの実行がサポートされています。
分散トレーニングの詳細については、「分散 GPU トレーニング ガイド」を参照してください。
TensorFlow モデルをデプロイする
デプロイ方法にはモデルの登録に関するセクションが含まれていますが、登録済みのモデルが既にあるため、デプロイのためにコンピューティング先の作成に直接スキップできます。
(プレビュー) コードなしのモデル デプロイ
重要
現在、この機能はパブリック プレビュー段階にあります。 このプレビュー バージョンはサービス レベル アグリーメントなしで提供されており、運用環境のワークロードに使用することは推奨されません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。
詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。
従来のデプロイ ルートの代わりに、コードなしのデプロイ機能 (プレビュー) を TensorFlow に使用することもできます。 model_framework
、model_framework_version
、および resource_configuration
パラメーターを使用して前に示したようにモデルを登録することにより、deploy()
静的関数を使用してモデルをデプロイできます。
service = Model.deploy(ws, "tensorflow-web-service", [model])
完全な方法では、Azure Machine Learning を使用したデプロイがさらに詳細に説明されています。
次のステップ
この記事では、TensorFlow モデルをトレーニングして登録し、デプロイのオプションについて学習しました。 Azure Machine Learning の詳細については、以下の他の記事をご覧ください。