Zrozumienie niestandardowych komponentów TFX

Potoki TFX umożliwiają organizowanie przepływu pracy uczenia maszynowego (ML) w programach do orkiestracji, takich jak: Apache Airflow, Apache Beam i Kubeflow Pipelines. Potoki organizują przepływ pracy w sekwencję komponentów, gdzie każdy składnik wykonuje krok w przepływie pracy ML. Standardowe komponenty TFX zapewniają sprawdzoną funkcjonalność, która pomaga w łatwym rozpoczęciu tworzenia przepływu pracy ML. W toku pracy można również uwzględnić niestandardowe komponenty. Niestandardowe komponenty pozwalają rozszerzyć przepływ pracy ML o:

  • Budowanie komponentów dostosowanych do Twoich potrzeb, takich jak pozyskiwanie danych z zastrzeżonego systemu.
  • Stosowanie rozszerzenia danych, upsamplingu lub downsamplingu.
  • Wykonaj wykrywanie anomalii na podstawie przedziałów ufności lub błędu reprodukcji autokodera.
  • Współpraca z systemami zewnętrznymi, takimi jak help deski do ostrzegania i monitorowania.
  • Stosowanie etykiet do przykładów bez etykiet.
  • Integracja 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łnia Twoje potrzeby, jednocześnie korzystając z najlepszych praktyk wbudowanych w standardowe komponenty TFX.

Ten przewodnik opisuje koncepcje wymagane do zrozumienia niestandardowych komponentów TFX oraz różne sposoby budowania niestandardowych komponentów.

Anatomia komponentu TFX

Ta sekcja zawiera ogólny przegląd składu komponentu TFX. Jeśli jesteś nowym użytkownikiem potoków TFX, zapoznaj się z podstawowymi pojęciami, czytając przewodnik dotyczący zrozumienia potoków TFX .

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

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

Klasa executor komponentu zapewnia implementację pracy wykonywanej przez komponent.

Klasa interfejsu komponentu łączy specyfikację komponentu z executorem 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. Po pierwsze, Driver używa specyfikacji komponentu, aby pobrać wymagane artefakty z magazynu metadanych i przekazać je do komponentu.
  2. Następnie Wykonawca wykonuje pracę komponentu.
  3. Następnie wydawca używa specyfikacji składnika i wyników z executora do przechowywania danych wyjściowych składnika 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 niestandardowych komponentów

Istnieją trzy typy komponentów niestandardowych: komponenty oparte na funkcjach Pythona, komponenty oparte na kontenerach i komponenty w pełni niestandardowe. Poniższe sekcje opisują różne typy komponentów i przypadki, w których należy użyć każdego podejścia.

Komponenty oparte na funkcjach Pythona

Komponenty oparte na funkcjach języka Python są łatwiejsze do zbudowania niż komponenty oparte na kontenerach lub w pełni niestandardowe komponenty. 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 jest definiowany przez dodanie dekoratora @component do swojej funkcji.

Dekorując swoją funkcję dekoratorem @component i definiując argumenty funkcji za pomocą adnotacji typu, możesz utworzyć komponent bez złożoności tworzenia specyfikacji komponentu, executora i interfejsu komponentu.

Dowiedz się, jak tworzyć komponenty oparte na funkcjach Pythona .

Komponenty oparte na kontenerach

Komponenty oparte na kontenerach zapewniają elastyczność integracji kodu napisanego w dowolnym języku z potoku, o ile możesz wykonać ten kod w kontenerze Docker. Aby utworzyć komponent oparty na kontenerze, musisz zbudować obraz kontenera Docker, który zawiera 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 executor komponentu.

Ta funkcja zwraca wystąpienie składnika, który 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 kodu innego niż Python do potoku lub do budowania komponentów Pythona ze złożonymi środowiskami wykonawczymi lub zależnościami.

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

W pełni niestandardowe komponenty

W pełni niestandardowe komponenty umożliwiają tworzenie komponentów poprzez definiowanie specyfikacji komponentów, klas wykonawczych i interfejsów komponentów. Takie podejście pozwala na ponowne wykorzystanie i rozszerzenie standardowego komponentu, aby dopasować go do własnych potrzeb.

Jeśli istniejący składnik jest zdefiniowany z tymi samymi danymi wejściowymi i wyjściowymi, co rozwijany składnik niestandardowy, możesz po prostu przesłonić klasę Executor istniejącego składnika. 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 funkcje wbudowane w istniejące komponenty i wdrażasz tylko te funkcje, które są wymagane.

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

To podejście najlepiej nadaje się do ponownego wykorzystania istniejących specyfikacji komponentów i wykonawców.

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