Перемещение данных в этапы конвейера машинного обучения и между ними (Python)
ОБЛАСТЬ ПРИМЕНЕНИЯ:Пакет SDK для Python azureml версии 1
В этой статье предоставляется код для импорта, преобразования и перемещения данных между этапами в конвейере машинного обучения Azure. Общие сведения об использовании данных в Машинном обучении Azure см. в статье Доступ к данным в службах хранилища Azure. Преимущества и структура конвейеров машинного обучения Azure описаны в статье Что представляют собой конвейеры машинного обучения Azure?
В этой статье показано, как выполнить следующие действия:
- Использовать объекты
Dataset
для уже существующих данных - Получать доступ к данным при выполнении этапов
- Разделять данные
Dataset
на подмножества, например подмножества обучения и проверки - Создавать объекты
OutputFileDatasetConfig
для передачи данных на следующий этап конвейера - Использовать объекты
OutputFileDatasetConfig
в качестве входов для этапов конвейера - Создавать новые объекты
Dataset
из сохраняемыхOutputFileDatasetConfig
Предварительные требования
Вам необходимы:
Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу. Попробуйте бесплатную или платную версию Машинного обучения Azure.
Пакет SDK для Машинного обучения Azure для Python или доступ к Студии машинного обучения Azure.
Рабочая область машинного обучения Azure.
Создайте рабочую область Машинного обучения Azure или используйте существующую с помощью пакета SDK для Python. Импортируйте классы
Workspace
иDatastore
и загрузите сведения о подписке из файлаconfig.json
с помощью функцииfrom_config()
. Эта функция выполняет поиск файла JSON в текущем каталоге, выбираемом по умолчанию, но также можно задать параметр пути, указывающий на файл, используяfrom_config(path="your/file/path")
.import azureml.core from azureml.core import Workspace, Datastore ws = Workspace.from_config()
Ранее существовавшие данные. В этой статье кратко описано использование контейнера больших двоичных объектов (BLOB-объектов) Azure.
Необязательно. Существующий конвейер машинного обучения, например описанный в статье Создание и запуск конвейеров машинного обучения с помощью пакета SDK для машинного обучения Azure.
Использовать объекты Dataset
для уже существующих данных
Предпочтительный способ приема данных в конвейер — это использование объекта DataSet. Объекты Dataset
представляют постоянные данные, доступные во всей рабочей области.
Есть много способов создания и регистрации объектов Dataset
. Табличные наборы данных предназначены для данных с разделителями, доступных в одном или нескольких файлах. Наборы данных файлов предназначены для двоичных данных (например, изображений) или для анализируемых данных. Самый простой программный способ создания объектов Dataset
— это использование существующих BLOB-объектов в хранилище рабочей области или общедоступных URL:
datastore = Datastore.get(workspace, 'training_data')
iris_dataset = Dataset.Tabular.from_delimited_files(DataPath(datastore, 'iris.csv'))
datastore_path = [
DataPath(datastore, 'animals/dog/1.jpg'),
DataPath(datastore, 'animals/dog/2.jpg'),
DataPath(datastore, 'animals/cat/*.jpg')
]
cats_dogs_dataset = Dataset.File.from_files(path=datastore_path)
Другие варианты создания наборов данных с разными параметрами и из разных источников, их регистрации и просмотра в пользовательском интерфейсе Машинного обучения Azure, влияние размера данных на производительность вычислений и управление версиями описаны в разделе Создание наборов данных для Машинного обучения Azure.
Передача наборов данных в сценарий
Чтобы передать путь к набору данных в сценарий, используйте относящийся к объекту Dataset
метод as_named_input()
. Можно либо передать результирующий объект DatasetConsumptionConfig
в сценарий в качестве аргумента, либо использовать аргумент inputs
для сценария конвейера, чтобы извлечь набор данных с помощью Run.get_context().input_datasets[]
.
После создания именованных входных данных можно выбрать режим доступа (только для FileDataset): as_mount()
или as_download()
. Если сценарий обрабатывает все файлы в наборе данных, и диск в ресурсе вычислений достаточно вместителен для набора данных, лучше использовать режим доступа с загрузкой. Режим доступа для скачивания позволяет избежать затрат на потоковую передачу данных во время выполнения. Если сценарий получает доступ к подмножеству набора данных или если он слишком велик для вычислений, используйте режим доступа с установкой. Дополнительные сведения см. в статье Сравнение установки и загрузки
Чтобы передать набор данных на этап конвейера, выполните следующие действия.
- Используйте
TabularDataset.as_named_input()
илиFileDataset.as_named_input()
(без s на конце), чтобы создать объектDatasetConsumptionConfig
. - Только для
FileDataset
:. Используйтеas_mount()
илиas_download()
, чтобы задать режим доступа. TabularDataset не поддерживает режим доступа set. - Передайте наборы данных на этапы конвейера, используя аргумент
arguments
илиinputs
.
В следующем фрагменте кода показан общий шаблон объединения этих шагов в конструкторе PythonScriptStep
с помощью iris_dataset (TabularDataset):
train_step = PythonScriptStep(
name="train_data",
script_name="train.py",
compute_target=cluster,
inputs=[iris_dataset.as_named_input('iris')]
)
Примечание
Необходимо заменить значения для всех этих аргументов ("train_data"
"train.py"
cluster
и iris_dataset
) собственными данными.
Приведенный выше фрагмент только демонстрирует форму вызова и не является частью примера Microsoft.
Также можно использовать такие методы как random_split()
и take_sample()
, чтобы создать несколько входов или уменьшить объем данных, передаваемых на этап конвейера:
seed = 42 # PRNG seed
smaller_dataset = iris_dataset.take_sample(0.1, seed=seed) # 10%
train, test = smaller_dataset.random_split(percentage=0.8, seed=seed)
train_step = PythonScriptStep(
name="train_data",
script_name="train.py",
compute_target=cluster,
inputs=[train.as_named_input('train'), test.as_named_input('test')]
)
Доступ к наборам данных в сценарии
Именованные входы для сценария этапа конвейера доступны в формате словаря внутри объекта Run
. Извлеките активный объект Run
, используя Run.get_context()
, а затем извлеките словарь именованных входов, используя input_datasets
. Если объект DatasetConsumptionConfig
передан с использованием аргумента arguments
, а не аргумента inputs
, получите доступ к данным, используя код ArgParser
. Оба метода демонстрируются в следующих фрагментах кода:
Скрипт определения конвейера
# Code for demonstration only: It would be very confusing to split datasets between `arguments` and `inputs`
train_step = PythonScriptStep(
name="train_data",
script_name="train.py",
compute_target=cluster,
# datasets passed as arguments
arguments=['--training-folder', train.as_named_input('train').as_download()],
# datasets passed as inputs
inputs=[test.as_named_input('test').as_download()]
)
Скрипт train.py
, на который ссылается PythonScriptStep
# In pipeline script
parser = argparse.ArgumentParser()
# Retreive the dataset passed as an argument
parser.add_argument('--training-folder', type=str, dest='train_folder', help='training data folder mounting point')
args = parser.parse_args()
training_data_folder = args.train_folder
# Retrieve the dataset passed as an input
testing_data_folder = Run.get_context().input_datasets['test']
Переданное значение — это путь к файлам набора данных.
Также можно получить доступ к зарегистрированному Dataset
напрямую. Поскольку зарегистрированные наборы данных являются постоянными и открыты для общего доступа во всей рабочей области, их можно извлечь напрямую.
run = Run.get_context()
ws = run.experiment.workspace
ds = Dataset.get_by_name(workspace=ws, name='mnist_opendataset')
Примечание
Приведенные выше фрагменты иллюстрируют форму вызовов и не являются частью примера Microsoft. Требуется заменить аргументы значениями из собственного проекта.
Использование OutputFileDatasetConfig
для промежуточных данных
Объекты Dataset
представляют только постоянные данные, но при этом объект (-ы) OutputFileDatasetConfig
можно использовать для временного вывода из этапов конвейера постоянных выходных данных и. OutputFileDatasetConfig
поддерживает запись данных в хранилище BLOB-объектов, общую папку, fileshare, adlsgen1 или adlsgen2. Он поддерживает режим с установкой и режим с загрузкой. В режиме с установкой файлы, записанные в установленный каталог, помещаются на постоянное хранение при закрытии файла. В режиме с загрузкой файлы, записанные в выходной каталог, загружаются по окончании задания. Если задание завершается сбоем или отменено, выходной каталог не будет отправлен.
Поведение объекта OutputFileDatasetConfig
по умолчанию — это запись в используемое по умолчанию хранилище данных рабочей области. Передайте объекты OutputFileDatasetConfig
в PythonScriptStep
с параметром arguments
.
from azureml.data import OutputFileDatasetConfig
dataprep_output = OutputFileDatasetConfig()
input_dataset = Dataset.get_by_name(workspace, 'raw_data')
dataprep_step = PythonScriptStep(
name="prep_data",
script_name="dataprep.py",
compute_target=cluster,
arguments=[input_dataset.as_named_input('raw_data').as_mount(), dataprep_output]
)
Примечание
Параллельная одновременная запись в OutputFileDatasetConfig
приведет к сбою. Не пытайтесь использовать один OutputFileDatasetConfig
параллельно и одновременно. Не предоставляйте общий доступ к одному OutputFileDatasetConfig
в ситуации многопроцессной обработки, например при использовании распределенного обучения.
Использование OutputFileDatasetConfig
в качестве выходов этапа обучения
В PythonScriptStep
конвейера можно получить доступные пути вывода с помощью аргументов программы. Если этот шаг является первым и будет инициализировать выходные данные, необходимо создать каталог по указанному пути. Затем можно записать любые файлы, которые должны содержаться в OutputFileDatasetConfig
.
parser = argparse.ArgumentParser()
parser.add_argument('--output_path', dest='output_path', required=True)
args = parser.parse_args()
# Make directory for file
os.makedirs(os.path.dirname(args.output_path), exist_ok=True)
with open(args.output_path, 'w') as f:
f.write("Step 1's output")
Считайте OutputFileDatasetConfig
как входы для неначальных этапов
После того как начальный этап конвейера записывает те или иные данные в путь OutputFileDatasetConfig
, который становится выходом этого начального этапа, его можно использовать в качестве входа для последующего этапа.
В приведенном ниже коде выполняется следующее:
step1_output_data
показывает, что выход PythonScriptStep,step1
, записывается в хранилище данных ADLS Gen 2,my_adlsgen2
, в режиме доступа с загрузкой. Прочитайте дополнительные сведения о настройке разрешений роли для записи данных в ADLS Gen 2.После того как
step1
завершается и выходные данные записываются в место назначения, указанное в параметреstep1_output_data
, этап 2 готов использоватьstep1_output_data
в качестве входных данных.
# get adls gen 2 datastore already registered with the workspace
datastore = workspace.datastores['my_adlsgen2']
step1_output_data = OutputFileDatasetConfig(name="processed_data", destination=(datastore, "mypath/{run-id}/{output-name}")).as_upload()
step1 = PythonScriptStep(
name="generate_data",
script_name="step1.py",
runconfig = aml_run_config,
arguments = ["--output_path", step1_output_data]
)
step2 = PythonScriptStep(
name="read_pipeline_data",
script_name="step2.py",
compute_target=compute,
runconfig = aml_run_config,
arguments = ["--pd", step1_output_data.as_input()]
)
pipeline = Pipeline(workspace=ws, steps=[step1, step2])
Совет
Чтение данных в скрипте step2.py
Python выполняется так же, как описано ранее в разделе Наборы данных Access в скрипте. Используйте ArgumentParser
для добавления аргумента --pd
в скрипт для доступа к данным.
Регистрация объектов OutputFileDatasetConfig
для повторного использования
Чтобы сделать OutputFileDatasetConfig
доступным на период, превышающий длительность эксперимента, зарегистрируйте его в рабочей области для общего доступа и повторного использования в экспериментах.
step1_output_ds = step1_output_data.register_on_complete(
name='processed_data',
description = 'files from step1'
)
Удаление OutputFileDatasetConfig
содержимого, которое впредь не требуется
Azure не удаляет автоматически промежуточные данные, записанные с OutputFileDatasetConfig
помощью . Чтобы избежать расходов на хранение больших объемов ненужных данных, необходимо выполнять одно из следующих действий.
Внимание!
Удалять промежуточные данные можно только через 30 дней с даты последнего изменения данных. Удаление данных ранее может привести к сбою запуска конвейера, так как конвейер предполагает, что промежуточные данные существуют в течение 30 дней для повторного использования.
- Программное удаление промежуточных данных в конце задания конвейера, когда они больше не нужны.
- Используйте хранилище BLOB-объектов с краткосрочной политикой хранения для промежуточных данных (см. раздел Оптимизация затрат путем автоматизации Хранилище BLOB-объектов Azure уровней доступа). Эту политику можно задать только для хранилища данных рабочей области, отличного от хранилища данных по умолчанию. Используйте для
OutputFileDatasetConfig
экспорта промежуточных данных в другое хранилище данных, которое не используется по умолчанию.# Get adls gen 2 datastore already registered with the workspace datastore = workspace.datastores['my_adlsgen2'] step1_output_data = OutputFileDatasetConfig(name="processed_data", destination=(datastore, "mypath/{run-id}/{output-name}")).as_upload()
- Регулярно просматривайте и удаляйте ненужные данные.
Дополнительные сведения см. в статье Планирование и управление затратами на машинное обучение Azure.