Понимание пользовательских компонентов TFX

Конвейеры TFX позволяют организовать рабочий процесс машинного обучения (ML) с помощью оркестраторов, таких как Apache Airflow, Apache Beam и Kubeflow Pipelines. Конвейеры организуют рабочий процесс в последовательность компонентов, где каждый компонент выполняет этап рабочего процесса машинного обучения. Стандартные компоненты TFX обеспечивают проверенную функциональность, которая поможет вам легко приступить к созданию рабочего процесса машинного обучения. Вы также можете включить в свой рабочий процесс пользовательские компоненты. Пользовательские компоненты позволяют расширить рабочий процесс машинного обучения за счет:

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

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

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

Анатомия компонента TFX

В этом разделе представлен общий обзор состава компонента TFX. Если вы новичок в конвейерах TFX, изучите основные концепции, прочитав руководство по пониманию конвейеров TFX .

Компоненты TFX состоят из спецификации компонента и класса исполнителя, которые упакованы в класс интерфейса компонента.

Спецификация компонента определяет контракт ввода и вывода компонента. Этот контракт определяет входные и выходные артефакты компонента, а также параметры, которые используются для выполнения компонента.

Класс исполнителя компонента обеспечивает реализацию работы, выполняемой компонентом.

Класс интерфейса компонента объединяет спецификацию компонента с исполнителем для использования в качестве компонента в конвейере TFX.

Компоненты TFX во время выполнения

Когда конвейер запускает компонент TFX, этот компонент выполняется в три этапа:

  1. Сначала Драйвер использует спецификацию компонента для получения необходимых артефактов из хранилища метаданных и передачи их в компонент.
  2. Далее Исполнитель выполняет работу компонента.
  3. Затем издатель использует спецификацию компонента и результаты исполнителя для сохранения выходных данных компонента в хранилище метаданных.

Анатомия компонентов

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

Типы пользовательских компонентов

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

Компоненты Python, основанные на функциях

Компоненты на основе функций Python легче создавать, чем компоненты на основе контейнеров или полностью настраиваемые компоненты. Спецификация компонента определяется в аргументах функции Python с использованием аннотаций типов, которые описывают, является ли аргумент входным артефактом, выходным артефактом или параметром. Тело функции определяет исполнителя компонента. Интерфейс компонента определяется добавлением декоратора @component к вашей функции.

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

Узнайте, как создавать компоненты на основе функций Python .

Компоненты на основе контейнеров

Компоненты на основе контейнеров обеспечивают гибкость для интеграции кода, написанного на любом языке, в ваш конвейер, при условии, что вы можете выполнить этот код в контейнере Docker. Чтобы создать компонент на основе контейнера, необходимо создать образ контейнера Docker, содержащий исполняемый код вашего компонента. Затем вы должны вызвать функцию create_container_component , чтобы определить:

  • Входы, выходы и параметры спецификации вашего компонента.
  • Образ контейнера и команда, которую запускает исполнитель компонента.

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

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

Узнайте, как создавать компоненты на основе контейнеров .

Полностью пользовательские компоненты

Полностью настраиваемые компоненты позволяют создавать компоненты, определяя классы спецификации компонента, исполнителя и интерфейса компонента. Такой подход позволяет повторно использовать и расширять стандартный компонент в соответствии с вашими потребностями.

Если существующий компонент определен с теми же входными и выходными данными, что и разрабатываемый вами пользовательский компонент, вы можете просто переопределить класс Executor существующего компонента. Это означает, что вы можете повторно использовать спецификацию компонента и реализовать новый исполнитель, производный от существующего компонента. Таким образом, вы повторно используете функциональные возможности, встроенные в существующие компоненты, и реализуете только те функции, которые необходимы.

Однако если входные и выходные данные вашего нового компонента уникальны, вы можете определить совершенно новую спецификацию компонента .

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

Узнайте, как создавать полностью пользовательские компоненты .