Treten Sie der SIG TFX-Addons-Community bei und helfen Sie, TFX noch besser zu machen!

Grundlegendes zu benutzerdefinierten TFX-Komponenten

Mit TFX-Pipelines können Sie Ihren Workflow für maschinelles Lernen (ML) auf Orchestratoren orchestrieren, z. B.: Apache Airflow-, Apache Beam- und Kubeflow-Pipelines. Pipelines organisieren Ihren Workflow in eine Folge von Komponenten, wobei jede Komponente einen Schritt in Ihrem ML-Workflow ausführt. TFX-Standardkomponenten bieten bewährte Funktionen, mit denen Sie problemlos mit dem Aufbau eines ML-Workflows beginnen können. Sie können auch benutzerdefinierte Komponenten in Ihren Workflow aufnehmen. Mit benutzerdefinierten Komponenten können Sie Ihren ML-Workflow erweitern um:

  • Erstellen von Komponenten, die auf Ihre Anforderungen zugeschnitten sind, z. B. das Aufnehmen von Daten aus einem proprietären System.
  • Anwenden von Datenerweiterung, Upsampling oder Downsampling.
  • Führen Sie eine Anomalieerkennung basierend auf Konfidenzintervallen oder Autoencoder-Wiedergabefehlern durch.
  • Schnittstelle zu externen Systemen wie Helpdesks zur Alarmierung und Überwachung.
  • Anwenden von Beschriftungen auf unbeschriftete Beispiele.
  • Integrieren von Tools, die mit anderen Sprachen als Python erstellt wurden, in Ihren ML-Workflow, z. B. Durchführen einer Datenanalyse mit R.

Durch Mischen von Standardkomponenten und benutzerdefinierten Komponenten können Sie einen ML-Workflow erstellen, der Ihren Anforderungen entspricht, und gleichzeitig die in den TFX-Standardkomponenten integrierten Best Practices nutzen.

In diesem Handbuch werden die Konzepte beschrieben, die zum Verständnis der benutzerdefinierten TFX-Komponenten erforderlich sind, sowie die verschiedenen Möglichkeiten zum Erstellen benutzerdefinierter Komponenten.

Anatomie einer TFX-Komponente

Dieser Abschnitt bietet einen allgemeinen Überblick über die Zusammensetzung einer TFX-Komponente. Wenn Sie mit TFX-Pipelines noch nicht vertraut sind, lernen Sie die Kernkonzepte kennen, indem Sie die Anleitung zum Verständnis von TFX-Pipelines lesen .

TFX-Komponenten bestehen aus einer Komponentenspezifikation und einer Executor-Klasse, die in einer Komponentenschnittstellenklasse zusammengefasst sind.

Eine Komponentenspezifikation definiert den Eingabe- und Ausgabevertrag der Komponente. Dieser Vertrag gibt die Eingabe- und Ausgabeartefakte der Komponente sowie die Parameter an, die für die Komponentenausführung verwendet werden.

Die Executor- Klasse einer Komponente stellt die Implementierung für die von der Komponente ausgeführte Arbeit bereit.

Eine Komponentenschnittstellenklasse kombiniert die Komponentenspezifikation mit dem Executor zur Verwendung als Komponente in einer TFX-Pipeline.

TFX-Komponenten zur Laufzeit

Wenn eine Pipeline eine TFX-Komponente ausführt, wird die Komponente in drei Phasen ausgeführt:

  1. Zunächst verwendet der Treiber die Komponentenspezifikation, um die erforderlichen Artefakte aus dem Metadatenspeicher abzurufen und an die Komponente zu übergeben.
  2. Als nächstes führt der Executor die Arbeit der Komponente aus.
  3. Anschließend verwendet der Publisher die Komponentenspezifikation und die Ergebnisse des Executors, um die Ausgaben der Komponente im Metadatenspeicher zu speichern.

Komponentenanatomie

Bei den meisten benutzerdefinierten Komponentenimplementierungen müssen Sie weder den Treiber noch den Publisher anpassen. In der Regel sollten Änderungen an Treiber und Publisher nur erforderlich sein, wenn Sie die Interaktion zwischen den Komponenten Ihrer Pipeline und dem Metadatenspeicher ändern möchten. Wenn Sie nur die Ein-, Ausgänge oder Parameter für Ihre Komponente ändern möchten, müssen Sie nur die Komponentenspezifikation ändern.

