Azure Machine Learning データセットを使用してモデルをトレーニングする
適用対象: Python SDK azureml v1
この記事では、Azure Machine Learning データセットを使用して、機械学習モデルのトレーニングを行う方法について説明します。 接続文字列やデータ パスを気にすることなく、ローカルまたはリモートのコンピューティング先でデータセットを使用することができます。
構造化データについては、「Machine learning トレーニング スクリプトでデータセットを使用する」を参照してください。
非構造化データについては、「リモート コンピューティング先にファイルをマウントする」を参照してください。
Azure Machine Learning データセットにより、ScriptRunConfig、HyperDrive、Azure Machine Learning パイプラインなどの Azure Machine Learning トレーニング機能とのシームレスな統合が提供されます。
モデル トレーニングに向けてデータを使用できるようにする準備はできていないものの、データ探索用のノートブックにデータを読み込みたい場合は、データセット内でデータを探索する方法に関する記事を参照してください。
前提条件
データセットを作成し、それを使用してトレーニングするには、以下が必要です。
Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。 無料版または有料版の Azure Machine Learning を今すぐお試しください。
Azure Machine Learning SDK for Python がインストール済み (1.13.0 以上)。これには
azureml-datasets
パッケージが含まれています。
注意
一部の Dataset クラスは、azureml-dataprep パッケージに依存しています。 Linux ユーザーの場合、これらのクラスは以下のディストリビューションでのみサポートされています: Red Hat Enterprise Linux、Ubuntu、Fedora。
Machine learning トレーニング スクリプトでデータセットを使用する
データセットとしてまだ登録されていない構造化データがある場合は、TabularDataset を作成し、それをローカルまたはリモートの実験用のトレーニング スクリプトで直接使用します。
この例では、未登録の TabularDataset を作成し、トレーニング用の ScriptRunConfig オブジェクトのスクリプト引数として指定します。 この TabularDataset をワークスペースの他の実験で再利用する場合は、データセットをワークスペースに登録する方法に関する記事を参照してください。
TabularDataset を作成する
次のコードでは、Web URL から未登録の TabularDataset を作成します。
from azureml.core.dataset import Dataset
web_path ='https://dprepdata.blob.core.windows.net/demo/Titanic.csv'
titanic_ds = Dataset.Tabular.from_delimited_files(path=web_path)
TabularDataset オブジェクトを使用すると、TabularDataset のデータを pandas または Spark DataFrame に読み込むことができるため、お使いのノートブックを離れることなく、使い慣れたデータ準備とトレーニングのライブラリを操作することができます。
トレーニング スクリプトでデータセットにアクセスする
次のコードでは、トレーニングの実行を構成するときに指定するスクリプト引数 --input-data
を構成します (次のセクションを参照してください)。 表形式のデータセットが引数値として渡されると、Azure Machine Learning によってデータセット ID に解決されます。 その後、その引数値を使用して、トレーニング スクリプト内のデータセットにアクセスできるようなります (スクリプト内でデータセットの名前や ID をハードコーディングする必要はありません)。 その後、トレーニングの前にデータをさらに調べて準備するために、to_pandas_dataframe()
メソッドを使用して、そのデータセットを pandas データフレームに読み込みます。
Note
元のデータ ソースに NaN、空の文字列、または空白の値が含まれている場合、to_pandas_dataframe()
を使用すると、それらの値は Null 値として置き換えられます。
準備されたデータをイン メモリの pandas データ フレームから新しいデータセットに読み込む必要がある場合は、そのデータを parquet などのローカル ファイルに書き込み、そのファイルから新しいデータセットを作成します。 データセットを作成する方法の詳細をご覧ください。
%%writefile $script_folder/train_titanic.py
import argparse
from azureml.core import Dataset, Run
parser = argparse.ArgumentParser()
parser.add_argument("--input-data", type=str)
args = parser.parse_args()
run = Run.get_context()
ws = run.experiment.workspace
# get the input dataset by ID
dataset = Dataset.get_by_id(ws, id=args.input_data)
# load the TabularDataset to pandas DataFrame
df = dataset.to_pandas_dataframe()
トレーニングの実行を構成する
ScriptRunConfig オブジェクトは、トレーニング実行を構成および送信するために使用されます。
このコードでは、以下を指定する ScriptRunConfig オブジェクト src
を作成します
- 使用するスクリプトのスクリプト ディレクトリ。 このディレクトリ内のすべてのファイルは、実行のためにクラスター ノード内にアップロードされます。
- トレーニング スクリプト train_titanic.py。
- スクリプト引数としてのトレーニング用の入力データセット
titanic_ds
。 これがスクリプトに渡されると、Azure Machine Learning によってデータセットの対応する ID に解決されます。 - 実行のコンピューティング先。
- 実行の環境。
from azureml.core import ScriptRunConfig
src = ScriptRunConfig(source_directory=script_folder,
script='train_titanic.py',
# pass dataset as an input with friendly name 'titanic'
arguments=['--input-data', titanic_ds.as_named_input('titanic')],
compute_target=compute_target,
environment=myenv)
# Submit the run configuration for your training run
run = experiment.submit(src)
run.wait_for_completion(show_output=True)
リモート コンピューティング先にファイルをマウントする
非構造化データがある場合は、FileDataset を作成し、データ ファイルをマウントまたはダウンロードして、トレーニング用にリモート コンピューティング先でそれを使用できるようにします。 リモート トレーニング実験用にマウントまたはダウンロードを使用する状況について説明します。
次の例をご覧ください。
- トレーニング データ用の入力 FileDataset、
mnist_ds
を作成する。 - トレーニング結果の書き込み先と、それらの結果を FileDataset として昇格させることを指定する。
- 入力データセットをコンピューティング先にマウントする。
注意
カスタム Docker ベース イメージを使用している場合は、データセットのマウントを機能させるための依存関係として、apt-get install -y fuse
経由で fuse をインストールする必要があります。 カスタム ビルド イメージを構築する方法を確認してください。
ノートブックの例については、データ入出力を使用してトレーニング実行を構成する方法に関する記事を参照してください。
FileDataset を作成する
次の例では、未登録の FileDataset、mnist_data
を Web URL から作成します。 この FileDataset は、トレーニング実行用の入力データです。
他のソースからデータセットを作成する方法の詳細を参照してください。
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'
]
mnist_ds = Dataset.File.from_files(path = web_paths)
トレーニング出力の書き込み先
OutputFileDatasetConfig オブジェクトを使用して、トレーニング結果の書き込み先を指定できます。
OutputFileDatasetConfig オブジェクトを使用すると、次のことができます。
- 指定したクラウド ストレージに実行の出力をマウントまたはアップロードする。
- 出力を FileDataset として、これらのサポートされているストレージの種類に保存する。
- Azure BLOB
- Azure ファイル共有
- Azure Data Lake Storage Gen 1 と 2
- トレーニング実行間のデータ系列を追跡する。
次のコードでは、トレーニング結果を FileDataset として既定の BLOB データストア def_blob_store
の outputdataset
フォルダーに保存するように指定します。
from azureml.core import Workspace
from azureml.data import OutputFileDatasetConfig
ws = Workspace.from_config()
def_blob_store = ws.get_default_datastore()
output = OutputFileDatasetConfig(destination=(def_blob_store, 'sample/outputdataset'))
トレーニングの実行を構成する
ScriptRunConfig
コンストラクターの arguments
パラメーターを介してマウントする場合は、データセットを引数として渡すことをお勧めします。 そうすることで、引数を介してトレーニング スクリプトのデータ パス (マウント ポイント) を取得します。 これにより、任意のクラウド プラットフォームで、ローカル デバッグとリモート トレーニングに、同じトレーニング スクリプトを使用できます。
次の例では、arguments
を介して FileDataset を渡す ScriptRunConfig を作成します。 実行を送信すると、データセット mnist_ds
によって参照されるデータ ファイルがコンピューティング先にマウントされ、トレーニング結果が既定のデータストア内の指定された outputdataset
フォルダーに保存されます。
from azureml.core import ScriptRunConfig
input_data= mnist_ds.as_named_input('input').as_mount()# the dataset will be mounted on the remote compute
src = ScriptRunConfig(source_directory=script_folder,
script='dummy_train.py',
arguments=[input_data, output],
compute_target=compute_target,
environment=myenv)
# Submit the run configuration for your training run
run = experiment.submit(src)
run.wait_for_completion(show_output=True)
単純なトレーニング スクリプト
次のスクリプトは、ScriptRunConfig を介して送信されます。 mnist_ds
データセットを入力として読み取って、既定の BLOB データストア def_blob_store
内の outputdataset
フォルダーにファイルを書き込みます。
%%writefile $source_directory/dummy_train.py
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
import sys
import os
print("*********************************************************")
print("Hello Azure Machine Learning!")
mounted_input_path = sys.argv[1]
mounted_output_path = sys.argv[2]
print("Argument 1: %s" % mounted_input_path)
print("Argument 2: %s" % mounted_output_path)
with open(mounted_input_path, 'r') as f:
content = f.read()
with open(os.path.join(mounted_output_path, 'output.csv'), 'w') as fw:
fw.write(content)
マウントまたはダウンロード
任意の形式のファイルをダウンロードしたりマウントしたりすることは、Azure BLOB ストレージ、Azure Files、Azure Data Lake Storage Gen1、Azure Data Lake Storage Gen2、Azure SQL Database、および Azure Database for PostgreSQL から作成されたデータセットに対してサポートされています。
データセットをマウントする場合は、データセットによって参照されているファイルをディレクトリ (マウント ポイント) に接続し、コンピューティング先で使用できるようにします。 Azure Machine Learning コンピューティング、仮想マシン、HDInsight など、Linux ベースのコンピューティングでは、マウントがサポートされています。 データ サイズがコンピューティング ディスクのサイズを超えると、ダウンロードできません。 このシナリオでは、処理時にスクリプトで使用されるデータ ファイルのみが読み込まれるため、マウントすることをお勧めします。
データセットをダウンロードすると、そのデータセットが参照するすべてのファイルが、コンピューティング先にダウンロードされます。 すべてのコンピューティングの種類でダウンロードがサポートされています。 データセットによって参照されるファイルのすべてがスクリプトで処理され、コンピューティング ディスクが完全なデータセットに収まる場合は、ダウンロードによって、ストレージ サービスからのデータ ストリーミングのオーバーヘッドを回避することをお勧めします。 マルチノードのダウンロードについては、調整を回避する方法を参照してください。
注意
ダウンロード パス名は、Windows OS の場合は英数字で 255 文字を超えないようにしてください。 Linux OS の場合、ダウンロード パス名は英数字で 4,096 文字を超えないようにしてください。 また、Linux OS の場合、ファイル名 (ダウンロード パス /path/to/file/{filename}
の最後のセグメント) は英数字で 255 文字を超えないようにしてください。
次のコードを実行すると、dataset
が mounted_path
の一時ディレクトリにマウントされます
import tempfile
mounted_path = tempfile.mkdtemp()
# mount dataset onto the mounted_path of a Linux-based compute
mount_context = dataset.mount(mounted_path)
mount_context.start()
import os
print(os.listdir(mounted_path))
print (mounted_path)
Machine learning スクリプトでデータセットを取得する
登録されたデータセットは、Azure Machine Learning コンピューティングなどのコンピューティング クラスター上で、ローカルまたはリモートでアクセスできます。 複数の実験で登録済みデータセットにアクセスするには、以下のコードを使用してワークスペースにアクセスし、以前送信した実行で使用されたデータセットを取得します。 既定では、Dataset
クラスの get_by_name()
メソッドからは、ワークスペースに登録されているデータセットの最新バージョンが返されます。
%%writefile $script_folder/train.py
from azureml.core import Dataset, Run
run = Run.get_context()
workspace = run.experiment.workspace
dataset_name = 'titanic_ds'
# Get a dataset by name
titanic_ds = Dataset.get_by_name(workspace=workspace, name=dataset_name)
# Load a TabularDataset into pandas DataFrame
df = titanic_ds.to_pandas_dataframe()
トレーニング中のソース コードへのアクセス
Azure BLOB ストレージは、スループット速度が Azure ファイル共有よりも高く、並列で開始される多数のジョブに対応します。 このため、ソース コード ファイルの転送については、BLOB ストレージを使用するように実行を構成することをお勧めします。
次のコード例では、実行構成で、ソース コード転送に使用する BLOB データストアを指定します。
# workspaceblobstore is the default blob storage
src.run_config.source_directory_data_store = "workspaceblobstore"
ノートブックの例
- その他のデータセット例と概念については、データセット ノートブックに関する記事を参照してください。
- ML パイプラインでデータセットをパラメーター化する方法を参照してください。
トラブルシューティング
データセットの初期化に失敗しました: マウント ポイントの準備ができるまで待っていましたがタイムアウトになりました:
- アウトバウンド ネットワーク セキュリティ グループ規則がなく、
azureml-sdk>=1.12.0
を使用している場合は、azureml-dataset-runtime
とその依存関係を更新して、特定のマイナー バージョンの最新版にします。または、それを実行で使用している場合は、修正プログラムを含む最新パッチが適用されるように、お使いの環境を再作成します。 azureml-sdk<1.12.0
を使用している場合は、最新バージョンにアップグレードします。- アウトバウンド NSG 規則がある場合は、サービス タグ
AzureResourceMonitor
のすべてのトラフィックを許可するアウトバウンド規則があることを確認します。
データセットの初期化に失敗しました: ThrottlingException によって StreamAccessException が発生しました
マルチノードのファイル ダウンロードでは、すべてのノードが Azure Storage サービスからファイル データセット内のすべてのファイルをダウンロードしようとする可能性があり、その結果、調整エラーが発生します。 調整を回避するには、まず環境変数 AZUREML_DOWNLOAD_CONCURRENCY
を、CPU コアの数を 8 倍してノードの数で割った値に設定します。 この環境変数の値を設定するには多少の調整が必要になる可能性があるため、上記のガイダンスはあくまでもその出発点となります。
次の例では、32 個のコアと 4 つのノードを前提にしています。
from azureml.core.environment import Environment
myenv = Environment(name="myenv")
myenv.environment_variables = {"AZUREML_DOWNLOAD_CONCURRENCY":64}
AzureFile ストレージ
Unable to upload project files to working directory in AzureFile because the storage is overloaded (ストレージが過負荷になっているため、プロジェクト ファイルを AzureFile 内の作業ディレクトリにアップロードできません) :
データ転送などの他のワークロードにファイル共有を使用している場合は、ファイル共有を実行の送信に使用できるようにしておくため、BLOB を使用することをお勧めします。
また、ワークロードを 2 つの異なるワークスペースに分割することもできます。
ConfigException: 資格情報が見つからないため、AzureFileService への接続を作成できませんでした。 アカウント キーまたは SAS トークンのいずれかが、既定のワークスペース BLOB ストアにリンクされている必要があります。
ストレージ アクセス資格情報がワークスペースおよび関連するファイル データストアにリンクされていることを確認するには、次の手順を実行します。
- Azure portal でワークスペースに移動します。
- ワークスペースの [概要] ページでストレージ リンクを選択 します。
- ストレージ ページの左側のメニューで [アクセス キー] を選択します。
- キーをコピーします。
- ワークスペースの Azure Machine Learning スタジオに移動します。
- スタジオで、認証資格情報を指定するファイル データストアを選択します。
- [認証の更新] を選択します。
- 前の手順のキーを貼り付けます。
- [保存] を選択します。
入力としてのデータの引き渡し
TypeError:FileNotFound:そのようなファイルまたはディレクトリはありません:このエラーは、指定したファイル パスにファイルがない場合に発生します。 ファイルを参照する方法が、コンピューティング先でデータセットをマウントした場所と一致していることを確認する必要があります。 確定的な状態を確保するには、データセットをコンピューティング先にマウントするときに抽象パスを使用することをお勧めします。 たとえば、次のコードでは、コンピューティング先のファイルシステムのルート /tmp
にデータセットをマウントしています。
# Note the leading / in '/tmp/dataset'
script_params = {
'--data-folder': dset.as_named_input('dogscats_train').as_mount('/tmp/dataset'),
}
先頭のスラッシュ記号 "/" を含めない場合は、データセットをマウントする場所を示すために、コンピューティング先の作業ディレクトリをプレフィックスとして付ける必要があります (例: /mnt/batch/.../tmp/dataset
)。
次のステップ
TabularDatasets を使用して機械学習モデルを自動的にトレーニングする。
FileDatasets を使用して画像分類モデルをトレーニングする。