Azure Machine Learning データセットをバージョン管理および追跡する
この記事では、再現性のために Azure Machine Learning データセットをバージョン管理する方法について説明します。 データセットのバージョン管理は、将来の実験のために特定のバージョンのデータセットを適用できるように、データの状態をブックマークする方法です。
一般的なバージョン管理のシナリオ:
- 再トレーニングのために新しいデータを使用できるとき
- 異なるデータ準備または特徴エンジニアリングのアプローチを適用しようとしているとき
前提条件
このチュートリアルには、次のものが必要です。
Azure Machine Learning SDK for Python がインストールされていること。 この SDK には、azureml-datasets パッケージが含まれています。
Azure Machine Learning ワークスペース。 次のコードを実行して既存のものを取得するか、新しいワークスペースを作成します。
import azureml.core from azureml.core import Workspace ws = Workspace.from_config()
データセットのバージョンを登録および取得する
データセットを登録することで、複数の実験にわたり、同僚との間でバージョン管理、再利用、共有を行うことができます。 複数のデータセットを同じ名前で登録し、名前とバージョン番号で特定のバージョンを取得することができます。
データセットのバージョンを登録する
次のコードでは、create_new_version
パラメーターを True
に設定することによって、新しいバージョンの titanic_ds
データセットを登録します。 ワークスペースに登録されている既存の titanic_ds
データセットがない場合、コードは titanic_ds
という名前で新しいデータセットを作成し、そのバージョンを 1 に設定します。
titanic_ds = titanic_ds.register(workspace = workspace,
name = 'titanic_ds',
description = 'titanic training data',
create_new_version = True)
名前でデータセットを取得する
既定では、Dataset
クラスの get_by_name() メソッドでは、ワークスペースに登録されているデータセットの最新バージョンが返されます。
次のコードでは、titanic_ds
データセットのバージョン 1 を取得します。
from azureml.core import Dataset
# Get a dataset by name and version number
titanic_ds = Dataset.get_by_name(workspace = workspace,
name = 'titanic_ds',
version = 1)
バージョン管理のベスト プラクティス
データセットのバージョンを作成するときには、ワークスペースでデータの余分なコピーを作成しないようにします。 データセットはストレージ サービス内のデータへの参照であるため、あるのはストレージ サービスによって管理される単一のデータ ソースです。
重要
データセットによって参照されるデータが上書きまたは削除された場合、特定バージョンのデータセットを呼び出しても変更は元に戻されません。
データセットからデータを読み込むときは常に、データセットによって参照された現在のデータ コンテンツが読み込まれます。 データセットの各バージョンが再現可能であることを確認する場合、データセットのバージョンによって参照されるデータ コンテンツは変更しないことをお勧めします。 新しいデータが到着したら、新しいデータ ファイルを別個のデータ フォルダーに保存してから、新しいデータセット バージョンを作成し、その新しいフォルダーのデータを含めます。
次の図とサンプル コードは、データ フォルダーを構成し、それらのフォルダーを参照するデータセット バージョンを作成するための推奨される方法を示しています。
from azureml.core import Dataset
# get the default datastore of the workspace
datastore = workspace.get_default_datastore()
# create & register weather_ds version 1 pointing to all files in the folder of week 27
datastore_path1 = [(datastore, 'Weather/week 27')]
dataset1 = Dataset.File.from_files(path=datastore_path1)
dataset1.register(workspace = workspace,
name = 'weather_ds',
description = 'weather data in week 27',
create_new_version = True)
# create & register weather_ds version 2 pointing to all files in the folder of week 27 and 28
datastore_path2 = [(datastore, 'Weather/week 27'), (datastore, 'Weather/week 28')]
dataset2 = Dataset.File.from_files(path = datastore_path2)
dataset2.register(workspace = workspace,
name = 'weather_ds',
description = 'weather data in week 27, 28',
create_new_version = True)
ML パイプライン出力データセットをバージョン管理する
データセットは、ML の各パイプライン ステップの入力および出力として使用できます。 パイプラインを再実行すると、各パイプライン ステップの出力は新しいデータセット バージョンとして登録されます。
パイプラインを再実行するたびに、ML パイプラインによって、各ステップの出力が新しいフォルダーに格納されます。 この動作により、バージョン管理された出力データセットを再現できます。 パイプラインのデータセットについてはこちらをご覧ください。
from azureml.core import Dataset
from azureml.pipeline.steps import PythonScriptStep
from azureml.pipeline.core import Pipeline, PipelineData
from azureml.core. runconfig import CondaDependencies, RunConfiguration
# get input dataset
input_ds = Dataset.get_by_name(workspace, 'weather_ds')
# register pipeline output as dataset
output_ds = PipelineData('prepared_weather_ds', datastore=datastore).as_dataset()
output_ds = output_ds.register(name='prepared_weather_ds', create_new_version=True)
conda = CondaDependencies.create(
pip_packages=['azureml-defaults', 'azureml-dataprep[fuse,pandas]'],
pin_sdk_version=False)
run_config = RunConfiguration()
run_config.environment.docker.enabled = True
run_config.environment.python.conda_dependencies = conda
# configure pipeline step to use dataset as the input and output
prep_step = PythonScriptStep(script_name="prepare.py",
inputs=[input_ds.as_named_input('weather_ds')],
outputs=[output_ds],
runconfig=run_config,
compute_target=compute_target,
source_directory=project_folder)
実験のデータを追跡する
Azure Machine Learning を使用すると、入力と出力のデータセットとして実験全体のデータが追跡されます。
データが入力データセットとして追跡されるシナリオを次に示します。
実験ジョブを送信するときに、
ScriptRunConfig
オブジェクトのinputs
またはarguments
のいずれかのパラメーターを使用してDatasetConsumptionConfig
オブジェクトとして。get_by_name() または get_by_id() のようなメソッドがスクリプトで呼び出される場合。 このシナリオでは、ワークスペースに登録したときにデータセットに割り当てられた名前が表示されます。
データが出力データセットとして追跡されるシナリオを次に示します。
実験ジョブを送信するときに、
outputs
またはarguments
のいずれかのパラメーターを使用してOutputFileDatasetConfig
オブジェクトを渡す。OutputFileDatasetConfig
オブジェクトを使用して、パイプライン ステップ間でデータを保持することもできます。 ML パイプラインのステップ間でのデータの移動に関するページを参照してください。スクリプトにデータセットを登録する。 このシナリオでは、ワークスペースに登録したときにデータセットに割り当てられた名前が表示されます。 次の例では、
training_ds
が表示される名前です。training_ds = unregistered_ds.register(workspace = workspace, name = 'training_ds', description = 'training data' )
スクリプトで登録されていないデータセットを使用して子ジョブを送信します。 これにより、匿名で保存されたデータセットが生成されます。
実験ジョブでのデータセットのトレース
Machine Learning の実験ごとに、実験 Job
オブジェクトを使用して、入力として使用されるデータセットを簡単に追跡できます。
次のコードでは、get_details()
メソッドを使用して、実験の実行でどの入力データセットが使用されたかを追跡します。
# get input datasets
inputs = run.get_details()['inputDatasets']
input_dataset = inputs[0]['dataset']
# list the files referenced by input_dataset
input_dataset.to_path()
また、Azure Machine Learning スタジオを使用して、実験から input_datasets
を見つけることもできます。
次の図は、Azure Machine Learning Studio で実験の入力データセットを探す場所を示しています。 この例では、 [実験] ペインに移動し、実験 keras-mnist
の特定の実行について [プロパティ] タブを開きます。
次のコードを使用して、モデルをデータセットに登録します。
model = run.register_model(model_name='keras-mlp-mnist',
model_path=model_path,
datasets =[('training data',train_dataset)])
登録後は、Python を使用してデータセットに登録されたモデルのリストを表示できます。スタジオに進む方法もあります。
次のビューは、 [資産] の下の [データセット] ペインからのものです。 データセットを選択して、 [モデル] タブを選択し、そのデータセットで登録されたモデルのリストを表示します。