Управление версиями и отслеживание наборов данных машинного обучения Azure

ОБЛАСТЬ ПРИМЕНЕНИЯ:Пакет SDK для Python для ML Azure версии 1

В этой статье вы узнаете, как управлять версиями наборов данных машинного обучения и как их отслеживать с целью воспроизводимости. Управление версиями наборов данных — это способ добавить состояние данных в закладки, позволяющий применять определенную версию набора данных для последующих экспериментов.

Типовые сценарии управления версиями:

  • доступность новых данных для переобучения;
  • применение других подходов к подготовке данных или проектированию компонентов.

Предварительные требования

Для работы с этим руководством необходимы указанные ниже компоненты.

Регистрация и получение версий наборов данных

Зарегистрировав набор данных, вы сможете управлять его версиями, использовать его повторно, применять его в других экспериментах и делиться им с коллегами. Вы можете зарегистрировать несколько наборов данных с одним и тем же именем и получить определенную версию по имени и номеру версии.

Регистрация версии набора данных

Следующий код регистрирует новую версию набора данных titanic_ds, присваивая параметру create_new_version значение True. Если в рабочей области нет уже зарегистрированного набора данных titanic_ds, код создает новый набор данных с именем titanic_ds и назначает ему версию 1.

titanic_ds = titanic_ds.register(workspace = workspace,
                                 name = 'titanic_ds',
                                 description = 'titanic training data',
                                 create_new_version = True)

Получение набора данных по имени

По умолчанию метод get_by_name() в классе Dataset возвращает последнюю версию набора данных, зарегистрированную в рабочей области.

Следующий код получает версию 1 набора данных titanic_ds.

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)

Управление версиями набора выходных данных конвейера машинного обучения

Набор данных можно использовать как входные и выходные данные каждого шага конвейера машинного обучения. При повторном запуске конвейеров выходные данные каждого шага конвейера регистрируются как новая версия набора данных.

Конвейеры машинного обучения отправляют выходные данные каждого шага в новую папку при каждом повторном выполнении конвейера. Такое поведение обеспечивает воспроизводимость выходных наборов данных с управлением версиями. Дополнительные сведения о наборах данных в конвейерах.

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 отслеживает ваши данные во время эксперимента как входные и выходные наборы данных.

Ваши данные отслеживаются как входной набор данных в следующих случаях:

  • Как объект DatasetConsumptionConfig с помощью параметра inputs или arguments объекта ScriptRunConfig при отправке задания эксперимента.

  • При вызове в сценарии таких методов, как get_by_name() или get_by_id(). В этом сценарии имя, присвоенное набору данных при его регистрации в рабочей области, является отображаемым именем.

Ваши данные отслеживаются как выходной набор данных в следующих случаях:

  • При передаче объекта OutputFileDatasetConfig через параметра outputs или arguments в процессе отправки задания эксперимента. Объекты OutputFileDatasetConfig также можно использовать для сохранения данных между разными шагами конвейера. См. раздел Перемещение данных между шагами конвейера машинного обучения.

  • Регистрация набора данных в сценарии. В этом сценарии имя, присвоенное набору данных при его регистрации в рабочей области, является отображаемым именем. В следующем примере 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()

Для поиска input_datasets из экспериментов можно также использовать студию машинного обучения Azure.

На следующем рисунке показано, где найти входной набор данных эксперимента в студии машинного обучения Azure. В этом примере откройте область Эксперименты и выберите вкладку Свойства для соответствующего запуска вашего эксперимента keras-mnist.

Входные наборы данных

Используйте следующий код для регистрации моделей с наборами данных:

model = run.register_model(model_name='keras-mlp-mnist',
                           model_path=model_path,
                           datasets =[('training data',train_dataset)])

После регистрации вы можете увидеть список моделей, зарегистрированных в наборе данных, с помощью Python или в студии.

Следующее представление взято из области Наборы данных, раздел Активы. Выберите набор данных, а затем откройте вкладку Модели, чтобы увидеть список моделей, зарегистрированных в наборе данных.

Модели входных наборов данных

Дальнейшие действия