Arten von benutzerdefinierten Komponenten

Es gibt drei Arten von benutzerdefinierten Komponenten: Python-funktionsbasierte Komponenten, container-basierte Komponenten und vollständig benutzerdefinierte Komponenten. In den folgenden Abschnitten werden die verschiedenen Arten von Komponenten und die Fälle beschrieben, in denen Sie jeden Ansatz verwenden sollten.

Python-funktionsbasierte Komponenten

Python-funktionsbasierte Komponenten sind einfacher zu erstellen als containergestützte Komponenten oder vollständig benutzerdefinierte Komponenten. Die Komponentenspezifikation wird in den Argumenten der Python-Funktion mithilfe von Typanmerkungen definiert, die beschreiben, ob ein Argument ein Eingabeartefakt, ein Ausgabeartefakt oder ein Parameter ist. Der Funktionskörper definiert den Executor der Komponente. Die Komponentenschnittstelle wird definiert, indem @component Ihrer Funktion den @component decorator hinzufügen.

Durch Dekorieren Ihrer Funktion mit dem @component Dekorator und Definieren der Funktionsargumente mit @component können Sie eine Komponente erstellen, ohne die Komplexität des Erstellens einer Komponentenspezifikation, eines Executors und einer Komponentenschnittstelle zu haben.

Erfahren Sie, wie Sie auf Python-Funktionen basierende Komponenten erstellen .

Containerbasierte Komponenten

Containerbasierte Komponenten bieten die Flexibilität, in einer beliebigen Sprache geschriebenen Code in Ihre Pipeline zu integrieren, sofern Sie diesen Code in einem Docker-Container ausführen können. Um eine container-basierte Komponente zu erstellen, müssen Sie ein Docker-Container-Image erstellen, das den ausführbaren Code Ihrer Komponente enthält. Anschließend müssen Sie die Funktion create_container_component aufrufen, um create_container_component zu definieren:

  • Die Ein-, Ausgänge und Parameter Ihrer Komponentenspezifikation.
  • Das Container-Image und der Befehl, die der Komponenten-Executor ausführt.

Diese Funktion gibt eine Instanz einer Komponente zurück, die Sie in Ihre Pipeline-Definition aufnehmen können.

Dieser Ansatz ist komplexer als das Erstellen einer auf Python-Funktionen basierenden Komponente, da Ihr Code als Container-Image gepackt werden muss. Dieser Ansatz eignet sich am besten zum Einfügen von Nicht-Python-Code in Ihre Pipeline oder zum Erstellen von Python-Komponenten mit komplexen Laufzeitumgebungen oder Abhängigkeiten.

Erfahren Sie, wie Sie containergestützte Komponenten erstellen .

Vollständig kundenspezifische Komponenten

Mit vollständig benutzerdefinierten Komponenten können Sie Komponenten erstellen, indem Sie die Komponentenspezifikations-, Executor- und Komponentenschnittstellenklassen definieren. Mit diesem Ansatz können Sie eine Standardkomponente wiederverwenden und erweitern, um sie Ihren Anforderungen anzupassen.

Wenn eine vorhandene Komponente mit denselben Ein- und Ausgängen wie die von Ihnen entwickelte benutzerdefinierte Komponente definiert ist, können Sie einfach die Executor-Klasse der vorhandenen Komponente überschreiben. Dies bedeutet, dass Sie eine Komponentenspezifikation wiederverwenden und einen neuen Executor implementieren können, der von einer vorhandenen Komponente abgeleitet ist. Auf diese Weise verwenden Sie in vorhandene Komponenten integrierte Funktionen wieder und implementieren nur die erforderlichen Funktionen.

Wenn jedoch die Ein- und Ausgänge Ihrer neuen Komponente eindeutig sind, können Sie eine völlig neue Komponentenspezifikation definieren.

Dieser Ansatz eignet sich am besten für die Wiederverwendung vorhandener Komponentenspezifikationen und Executoren.

Erfahren Sie, wie Sie vollständig benutzerdefinierte Komponenten erstellen .