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


Создание и запуск конвейеров машинного обучения с помощью компонентов, включающих CLI для Машинного обучения Azure

ОБЛАСТЬ ПРИМЕНЕНИЯ: расширение машинного обучения Azure CLI версии 2 (текущее)

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

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

Рекомендуемые материалы для предварительного ознакомления

Создание первого конвейера с компонентами

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

В каталоге cli/jobs/pipelines-with-components/basics перейдите azureml-examples в подкаталог. В этом каталоге есть три типа файлов. Это файлы, которые необходимо создать при сборке собственного конвейера.

  • pipeline.yml. Этот ФАЙЛ YAML определяет конвейер машинного обучения. В нем описывается, как разбить полную задачу машинного обучения на многоэтапный рабочий процесс. Например, рассмотрим простую задачу машинного обучения использования исторических данных для обучения модели прогнозирования продаж. Может потребоваться создать последовательный рабочий процесс, содержащий обработку данных, обучение модели и этапы оценки модели. Каждый шаг — это компонент, который имеет хорошо определенный интерфейс и может разрабатываться, тестироваться и оптимизироваться независимо. YAML конвейера также определяет, как дочерние шаги подключаются к другим шагам потока. Например, шаг обучения модели создает файл модели, а файл модели передается на шаг оценки модели.

  • component.yml. Эти файлы YAML определяют компоненты. Они содержат следующие сведения:

    • Метаданные: имя, отображаемое имя, версия, описание, тип и т. д. Метаданные помогают описать компонент и управлять ими.
    • Интерфейс: входные и выходные данные. Например, компонент обучения модели принимает данные обучения и количество эпох в качестве входных данных и создает файл обученной модели в качестве выходных данных. После определения интерфейса различные команды могут разрабатывать и тестировать компонент независимо.
    • Команда, код и среда: команда, код и среда для запуска компонента. Эта команда — это команда оболочки для запуска компонента. Код обычно относится к каталогу исходного кода. Среда может быть средой машинного обучения Azure (подготовленной или созданной клиентом), образом Docker или средой conda.
  • component_src. Это каталоги исходного кода для определенных компонентов. Они содержат исходный код, выполняемый в компоненте. Вы можете использовать предпочитаемый язык, включая Python, R и другие. Код должен быть запущен через команду оболочки. Исходный код может принимать несколько входных данных из командной строки оболочки, чтобы управлять выполнением этого шага. Например, этап обучения может принимать обучающие данные, темп обучения и количество эпох, чтобы контролировать процесс обучения. С помощью аргумента команды оболочки входные и выходные данные передаются в код.

Теперь вы создадите 3b_pipeline_with_data конвейер с помощью примера. Каждый файл описан далее в следующих разделах.

Сначала перечислите доступные вычислительные ресурсы с помощью следующей команды:

az ml compute list

Если у вас его нет, создайте кластер, названный cpu-cluster, выполнив следующую команду:

Примечание.

Пропустите этот шаг, чтобы использовать бессерверные вычисления.

az ml compute create -n cpu-cluster --type amlcompute --min-instances 0 --max-instances 10

Теперь создайте задание конвейера, определенное в файле pipeline.yml, выполнив следующую команду. Целевой объект вычислений ссылается в файле pipeline.yml как azureml:cpu-cluster. Если целевой объект вычислений использует другое имя, обязательно обновите его в файле pipeline.yml.

az ml job create --file pipeline.yml

Вы должны получить словарь JSON, содержащий информацию о задаче в конвейере, включая:

Ключ. Описание
name Имя задания на основе GUID.
experiment_name Имя, по которому задания будут организованы в студии.
services.Studio.endpoint URL-адрес для мониторинга и просмотра задания конвейера.
status Состояние задания. Это, вероятно, будет Preparing в данный момент.

Перейдите services.Studio.endpoint по URL-адресу, чтобы просмотреть визуализацию конвейера:

Снимок экрана: визуализация конвейера.

Общие сведения об определении конвейера YAML

Теперь вы увидите определение конвейера в файле 3b_pipeline_with_data/pipeline.yml .

Примечание.

Чтобы использовать бессерверные вычисления, замените default_compute: azureml:cpu-cluster на default_compute: azureml:serverless этот файл.

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline

display_name: 3b_pipeline_with_data
description: Pipeline with 3 component jobs with data dependencies

settings:
  default_compute: azureml:cpu-cluster

outputs:
  final_pipeline_output:
    mode: rw_mount

jobs:
  component_a:
    type: command
    component: ./componentA.yml
    inputs:
      component_a_input: 
        type: uri_folder
        path: ./data

    outputs:
      component_a_output: 
        mode: rw_mount
  component_b:
    type: command
    component: ./componentB.yml
    inputs:
      component_b_input: ${{parent.jobs.component_a.outputs.component_a_output}}
    outputs:
      component_b_output: 
        mode: rw_mount
  component_c:
    type: command
    component: ./componentC.yml
    inputs:
      component_c_input: ${{parent.jobs.component_b.outputs.component_b_output}}
    outputs:
      component_c_output: ${{parent.outputs.final_pipeline_output}}
      #  mode: upload

