Управление входными и выходными данными компонента и конвейера

В этой статье раскрываются следующие темы.

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

Обзор входных и выходных данных

Машинное обучение Azure конвейеры поддерживают входные и выходные данные как на уровне компонента, так и на уровне конвейера.

На уровне компонента входные и выходные данные определяют интерфейс компонента. Выходные данные одного компонента можно использовать в качестве входных данных для другого компонента в одном родительском конвейере, что позволяет передавать данные или модели между компонентами. Эта взаимосоединение формирует граф, иллюстрируя поток данных в конвейере.

На уровне конвейера входные и выходные данные полезны для отправки заданий конвейера с различными входными данными или параметрами, которые управляют логикой обучения (например learning_rate). Они особенно полезны при вызове конвейера через конечную точку REST. Эти входные и выходные данные позволяют назначать различные значения входным данным конвейера или получать доступ к выходным данным заданий конвейера через конечную точку REST. Дополнительные сведения см. в статье "Создание заданий и входных данных" для конечной точки пакетной службы.

Типы входных и выходных данных

Следующие типы поддерживаются как выходные данные компонента или конвейера.

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

Для этого процесса требуется исходный код компонента, сериализующий нужный выходной объект ( обычно хранящийся в памяти) в файлы. Например, можно сериализовать кадр данных Pandas в виде CSV-файла. Обратите внимание, что Машинное обучение Azure не определяет стандартные методы для сериализации объектов. В качестве пользователя вы можете выбрать предпочтительный метод сериализации объектов в файлы. После этого в нижнем компоненте можно независимо десериализировать и читать эти файлы. Ниже приведены несколько примеров для справки:

  • В примере nyc_taxi_data_regression компонент подготовки имеет выходныеuri_folder данные типа. В исходном коде компонента он считывает CSV-файлы из входной папки, обрабатывает файлы и записывает обработанные CSV-файлы в выходную папку.
  • В nyc_taxi_data_regression примере компонент обучения имеет выходные mlflow_model данные типа. В исходном коде компонента он сохраняет обученную модель с помощью mlflow.sklearn.save_model метода.

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

  • string
  • number
  • integer
  • boolean

В nyc_taxi_data_regression примере компонент обучения имеет входные number данныеtest_split_ratio.

Примечание.

Выходные данные примитивных типов не поддерживаются.

Путь и режим для входных и выходных данных

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

Местонахождение Примеры Входные данные Выходные данные
Путь к локальному компьютеру ./home/username/data/my_data
Путь к общедоступному HTTP(S)-серверу https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv
Путь к службе хранилища Azure wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
Не рекомендуется, так как для чтения данных может потребоваться дополнительная конфигурация удостоверений.
Путь к хранилищу данных Машинное обучение Azure azureml://datastores/<data_store_name>/paths/<path>
Путь к ресурсу данных azureml:<my_data>:<version>

Примечание.

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

Для ввода и вывода данных можно выбрать различные режимы (скачивание, подключение или отправка), чтобы определить способ доступа к данным в целевом объекте вычислений. В этой таблице показаны возможные режимы для различных сочетаний типов,ввода и вывода.

Тип Ввод-вывод upload download ro_mount rw_mount direct eval_download eval_mount
uri_folder Входные данные
uri_file Входные данные
mltable Входные данные
uri_folder Выходные данные
uri_file Выходные данные
mltable Выходные данные

Примечание.

В большинстве случаев рекомендуется использовать ro_mount или rw_mount режим. Дополнительные сведения о режиме см. в режимах ресурса данных.

Визуальное представление в Студия машинного обучения Azure

На следующих снимках экрана приведен пример отображения входных и выходных данных в задании конвейера в Студия машинного обучения Azure. Это конкретное задание с именем nyc-taxi-data-regressionможно найти в azureml-example.

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

Выходные данные уровня конвейера отображаются в виде фиолетового поля для простой идентификации.

Screenshot highlighting the pipeline input and output port.

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

Screenshot highlighting the port type when hovering the mouse.

Входные данные примитивных типов не отображаются на графе. Его можно найти на вкладке Параметры панели обзора задания конвейера (для входных данных уровня конвейера) или на панели компонентов (для входных данных на уровне компонента). На снимка экрана показана вкладка Параметры задания конвейера, которую можно открыть, выбрав ссылку "Обзор задания".

Если вы хотите проверка входные данные для компонента, дважды щелкните компонент, чтобы открыть панель компонентов.

Screenshot highlighting the job overview setting panel.

