Поделиться через


Перемещение данных в этапы конвейера машинного обучения (Python) и между ними

ПРИМЕНЯЕТСЯ К:Пакет SDK машинного обучения Azure версии 1 для Python

Это важно

В этой статье содержатся сведения об использовании пакета SDK машинного обучения Azure версии 1. Пакет SDK версии 1 устарел с 31 марта 2025 г. Поддержка будет завершена 30 июня 2026 г. Вы можете установить и использовать пакет SDK версии 1 до этой даты.

Рекомендуется перейти на пакет SDK версии 2 до 30 июня 2026 г. Дополнительные сведения о пакете SDK версии 2 см. в статье "Что такое ИНТЕРФЕЙС командной строки Машинного обучения Azure" и пакет SDK для Python версии 2 исправочник по пакету SDK версии 2.

В этой статье содержится код для импорта данных, преобразования данных и перемещения данных между шагами в конвейере машинного обучения Azure. Общие сведения об использовании данных в Машинном обучении Azure см. в статье Доступ к данным в службах хранилища Azure. Сведения о преимуществах и структуре конвейеров машинного обучения Azure см. в статье "Что такое конвейеры машинного обучения Azure?".

В этой статье показано, как сделать следующее:

  • Используйте Dataset объекты для существующих данных
  • Получать доступ к данным при выполнении этапов
  • Разделять данные Dataset на подмножества, например подмножества обучения и проверки
  • Создавать объекты OutputFileDatasetConfig для передачи данных на следующий этап конвейера
  • Использовать объекты OutputFileDatasetConfig в качестве входов для этапов конвейера
  • Создайте новые объекты Dataset из OutputFileDatasetConfig, которые вы хотите сохранить.

Необходимые компоненты

Используйте 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(). Если скрипт обрабатывает все файлы в наборе данных и диск на вычислительном ресурсе достаточно велик для набора данных, то режим доступа к скачиванию лучше выбрать. Режим доступа к скачиванию позволяет избежать затрат на потоковую передачу данных во время выполнения. Если ваш скрипт обращается к подмножеству набора данных или слишком велик для ваших вычислительных ресурсов, используйте режим монтирования. Дополнительные сведения см. в разделе "Подключение и скачивание".

Чтобы передать набор данных на этап конвейера, выполните следующие действия.

  1. Использование TabularDataset.as_named_input() или FileDataset.as_named_input() (нет в конце) для создания DatasetConsumptionConfig объекта
  2. as_download() С TabularDataset нельзя задать режим доступа.
  3. Передавайте наборы данных в шаги конвейера, используя либо 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) собственными данными. Приведенный выше фрагмент просто показывает форму вызова и не является частью примера Майкрософт.

Вы также можете использовать такие методы, как 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. Оба метода демонстрируются в следующих фрагментах кода:

Скрипт определения конвейера

# Code is for demonstration only: It would be 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()
# Retrieve 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']

Переданное значение — это путь к файлу или файлам набора данных.

Так как зарегистрированные наборы данных являются постоянными и общими для рабочей области, их можно получить напрямую:

run = Run.get_context()
ws = run.experiment.workspace
ds = Dataset.get_by_name(workspace=ws, name='mnist_opendataset')

Примечание.

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

Использование OutputFileDatasetConfig для промежуточных данных

Хотя Dataset объекты представляют только постоянные данные, OutputFileDatasetConfig объекты можно использовать для временных выходных данных из шагов конвейера и для постоянных выходных данных. OutputFileDatasetConfig поддерживает запись данных в хранилище BLOB-объектов, общую папку, Azure Data Lake Storage 1-го поколения или Data Lake Storage 2-го поколения. Он поддерживает режим с установкой и режим с загрузкой. В режиме с установкой файлы, записанные в установленный каталог, помещаются на постоянное хранение при закрытии файла. В режиме с загрузкой файлы, записанные в выходной каталог, загружаются по окончании задания. Если задание завершается ошибкой или отменяется, выходной каталог не отправляется.

Поведение 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 указывает, что выходные данные PythonScriptStepstep1 записываются в хранилище данных Data Lake Storage второго поколения my_adlsgen2 в режиме доступа на загрузку. Сведения о настройке разрешений роли для записи данных в хранилища data Lake Storage 2-го поколения см. в статье "Подключение к службам хранилища в Azure с помощью хранилищ".

  • После завершения step1 и записи выходных данных в место назначения, указанное step1_output_data, step2 готово использовать step1_output_data в качестве входных данных.

# Get Data Lake Storage Gen2 datastore that's 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. Чтобы избежать расходов на хранение больших объемов ненужных данных, следует выполнить одно из следующих действий:

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

  • Используйте хранилище BLOB-объектов с краткосрочной политикой хранения для промежуточных данных. (См. статью "Оптимизация затрат путем автоматизации уровней доступа к хранилищу BLOB-объектов Azure".) Эту политику можно задать только в хранилище данных, отличном от рабочей области. Используется OutputFileDatasetConfig для экспорта промежуточных данных в другое хранилище данных, которое не является стандартным.

    # Get Data Lake Storage Gen2 datastore that's 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()
    
  • Регулярно просматривайте данные и удаляйте данные, которые вам не нужны.

Внимание

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

Дополнительные сведения см. в разделе "Планирование управления затратами на Машинное обучение Azure".

Следующие шаги