В следующей таблице описаны наиболее часто используемые поля схемы YAML конвейера. Дополнительные сведения см. в полной схеме YAML конвейера.

Ключ. Описание
type Необходимые. Тип задания. Оно должно быть pipeline для конвейерных заданий.
display_name Отображаемое имя задания конвейера в пользовательском интерфейсе студии. Редактируемый в пользовательском интерфейсе студии. Это не обязательно должно быть уникальным для всех заданий в рабочей области.
jobs Необходимые. Словарь набора отдельных заданий для выполнения в качестве шагов в конвейере. Эти задания считаются дочерними по отношению к заданию родительского конвейера. В текущем выпуске поддерживаемые типы заданий в конвейере — это command и sweep.
inputs Словарь входных данных для задания конвейера. Ключ — это имя входных данных в контексте задания, а значение — входное значение. На эти входные данные конвейера можно ссылаться, используя входные данные отдельного задания шага в конвейере, через выражение ${{ parent.inputs.<input_name> }}.
outputs Словарь выходных конфигураций работы конвейера. Ключ — это имя выходных данных в контексте задания, а значение — выходная конфигурация. Выходные данные конвейера могут быть использованы как выходные данные задания отдельного шага с помощью выражения ${{ parents.outputs.<output_name> }}.

Пример 3b_pipeline_with_data содержит трехэтапный конвейер.

  • Три этапа определяются в разделе jobs. Все три шага относятся к типу command. Определение каждого шага находится в соответствующем component*.yml файле. Вы можете увидеть файлы YAML компонента в каталоге 3b_pipeline_with_data . componentA.yml описано в следующем разделе.
  • Этот конвейер имеет зависимость данных, которая распространена в реальных конвейерах. Компонент A принимает входные данные из локальной папки ./data в (строки 18-21) и передает выходные данные компоненту B (строка 29). Выходные данные компонента A можно называть ${{parent.jobs.component_a.outputs.component_a_output}}.
  • default_compute определяет вычисления по умолчанию для конвейера. Если компонент под jobs определяет другую методику вычислений, параметры, относящиеся к компоненту, учитываются.

Снимок экрана: конвейер с примером данных.

Чтение и запись данных в конвейере

Одним из распространенных сценариев является чтение и запись данных в конвейере. В Машинном обучении Azure используется одна и та же схема для чтения и записи данных для всех типов заданий (задания конвейера, задания команд и задания очистки). Ниже приведены примеры использования данных в конвейерах для распространенных сценариев:

Основные сведения о YAML определения компонента

Ниже приведен файл componentA.yml , пример YAML, определяющий компонент:

$schema: https://azuremlschemas.azureedge.net/latest/commandComponent.schema.json
type: command

name: component_a
display_name: componentA
version: 1

inputs:
  component_a_input:
    type: uri_folder

outputs:
  component_a_output:
    type: uri_folder

code: ./componentA_src

environment: 
  image: python

command: >-
  python hello.py --componentA_input ${{inputs.component_a_input}} --componentA_output ${{outputs.component_a_output}}

Эта таблица определяет наиболее часто используемые поля компонента YAML. Дополнительные сведения см. в полной схеме YAML компонента.

Ключ. Описание
name Необходимые. Имя компонента. Он должен быть уникальным в рабочей области Машинного обучения Azure. Он должен начинаться с строчной буквы. Допустимы строчные буквы, цифры и символы подчеркивания (_). Максимальная длина составляет 255 символов.
display_name Отображаемое имя компонента в пользовательском интерфейсе студии. Он не должен быть уникальным в рабочей области.
command Необходимые. Выполняемая команда
code Локальный путь к каталогу исходного кода, предназначенному для загрузки и использования в компоненте.
environment Необходимые. Среда, используемая для запуска компонента.
inputs Словарь входных данных компонентов. Ключ — это имя входных данных в контексте компонента, а значение — определение входных данных компонента. Вы можете ссылаться на входные данные в команде ${{ inputs.<input_name> }} с помощью выражения.
outputs Словарь выходных данных компонентов. Ключ — это имя выходных данных в контексте компонента, а значение — определение выходных данных компонента. Вы можете ссылаться на выходные данные в команде ${{ outputs.<output_name> }} с помощью выражения.
is_deterministic Следует ли повторно использовать результат предыдущего задания, если входные данные компонента не изменяются. Значение по умолчанию — true. Этот параметр также называется повторно используемым по умолчанию. Общепринятый сценарий при установке false — принудительно перезагрузить данные из облачного хранилища или по URL-адресу.

