Tworzenie komponentów opartych na kontenerach

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'),
    ],
)