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

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

Если вы новичок в конвейерах TFX, узнайте больше об основных концепциях конвейеров TFX .

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

Компоненты на основе контейнеров поддерживаются контейнерными программами командной строки. Если у вас уже есть образ контейнера, вы можете использовать TFX для создания из него компонента, используя функцию create_container_component для объявления входных и выходных данных. Параметры функции:

  • name: Имя компонента.
  • входные данные: словарь, который сопоставляет имена входных данных с типами. выходные данные: словарь, который сопоставляет имена выходных данных с типами параметров: словарь, который сопоставляет имена параметров с типами.
  • image: имя образа контейнера и, при необходимости, тег изображения.
  • команда: командная строка точки входа в контейнер. Не выполняется внутри оболочки. В командной строке могут использоваться объекты-заполнители, которые во время компиляции заменяются входными, выходными данными или параметрами. Объекты-заполнители можно импортировать из tfx.dsl.component.experimental.placeholders . Обратите внимание, что шаблоны Jinja не поддерживаются.

Возвращаемое значение: класс компонента, унаследованный от base_comComponent.BaseComponent, экземпляр которого можно создать и использовать внутри конвейера.

Заполнители

Для компонента, имеющего входные или выходные данные, command часто необходимо иметь заполнители, которые заменяются фактическими данными во время выполнения. Для этой цели предусмотрено несколько заполнителей:

  • InputValuePlaceholder : заполнитель для значения входного артефакта. Во время выполнения этот заполнитель заменяется строковым представлением значения артефакта.

  • InputUriPlaceholder : заполнитель для URI аргумента входного артефакта. Во время выполнения этот заполнитель заменяется URI данных входного артефакта.

  • OutputUriPlaceholder : заполнитель для URI аргумента выходного артефакта. Во время выполнения этот заполнитель заменяется URI, в котором компонент должен хранить данные выходного артефакта.

Узнайте больше о заполнителях командной строки компонента TFX .

Пример компонента на основе контейнера

Ниже приведен пример компонента, отличного от Python, который загружает, преобразует и загружает данные:

import tfx.v1 as tfx

grep_component = tfx.dsl.components.create_container_component(
    name='FilterWithGrep',
    inputs={
        'text': tfx.standard_artifacts.ExternalArtifact,
    },
    outputs={
        'filtered_text': tfx.standard_artifacts.ExternalArtifact,
    },
    parameters={
        'pattern': str,
    },
    # The component code uses gsutil to upload the data to Google Cloud Storage, so the
    # container image needs to have gsutil installed and configured.
    image='google/cloud-sdk:278.0.0',
    command=[
        'sh', '-exc',
        '''
          pattern="$1"
          text_uri="$3"/data  # Adding suffix, because currently the URI are "directories". This will be fixed soon.
          text_path=$(mktemp)
          filtered_text_uri="$5"/data  # Adding suffix, because currently the URI are "directories". This will be fixed soon.
          filtered_text_path=$(mktemp)

          # Getting data into the container
          gsutil cp "$text_uri" "$text_path"

          # Running the main code
          grep "$pattern" "$text_path" >"$filtered_text_path"

          # Getting data out of the container
          gsutil cp "$filtered_text_path" "$filtered_text_uri"
        ''',
        '--pattern', tfx.dsl.placeholders.InputValuePlaceholder('pattern'),
        '--text', tfx.dsl.placeholders.InputUriPlaceholder('text'),
        '--filtered-text', tfx.dsl.placeholders.OutputUriPlaceholder('filtered_text'),
    ],
)