Компоненты на основе контейнеров обеспечивают гибкость для интеграции кода, написанного на любом языке, в ваш конвейер, при условии, что вы можете выполнить этот код в контейнере 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'),
],
)