I componenti basati su container offrono la flessibilità necessaria per integrare codice scritto in qualsiasi linguaggio nella pipeline, purché sia possibile eseguire tale codice in un container Docker.
Se non conosci le pipeline TFX, scopri di più sui concetti fondamentali delle pipeline TFX .
Creazione di un componente basato su contenitore
I componenti basati su contenitori sono supportati da programmi della riga di comando containerizzati. Se disponi già di un'immagine del contenitore, puoi utilizzare TFX per creare un componente da essa utilizzando la funzione create_container_component
per dichiarare input e output. Parametri di funzione:
- nome: il nome del componente.
- input: un dizionario che associa i nomi degli input ai tipi. output: un dizionario che associa i nomi di output ai tipi parametri: un dizionario che associa i nomi dei parametri ai tipi.
- image: nome dell'immagine del contenitore e, facoltativamente, tag immagine.
- comando: riga di comando del punto di ingresso del contenitore. Non eseguito all'interno di una shell. La riga di comando può utilizzare oggetti segnaposto che vengono sostituiti in fase di compilazione con l'input, l'output o il parametro. Gli oggetti segnaposto possono essere importati da
tfx.dsl.component.experimental.placeholders
. Tieni presente che i modelli Jinja non sono supportati.
Valore restituito: una classe Component che eredita da base_component.BaseComponent di cui è possibile istanziare e utilizzare all'interno della pipeline.
Segnaposto
Per un componente che dispone di input o output, il command
spesso necessita di segnaposto che vengono sostituiti con dati effettivi in fase di esecuzione. A questo scopo vengono forniti diversi segnaposto:
InputValuePlaceholder
: segnaposto per il valore dell'artefatto di input. In fase di esecuzione, questo segnaposto viene sostituito con la rappresentazione di stringa del valore dell'artefatto.InputUriPlaceholder
: segnaposto per l'URI dell'argomento dell'artefatto di input. In fase di esecuzione, questo segnaposto viene sostituito con l'URI dei dati dell'artefatto di input.OutputUriPlaceholder
: segnaposto per l'URI dell'argomento dell'artefatto di output. In fase di esecuzione, questo segnaposto viene sostituito con l'URI in cui il componente deve archiviare i dati dell'artefatto di output.
Ulteriori informazioni sui segnaposto della riga di comando del componente TFX .
Esempio di componente basato su contenitore
Di seguito è riportato un esempio di un componente non Python che scarica, trasforma e carica i dati:
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'),
],
)