TFX パイプラインを使用すると、Apache Airflow、Apache Beam、Kubeflow Pipelines などのオーケストレーター上で機械学習 (ML) ワークフローをオーケストレーションできます。パイプラインはワークフローを一連のコンポーネントに編成し、各コンポーネントが ML ワークフローのステップを実行します。 TFX 標準コンポーネントは、ML ワークフローの構築を簡単に開始できる実証済みの機能を提供します。ワークフローにカスタム コンポーネントを含めることもできます。カスタム コンポーネントを使用すると、次の方法で ML ワークフローを拡張できます。
- 独自のシステムからのデータの取り込みなど、ニーズを満たすように調整されたコンポーネントを構築します。
- データ拡張、アップサンプリング、またはダウンサンプリングを適用します。
- 信頼区間またはオートエンコーダの再現誤差に基づいて異常検出を実行します。
- アラートと監視のためのヘルプ デスクなどの外部システムとのインターフェイス。
- ラベルのない例にラベルを適用します。
- R を使用したデータ分析の実行など、Python 以外の言語で構築されたツールを ML ワークフローに統合します。
標準コンポーネントとカスタム コンポーネントを混合することで、TFX 標準コンポーネントに組み込まれたベスト プラクティスを活用しながら、ニーズを満たす ML ワークフローを構築できます。
このガイドでは、TFX カスタム コンポーネントを理解するために必要な概念と、カスタム コンポーネントを構築するさまざまな方法について説明します。
TFX コンポーネントの構造
このセクションでは、TFX コンポーネントの構成の概要を説明します。 TFX パイプラインを初めて使用する場合は、 TFX パイプラインを理解するためのガイドを読んで中心的な概念を学習してください。
TFX コンポーネントは、コンポーネント仕様とエグゼキュータ クラスで構成されており、これらはコンポーネント インターフェイス クラスにパッケージ化されています。
コンポーネント仕様は、コンポーネントの入力および出力コントラクトを定義します。このコントラクトは、コンポーネントの入力および出力アーティファクト、およびコンポーネントの実行に使用されるパラメーターを指定します。
コンポーネントのエグゼキュータクラスは、コンポーネントによって実行される作業の実装を提供します。
コンポーネント インターフェイスクラスは、TFX パイプラインでコンポーネントとして使用するために、コンポーネント仕様とエグゼキューターを組み合わせます。
実行時の TFX コンポーネント
パイプラインが TFX コンポーネントを実行する場合、コンポーネントは次の 3 つのフェーズで実行されます。
- まず、ドライバーはコンポーネント仕様を使用して、必要なアーティファクトをメタデータ ストアから取得し、コンポーネントに渡します。
- 次に、Executor がコンポーネントの作業を実行します。
- 次に、パブリッシャはコンポーネントの仕様とエグゼキュータからの結果を使用して、コンポーネントの出力をメタデータ ストアに保存します。
ほとんどのカスタム コンポーネントの実装では、ドライバーやパブリッシャーをカスタマイズする必要はありません。通常、ドライバーとパブリッシャーへの変更は、パイプラインのコンポーネントとメタデータ ストア間の相互作用を変更する場合にのみ必要になります。コンポーネントの入力、出力、またはパラメータのみを変更したい場合は、コンポーネントの仕様を変更するだけで済みます。
カスタムコンポーネントの種類
カスタム コンポーネントには、Python 関数ベースのコンポーネント、コンテナベースのコンポーネント、および完全なカスタム コンポーネントの 3 種類があります。次のセクションでは、さまざまなタイプのコンポーネントと、それぞれのアプローチを使用する必要がある場合について説明します。
Python 関数ベースのコンポーネント
Python 関数ベースのコンポーネントは、コンテナベースのコンポーネントや完全なカスタム コンポーネントよりも構築が簡単です。コンポーネントの仕様は、引数が入力アーティファクト、出力アーティファクト、またはパラメーターであるかどうかを記述する型アノテーションを使用して、Python 関数の引数で定義されます。関数本体はコンポーネントのエグゼキュータを定義します。コンポーネント インターフェイスは、 @component
デコレータを関数に追加することで定義されます。
@component
デコレータで関数を装飾し、型アノテーションで関数の引数を定義すると、コンポーネント仕様、エグゼキュータ、およびコンポーネント インターフェイスを構築する複雑さを省いてコンポーネントを作成できます。
Python 関数ベースのコンポーネントを構築する方法を学びます。
コンテナベースのコンポーネント
コンテナーベースのコンポーネントは、Docker コンテナーでコードを実行できる限り、任意の言語で記述されたコードをパイプラインに統合できる柔軟性を提供します。コンテナベースのコンポーネントを作成するには、コンポーネントの実行可能コードを含む Docker コンテナ イメージを構築する必要があります。次に、 create_container_component
関数を呼び出して以下を定義する必要があります。
- コンポーネント仕様の入力、出力、およびパラメーター。
- コンポーネント エグゼキュータが実行するコンテナ イメージとコマンド。
この関数は、パイプライン定義に含めることができるコンポーネントのインスタンスを返します。
このアプローチは、コードをコンテナー イメージとしてパッケージ化する必要があるため、Python 関数ベースのコンポーネントを構築するよりも複雑です。このアプローチは、パイプラインに Python 以外のコードを含める場合、または複雑なランタイム環境や依存関係を持つ Python コンポーネントを構築する場合に最適です。
コンテナベースのコンポーネントを構築する方法を学びます。
完全にカスタムされたコンポーネント
完全なカスタム コンポーネントを使用すると、コンポーネント仕様、エグゼキュータ、およびコンポーネント インターフェイス クラスを定義してコンポーネントを構築できます。このアプローチにより、ニーズに合わせて標準コンポーネントを再利用および拡張できます。
既存のコンポーネントが、開発中のカスタム コンポーネントと同じ入力および出力で定義されている場合は、既存のコンポーネントの Executor クラスを単純にオーバーライドできます。これは、コンポーネント仕様を再利用して、既存のコンポーネントから派生した新しいエグゼキューターを実装できることを意味します。このようにして、既存のコンポーネントに組み込まれている機能を再利用し、必要な機能のみを実装します。
ただし、新しいコンポーネントの入力と出力が一意である場合は、まったく新しいコンポーネント仕様を定義できます。
このアプローチは、既存のコンポーネント仕様とエグゼキュータを再利用する場合に最適です。
完全にカスタムのコンポーネントを構築する方法を学びます。