Аналогичным образом при редактировании конвейера в конструкторе можно найти входные и выходные данные конвейера на панели интерфейса конвейера, а также входные и выходные данные компонента на панели компонента (триггер, дважды щелкнув компонент).

Screenshot highlighting the pipeline interface in designer.

Повышение уровня входных и выходных данных компонентов на уровне конвейера

Повышение входных и выходных данных компонента на уровне конвейера позволяет перезаписать входные и выходные данные компонента при отправке задания конвейера. Кроме того, полезно активировать конвейер с помощью конечной точки REST.

Ниже приведены примеры для повышения входных и выходных данных компонентов до входных и выходных данных на уровне конвейера.

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
display_name: 1b_e2e_registered_components
description: E2E dummy train-score-eval pipeline with registered components

inputs:
  pipeline_job_training_max_epocs: 20
  pipeline_job_training_learning_rate: 1.8
  pipeline_job_learning_rate_schedule: 'time-based'

outputs: 
  pipeline_job_trained_model:
    mode: upload
  pipeline_job_scored_data:
    mode: upload
  pipeline_job_evaluation_report:
    mode: upload

settings:
 default_compute: azureml:cpu-cluster

jobs:
  train_job:
    type: command
    component: azureml:my_train@latest
    inputs:
      training_data: 
        type: uri_folder 
        path: ./data      
      max_epocs: ${{parent.inputs.pipeline_job_training_max_epocs}}
      learning_rate: ${{parent.inputs.pipeline_job_training_learning_rate}}
      learning_rate_schedule: ${{parent.inputs.pipeline_job_learning_rate_schedule}}
    outputs:
      model_output: ${{parent.outputs.pipeline_job_trained_model}}
    services:
      my_vscode:
        type: vs_code
      my_jupyter_lab:
        type: jupyter_lab
      my_tensorboard:
        type: tensor_board
        log_dir: "outputs/tblogs"
    #  my_ssh:
    #    type: tensor_board
    #    ssh_public_keys: <paste the entire pub key content>
    #    nodes: all # Use the `nodes` property to pick which node you want to enable interactive services on. If `nodes` are not selected, by default, interactive applications are only enabled on the head node.

  score_job:
    type: command
    component: azureml:my_score@latest
    inputs:
      model_input: ${{parent.jobs.train_job.outputs.model_output}}
      test_data: 
        type: uri_folder 
        path: ./data
    outputs:
      score_output: ${{parent.outputs.pipeline_job_scored_data}}

  evaluate_job:
    type: command
    component: azureml:my_eval@latest
    inputs:
      scoring_result: ${{parent.jobs.score_job.outputs.score_output}}
    outputs:
      eval_output: ${{parent.outputs.pipeline_job_evaluation_report}}

Полный пример можно найти в конвейере train-score-eval с зарегистрированными компонентами. Этот конвейер обеспечивает три входных и три выходных данных на уровне конвейера. Давайте рассмотрим pipeline_job_training_max_epocs как пример. Он объявлен в разделе inputs на корневом уровне, что означает входные данные на уровне конвейера. В jobs -> train_job разделе указано max_epocs${{parent.inputs.pipeline_job_training_max_epocs}}имя входных данных, которое указывает train_job, что входные ссылки на входные max_epocspipeline_job_training_max_epocsданные уровня конвейера. Аналогичным образом можно повысить выходные данные конвейера с помощью той же схемы.

Студия

Входные данные компонента можно повысить до входных данных на уровне конвейера на странице разработки конструктора. Перейдите на панель параметров компонента, дважды щелкнув компонент .> Найдите входные данные, которые вы хотите повысить.> Выберите три точки справа .> Выберите "Добавить в входные данные конвейера".

Screenshot highlighting how to promote to pipeline input in designer.

Необязательные входные данные

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

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

  • Если у вас есть необязательные входные данные или тип модели и не назначаете ему значение при отправке задания конвейера, в конвейере будет компонент, который не имеет предыдущей зависимости данных. Другими словами, входной порт не связан с каким-либо компонентом или узлом модели или данными. Это приводит к тому, что служба конвейера напрямую вызывает этот компонент, а не ожидает готовности предыдущей зависимости.

  • Снимок экрана ниже содержит четкий пример второго сценария. Если для конвейера установлен continue_on_step_failure = True второй узел (node2), который использует выходные данные первого узла (node1) в качестве необязательных входных данных, node2 по-прежнему будет выполняться, даже если узел1 завершается ошибкой. Однако если узел 2 использует необходимые входные данные из node1, он не будет выполнен, если узел1 завершается ошибкой.

    Screenshot to show the orchestration logic of optional input and continue on failure.

