Komponenty oparte na kontenerach zapewniają elastyczność integracji kodu napisanego w dowolnym języku z potokiem, o ile można wykonać ten kod w kontenerze platformy Docker.
Jeśli nie masz doświadczenia z potokami TFX, dowiedz się więcej o podstawowych koncepcjach potoków TFX .
Tworzenie komponentu opartego na kontenerze
Komponenty oparte na kontenerach są obsługiwane przez konteneryzowane programy wiersza poleceń. Jeśli masz już obraz kontenera, możesz użyć TFX, aby utworzyć z niego komponent, używając funkcji create_container_component
do zadeklarowania wejść i wyjść. Parametry funkcji:
- nazwa: nazwa komponentu.
- wejścia: słownik, który odwzorowuje nazwy wejściowe na typy. Outputs: Słownik odwzorowujący nazwy wyników na typy. Parametry: Słownik odwzorowujący nazwy parametrów na typy.
- image: nazwa obrazu kontenera i opcjonalnie tag obrazu.
- polecenie: Wiersz poleceń punktu wejścia kontenera. Nie wykonywane w powłoce. W wierszu poleceń można używać obiektów zastępczych, które w czasie kompilacji są zastępowane danymi wejściowymi, wyjściowymi lub parametrem. Obiekty zastępcze można zaimportować z
tfx.dsl.component.experimental.placeholders
. Pamiętaj, że szablony Jinja nie są obsługiwane.
Wartość zwracana: klasa komponentu dziedzicząca z base_component.BaseComponent, która może zostać utworzona i użyta wewnątrz potoku.
Elementy zastępcze
W przypadku komponentu, który ma dane wejściowe lub wyjściowe, command
często musi zawierać elementy zastępcze, które w czasie wykonywania są zastępowane rzeczywistymi danymi. W tym celu dostępnych jest kilka symboli zastępczych:
InputValuePlaceholder
: Symbol zastępczy wartości artefaktu wejściowego. W czasie wykonywania ten symbol zastępczy jest zastępowany ciągiem reprezentującym wartość artefaktu.InputUriPlaceholder
: Symbol zastępczy identyfikatora URI argumentu artefaktu wejściowego. W czasie wykonywania ten symbol zastępczy jest zastępowany identyfikatorem URI danych artefaktu wejściowego.OutputUriPlaceholder
: Symbol zastępczy identyfikatora URI argumentu artefaktu wyjściowego. W czasie wykonywania ten symbol zastępczy jest zastępowany identyfikatorem URI, w którym komponent powinien przechowywać dane wyjściowego artefaktu.
Dowiedz się więcej o symbolach zastępczych wiersza poleceń komponentu TFX .
Przykładowy komponent oparty na kontenerze
Poniżej znajduje się przykład komponentu innego niż Python, który pobiera, przekształca i przesyła dane:
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'),
],
)