Zrozumienie niestandardowych komponentów TFX

Potoki TFX umożliwiają orkiestrację przepływu pracy w zakresie uczenia maszynowego (ML) w koordynatorach, takich jak: Apache Airflow, Apache Beam i Kubeflow Pipelines. Potoki organizują przepływ pracy w sekwencję składników, gdzie każdy składnik wykonuje krok w przepływie pracy ML. Standardowe komponenty TFX zapewniają sprawdzoną funkcjonalność, która pomaga łatwo rozpocząć tworzenie przepływu pracy ML. Możesz także uwzględnić niestandardowe komponenty w swoim przepływie pracy. Niestandardowe komponenty umożliwiają rozszerzenie przepływu pracy ML poprzez:

  • Tworzenie komponentów dostosowanych do Twoich potrzeb, na przykład poprzez pobieranie danych z własnego systemu.
  • Stosowanie powiększania danych, próbkowania w górę lub w dół.
  • Wykonuj wykrywanie anomalii w oparciu o przedziały ufności lub błąd odtwarzania autoenkodera.
  • Współpraca z systemami zewnętrznymi, takimi jak punkty pomocy technicznej, w celu ostrzegania i monitorowania.
  • Stosowanie etykiet do przykładów bez etykiet.
  • Integrowanie narzędzi zbudowanych w językach innych niż Python z przepływem pracy ML, na przykład przeprowadzanie analizy danych przy użyciu języka R.

Mieszając komponenty standardowe i komponenty niestandardowe, możesz zbudować przepływ pracy ML, który spełni Twoje potrzeby, korzystając jednocześnie z najlepszych praktyk wbudowanych w standardowe komponenty TFX.

W tym przewodniku opisano koncepcje wymagane do zrozumienia niestandardowych komponentów TFX oraz różne sposoby tworzenia niestandardowych komponentów.

Anatomia komponentu TFX

Ta sekcja zawiera ogólny przegląd składu komponentu TFX. Jeśli nie masz doświadczenia z potokami TFX, poznaj podstawowe pojęcia, czytając przewodnik dotyczący zrozumienia potoków TFX .

Komponenty TFX składają się ze specyfikacji komponentu i klasy modułu wykonawczego, które są spakowane w klasie interfejsu komponentu.

Specyfikacja komponentu definiuje kontrakt wejściowy i wyjściowy komponentu. Ten kontrakt określa artefakty wejściowe i wyjściowe komponentu oraz parametry używane do wykonywania komponentu.

Klasa executora komponentu zapewnia implementację pracy wykonywanej przez komponent.

Klasa interfejsu komponentu łączy specyfikację komponentu z modułem wykonawczym do użycia jako komponent w potoku TFX.

Komponenty TFX w czasie wykonywania

Kiedy potok uruchamia komponent TFX, komponent jest wykonywany w trzech fazach:

  1. Najpierw sterownik wykorzystuje specyfikację komponentu do pobrania wymaganych artefaktów z magazynu metadanych i przekazania ich do komponentu.
  2. Następnie Executor wykonuje pracę komponentu.
  3. Następnie Wydawca używa specyfikacji komponentu i wyników modułu wykonującego do przechowywania wyników komponentu w magazynie metadanych.

Anatomia komponentów

Większość niestandardowych implementacji komponentów nie wymaga dostosowywania sterownika ani wydawcy. Zazwyczaj modyfikacje sterownika i wydawcy powinny być konieczne tylko wtedy, gdy chcesz zmienić interakcję między składnikami potoku a magazynem metadanych. Jeśli chcesz zmienić tylko wejścia, wyjścia lub parametry swojego komponentu, wystarczy zmodyfikować specyfikację komponentu .

Rodzaje komponentów niestandardowych

Istnieją trzy typy komponentów niestandardowych: komponenty oparte na funkcjach Pythona, komponenty oparte na kontenerach i komponenty w pełni niestandardowe. W poniższych sekcjach opisano różne typy komponentów i przypadki, w których należy zastosować każde podejście.

Komponenty oparte na funkcjach Pythona

Komponenty oparte na funkcjach Pythona są łatwiejsze do zbudowania niż komponenty oparte na kontenerach lub komponenty w pełni niestandardowe. Specyfikacja komponentu jest zdefiniowana w argumentach funkcji Pythona przy użyciu adnotacji typu, które opisują, czy argument jest artefaktem wejściowym, artefaktem wyjściowym czy parametrem. Treść funkcji definiuje wykonawcę komponentu. Interfejs komponentu definiuje się poprzez dodanie dekoratora @component do funkcji.

Dekorując swoją funkcję dekoratorem @component i definiując argumenty funkcji za pomocą adnotacji typu, możesz utworzyć komponent bez konieczności budowania specyfikacji komponentu, modułu wykonującego i interfejsu komponentu.

Dowiedz się, jak budować komponenty oparte na funkcjach języka Python .

Komponenty oparte 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. Aby utworzyć komponent oparty na kontenerze, należy zbudować obraz kontenera platformy Docker zawierający kod wykonywalny komponentu. Następnie musisz wywołać funkcję create_container_component , aby zdefiniować:

  • Wejścia, wyjścia i parametry specyfikacji komponentu.
  • Obraz kontenera i polecenie uruchamiane przez moduł wykonujący komponent.

Ta funkcja zwraca instancję komponentu, którą można uwzględnić w definicji potoku.

To podejście jest bardziej złożone niż budowanie komponentu opartego na funkcjach Pythona, ponieważ wymaga spakowania kodu jako obrazu kontenera. To podejście jest najbardziej odpowiednie do włączania do potoku kodu innego niż Python lub do tworzenia komponentów Pythona ze złożonymi środowiskami wykonawczymi lub zależnościami.

Dowiedz się, jak budować komponenty oparte na kontenerach .

W pełni niestandardowe komponenty

W pełni niestandardowe komponenty umożliwiają budowanie komponentów poprzez zdefiniowanie specyfikacji komponentu, modułu wykonującego i klas interfejsu komponentu. Takie podejście pozwala ponownie wykorzystać i rozszerzyć standardowy komponent tak, aby odpowiadał Twoim potrzebom.

Jeśli istniejący komponent ma te same dane wejściowe i wyjściowe, co komponent niestandardowy, który tworzysz, możesz po prostu zastąpić klasę Executor istniejącego komponentu. Oznacza to, że możesz ponownie wykorzystać specyfikację komponentu i zaimplementować nowy executor, który wywodzi się z istniejącego komponentu. W ten sposób ponownie wykorzystujesz funkcjonalność wbudowaną w istniejące komponenty i wdrażasz tylko tę funkcjonalność, która jest wymagana.

Jeśli jednak wejścia i wyjścia nowego komponentu są unikalne, możesz zdefiniować zupełnie nową specyfikację komponentu .

To podejście jest najlepsze w przypadku ponownego wykorzystania istniejących specyfikacji komponentów i modułów wykonawczych.

Dowiedz się, jak budować w pełni niestandardowe komponenty .