Конвейеры TFX позволяют организовать рабочий процесс машинного обучения (ML) с помощью оркестраторов, таких как Apache Airflow, Apache Beam и Kubeflow Pipelines. Конвейеры организуют рабочий процесс в последовательность компонентов, где каждый компонент выполняет этап рабочего процесса машинного обучения. Стандартные компоненты TFX обеспечивают проверенную функциональность, которая поможет вам легко приступить к созданию рабочего процесса машинного обучения. Вы также можете включить в свой рабочий процесс пользовательские компоненты. Пользовательские компоненты позволяют расширить рабочий процесс машинного обучения за счет:
- Создание компонентов, адаптированных к вашим потребностям, например получение данных из собственной системы.
- Применение увеличения, повышения или понижения разрешения данных.
- Выполните обнаружение аномалий на основе доверительных интервалов или ошибки воспроизведения автоэнкодера.
- Взаимодействие с внешними системами, такими как службы поддержки, для оповещения и мониторинга.
- Применение меток к немаркированным примерам.
- Интеграция инструментов, созданных на языках, отличных от Python, в рабочий процесс машинного обучения, например выполнение анализа данных с использованием R.
Смешивая стандартные и пользовательские компоненты, вы можете построить рабочий процесс машинного обучения, отвечающий вашим потребностям, используя при этом лучшие практики, встроенные в стандартные компоненты TFX.
В этом руководстве описаны концепции, необходимые для понимания пользовательских компонентов TFX, а также различные способы создания пользовательских компонентов.
Анатомия компонента TFX
В этом разделе представлен общий обзор состава компонента TFX. Если вы новичок в конвейерах TFX, изучите основные концепции, прочитав руководство по пониманию конвейеров TFX .
Компоненты TFX состоят из спецификации компонента и класса исполнителя, которые упакованы в класс интерфейса компонента.
Спецификация компонента определяет контракт ввода и вывода компонента. Этот контракт определяет входные и выходные артефакты компонента, а также параметры, которые используются для выполнения компонента.
Класс исполнителя компонента обеспечивает реализацию работы, выполняемой компонентом.
Класс интерфейса компонента объединяет спецификацию компонента с исполнителем для использования в качестве компонента в конвейере TFX.
Компоненты TFX во время выполнения
Когда конвейер запускает компонент TFX, этот компонент выполняется в три этапа:
- Сначала Драйвер использует спецификацию компонента для получения необходимых артефактов из хранилища метаданных и передачи их в компонент.
- Далее Исполнитель выполняет работу компонента.
- Затем издатель использует спецификацию компонента и результаты исполнителя для сохранения выходных данных компонента в хранилище метаданных.
Большинство реализаций пользовательских компонентов не требуют настройки драйвера или издателя. Обычно изменения драйвера и издателя необходимы только в том случае, если вы хотите изменить взаимодействие между компонентами вашего конвейера и хранилищем метаданных. Если вы хотите изменить только входы, выходы или параметры вашего компонента, вам нужно всего лишь изменить спецификацию компонента .
Типы пользовательских компонентов
Существует три типа пользовательских компонентов: компоненты на основе функций Python, компоненты на основе контейнеров и полностью настраиваемые компоненты. В следующих разделах описаны различные типы компонентов и случаи, когда следует использовать каждый подход.
Компоненты Python, основанные на функциях
Компоненты на основе функций Python легче создавать, чем компоненты на основе контейнеров или полностью настраиваемые компоненты. Спецификация компонента определяется в аргументах функции Python с использованием аннотаций типов, которые описывают, является ли аргумент входным артефактом, выходным артефактом или параметром. Тело функции определяет исполнителя компонента. Интерфейс компонента определяется добавлением декоратора @component
к вашей функции.
Украсив свою функцию декоратором @component
и определив аргументы функции с помощью аннотаций типов, вы можете создать компонент без сложностей, связанных с созданием спецификации компонента, исполнителя и интерфейса компонента.
Узнайте, как создавать компоненты на основе функций Python .
Компоненты на основе контейнеров
Компоненты на основе контейнеров обеспечивают гибкость для интеграции кода, написанного на любом языке, в ваш конвейер, при условии, что вы можете выполнить этот код в контейнере Docker. Чтобы создать компонент на основе контейнера, необходимо создать образ контейнера Docker, содержащий исполняемый код вашего компонента. Затем вы должны вызвать функцию create_container_component
, чтобы определить:
- Входы, выходы и параметры спецификации вашего компонента.
- Образ контейнера и команда, которую запускает исполнитель компонента.
Эта функция возвращает экземпляр компонента, который вы можете включить в определение конвейера.
Этот подход более сложен, чем создание компонента на основе функций Python, поскольку он требует упаковки вашего кода в виде образа контейнера. Этот подход наиболее подходит для включения в конвейер кода, отличного от Python, или для создания компонентов Python со сложными средами выполнения или зависимостями.
Узнайте, как создавать компоненты на основе контейнеров .
Полностью пользовательские компоненты
Полностью настраиваемые компоненты позволяют создавать компоненты, определяя классы спецификации компонента, исполнителя и интерфейса компонента. Такой подход позволяет повторно использовать и расширять стандартный компонент в соответствии с вашими потребностями.
Если существующий компонент определен с теми же входными и выходными данными, что и разрабатываемый вами пользовательский компонент, вы можете просто переопределить класс Executor существующего компонента. Это означает, что вы можете повторно использовать спецификацию компонента и реализовать новый исполнитель, производный от существующего компонента. Таким образом, вы повторно используете функциональные возможности, встроенные в существующие компоненты, и реализуете только те функции, которые необходимы.
Однако если входные и выходные данные вашего нового компонента уникальны, вы можете определить совершенно новую спецификацию компонента .
Этот подход лучше всего подходит для повторного использования существующих спецификаций компонентов и исполнителей.
Узнайте, как создавать полностью пользовательские компоненты .