Création de composants basés sur des conteneurs

Les composants basés sur des conteneurs offrent la flexibilité nécessaire pour intégrer du code écrit dans n'importe quel langage dans votre pipeline, à condition que vous puissiez exécuter ce code dans un conteneur Docker.

Si vous débutez avec les pipelines TFX, découvrez les concepts fondamentaux des pipelines TFX .

Création d'un composant basé sur un conteneur

Les composants basés sur des conteneurs sont soutenus par des programmes de ligne de commande conteneurisés. Si vous disposez déjà d'une image de conteneur, vous pouvez utiliser TFX pour créer un composant à partir de celle-ci en utilisant la fonction create_container_component pour déclarer les entrées et les sorties. Paramètres de fonction :

  • name : Le nom du composant.
  • inputs : un dictionnaire qui mappe les noms d’entrées aux types. sorties : un dictionnaire qui mappe les noms de sorties aux paramètres de types : un dictionnaire qui mappe les noms de paramètres aux types.
  • image : nom de l’image du conteneur et éventuellement balise d’image.
  • command : ligne de commande du point d’entrée du conteneur. Non exécuté dans un shell. La ligne de commande peut utiliser des objets d'espace réservé qui sont remplacés au moment de la compilation par l'entrée, la sortie ou le paramètre. Les objets d'espace réservé peuvent être importés depuis tfx.dsl.component.experimental.placeholders . Notez que les modèles Jinja ne sont pas pris en charge.

Valeur de retour : une classe Component héritant de base_component.BaseComponent qui peut être instanciée et utilisée dans le pipeline.

Espaces réservés

Pour un composant comportant des entrées ou des sorties, la command doit souvent comporter des espaces réservés qui sont remplacés par des données réelles au moment de l'exécution. Plusieurs espaces réservés sont prévus à cet effet :

  • InputValuePlaceholder : un espace réservé pour la valeur de l'artefact d'entrée. Au moment de l'exécution, cet espace réservé est remplacé par la représentation sous forme de chaîne de la valeur de l'artefact.

  • InputUriPlaceholder : un espace réservé pour l'URI de l'argument de l'artefact d'entrée. Au moment de l'exécution, cet espace réservé est remplacé par l'URI des données de l'artefact d'entrée.

  • OutputUriPlaceholder : un espace réservé pour l'URI de l'argument de l'artefact de sortie. Au moment de l'exécution, cet espace réservé est remplacé par l'URI où le composant doit stocker les données de l'artefact de sortie.

En savoir plus sur les espaces réservés de ligne de commande des composants TFX .

Exemple de composant basé sur un conteneur

Voici un exemple de composant non-python qui télécharge, transforme et charge les données :

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