Ниже приведены примеры определения необязательных входных данных.

$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
name: train_data_component_cli
display_name: train_data
description: A example train component
tags:
  author: azureml-sdk-team
version: 9
type: command
inputs:
  training_data: 
    type: uri_folder
  max_epocs:
    type: integer
    optional: true
  learning_rate: 
    type: number
    default: 0.01
    optional: true
  learning_rate_schedule: 
    type: string
    default: time-based
    optional: true
outputs:
  model_output:
    type: uri_folder
code: ./train_src
environment: azureml://registries/azureml/environments/sklearn-1.0/labels/latest
command: >-
  python train.py 
  --training_data ${{inputs.training_data}} 
  $[[--max_epocs ${{inputs.max_epocs}}]]
  $[[--learning_rate ${{inputs.learning_rate}}]]
  $[[--learning_rate_schedule ${{inputs.learning_rate_schedule}}]]
  --model_output ${{outputs.model_output}}

Если входные данные заданы как optional = true, необходимо использовать для $[[]] применения командной строки с входными данными. См. выделенные строки в приведенном выше примере.

Примечание.

Необязательные выходные данные не поддерживаются.

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

Screenshot highlighting the optional input.

Настройка выходного пути

По умолчанию выходные данные компонента будут храниться в azureml://datastores/${{default_datastore}}/paths/${{name}}/${{output_name}}. Клиент {default_datastore} хранилища данных по умолчанию настроен для конвейера. Если не задано хранилище BLOB-объектов рабочей области. Это {name} имя задания, которое будет разрешено во время выполнения задания. Это {output_name} имя выходных данных, определенное в компоненте YAML.

Но вы также можете настроить место хранения выходных данных, определив путь к выходным данным. Ниже приведен пример:

Определяет pipeline.yaml конвейер с тремя выходными данными уровня конвейера. Полный YAML можно найти в конвейере train-score-eval с примером зарегистрированных компонентов. Для задания пользовательского пути вывода для выходных pipeline_job_trained_modelданных можно использовать следующую команду.

# define the custom output path using datastore uri
# add relative path to your blob container after "azureml://datastores/<datastore_name>/paths"
output_path="azureml://datastores/{datastore_name}/paths/{relative_path_of_container}"  

# create job and define path using --outputs.<outputname>
az ml job create -f ./pipeline.yml --set outputs.pipeline_job_trained_model.path=$output_path  

Скачивание выходных данных

Вы можете скачать выходные данные компонента или выходные данные конвейера ниже.

Скачивание выходных данных уровня конвейера

# Download all the outputs of the job
az ml job download --all -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>

# Download specific output
az ml job download --output-name <OUTPUT_PORT_NAME> -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>

Скачивание выходных данных дочернего задания

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

# List all child jobs in the job and print job details in table format
az ml job list --parent-job-name <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID> -o table

# Select needed child job name to download output
az ml job download --all -n <JOB_NAME> -g <RESOURCE_GROUP_NAME> -w <WORKSPACE_NAME> --subscription <SUBSCRIPTION_ID>

Регистрация выходных данных в качестве именованного ресурса

Вы можете зарегистрировать выходные данные компонента или конвейера в качестве именованного ресурса, назначив name и version выходные данные. Зарегистрированный ресурс может быть указан в рабочей области с помощью пользовательского интерфейса студии или интерфейса командной строки или пакета SDK, а также ссылаться на ваши будущие задания.

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

display_name: register_pipeline_output
type: pipeline
jobs:
  node:
    type: command
    inputs:
      component_in_path:
        type: uri_file
        path: https://dprepdata.blob.core.windows.net/demo/Titanic.csv
    component: ../components/helloworld_component.yml
    outputs:
      component_out_path: ${{parent.outputs.component_out_path}}
outputs:
  component_out_path:
    type: mltable
    name: pipeline_output  # Define name and version to register pipeline output
    version: '1'
settings:
  default_compute: azureml:cpu-cluster

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

display_name: register_node_output
type: pipeline
jobs:
  node:
    type: command
    component: ../components/helloworld_component.yml
    inputs:
      component_in_path:
        type: uri_file
        path: 'https://dprepdata.blob.core.windows.net/demo/Titanic.csv'
    outputs:
      component_out_path:
        type: uri_folder
        name: 'node_output'  # Define name and version to register a child job's output
        version: '1'
settings:
  default_compute: azureml:cpu-cluster

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