В примере в 3b_pipeline_with_data/componentA.yml компонент A имеет один вход данных и один выход данных, который можно подключить к другим шагам родительского конвейера. Все файлы из секции code в YAML компонента будут загружены в Azure Machine Learning при отправке задания на выполнение конвейера. В этом примере файлы под ./componentA_src будут загружены. (Строка 16 в componentA.yml.) Вы можете увидеть отправленный исходный код в пользовательском интерфейсе студии: дважды щелкните шаг компонентаA в графе и перейдите на вкладку "Код ", как показано на следующем снимке экрана. Вы можете увидеть, что это скрипт hello-world, выполняющий простую печать, и что он записывает текущую дату и время в componentA_output путь. Компонент принимает входные данные и предоставляет выходные данные через командную строку. Он обрабатывается в hello.py через argparse.

Снимок экрана: конвейер с примером данных. В нем показан компонент A.

Входные и выходные данные

Входные и выходные данные определяют интерфейс компонента. Входные и выходные данные могут быть литеральными значениями (типа string, number, integer или boolean) или объектом, содержащим входную схему.

Входные данные объекта (типаuri_file, , uri_foldermltablemlflow_modelилиcustom_model) могут подключаться к другим шагам в родительском задании конвейера для передачи данных или моделей другим шагам. В графе конвейера входные данные типа объекта отображаются как точка подключения.

Входные данные литеральных значений (string, number, integer) boolean— это параметры, которые можно передать компоненту во время выполнения. Вы можете добавить значение по умолчанию для литеральных входных данных в поле default. Для number и integer типов можно также добавлять минимальные и максимальные значения с помощью min полей и max полей. Если входное значение меньше минимального или больше максимального, конвейер не проходит проверку. Проверка проводится перед запуском задачи в конвейере, что может сэкономить время. Проверка работает для интерфейса командной строки, пакета SDK для Python и пользовательского интерфейса конструктора. На следующем снимке экрана показан пример проверки в пользовательском интерфейсе конструктора. Аналогичным образом можно определить допустимые значения в enum полях.

Снимок экрана ввода и вывода компонента модели линейной регрессии обучения.

Если вы хотите добавить входные данные в компонент, необходимо внести изменения в три места:

  • inputs Поле в компоненте YAML.
  • command Поле в компоненте YAML.
  • В исходном коде компонента для обработки входных данных командной строки.

Эти расположения помечены зелеными полями на предыдущем снимке экрана.

Дополнительные сведения о входных и выходных данных см. в статье "Управление входными и выходными данными" для компонентов и конвейеров.

Окружающая среда

Среда — это среда, в которой выполняется компонент. Это может быть среда машинного обучения Azure (курированная или настраиваемая зарегистрированная), образ Docker или среда conda. См. следующие примеры.

Регистрация компонента для повторного использования и общего доступа

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

В репозитории azureml-examples перейдите в каталог cli/jobs/pipelines-with-components/basics/1b_e2e_registered_components.

Для регистрации компонента используйте команду az ml component create:

az ml component create --file train.yml
az ml component create --file score.yml
az ml component create --file eval.yml

После выполнения этих команд вы увидите компоненты в студии в разделе "Компоненты ресурсов>":

Снимок экрана студии. В нем показаны зарегистрированные компоненты.

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

На вкладке "Сведения" отображаются основные сведения, такие как имя компонента, создавший его, и версия. Существуют редактируемые поля для тегов и описания. Теги можно использовать для добавления ключевых слов поиска. Поле описания поддерживает форматирование Markdown. Его следует использовать для описания функциональных возможностей компонента и базового использования.

На вкладке "Задания " отображается журнал всех заданий, использующих компонент.

Использование зарегистрированных компонентов в файле YAML задания конвейера

Теперь вы будете использовать 1b_e2e_registered_components в качестве примера использования зарегистрированного компонента в конвейере YAML. Перейдите в каталог 1b_e2e_registered_components и откройте файл pipeline.yml. Ключи и значения в полях inputs и outputs похожи на рассмотренные выше. Единственное существенное отличие — значение поля component в записях jobs.<job_name>.component. Значение component находится в форме azureml:<component_name>:<component_version>. Определение train-job , например, указывает, что следует использовать последнюю версию зарегистрированного компонента my_train :

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:

Управление компонентами

Вы можете проверить сведения о компонентах и управлять ими с помощью интерфейса командной строки версии 2. Используйте az ml component -h для получения подробных инструкций по командам компонентов. В следующей таблице перечислены все доступные команды. Дополнительные примеры см. в справочнике по Azure CLI.

командование Описание
az ml component create Создайте компонент.
az ml component list Перечислите компоненты в рабочей области.
az ml component show Отображение сведений о компоненте.
az ml component update Обновите компонент. Только несколько полей (описание, display_name) поддерживают обновление.
az ml component archive Архивируйте контейнер компонентов.
az ml component restore Восстановление архивированного компонента.

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