Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
在本文中,你将了解如何对 Azure 机器学习数据集进行版本控制和跟踪,以实现可再现性。 数据集版本控制是为数据状态设置书签的一种方法,方便为将来的试验应用数据集的特定版本。
典型的版本控制方案:
- 当新数据可用于重新训练时
- 应用不同的数据准备或特征工程方法时
必备条件
对于本教程的内容,你需要:
安装了适用于 Python 的 Azure 机器学习 SDK。 此 SDK 包括 azureml-datasets 包。
Azure 机器学习工作区。 通过运行以下代码检索现有的工作区,或者创建新的工作区。
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 机器学习在整个试验过程中跟踪数据作为输入和输出数据集。
以下是将数据作为输入数据集进行跟踪的场景。
提交试验作业时,通过
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' )
使用脚本中未注册的数据集提交子作业。 这会生成一个匿名保存数据集。
在试验作业中跟踪数据集
对于每个机器学习试验,可以通过试验 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 机器学习工作室从试验中查找 input_datasets
。
下图展示了在 Azure 机器学习工作室中从何处查找试验的输入数据集。 对于此示例,请转到“试验”窗格,并打开试验 keras-mnist
的特定运行的“属性”选项卡。
使用以下代码向数据集注册模型:
model = run.register_model(model_name='keras-mlp-mnist',
model_path=model_path,
datasets =[('training data',train_dataset)])
注册后,可以使用 Python 或转到工作室查看已注册到数据集中的模型列表。
以下视图来自“资产”下的“数据集”窗格。 选择数据集,然后选择“模型”选项卡以获取向数据集注册的模型的列表。