TFX ユーザーガイド

概要

TFX は、TensorFlow をベースとした Google の本番環境規模の機械学習プラットフォームです。 機械学習システムの定義、起動、監視に必要な共通コンポーネントを統合するための構成フレームワークと共有ライブラリを提供します。

インストール

Python PyPI

pip install tensorflow
pip install tfx

基本コンセプト

TFX パイプライン

TFX パイプラインでは、特定の ML タスク(特定のデータの回帰モデルをビルドしてデプロイするなど)の実装を念頭に、複数のコンポーネントにまたがるデータフローを定義します。パイプライン コンポーネントは TFX ライブラリをベースとして構築され、 パイプラインの結果として、TFX デプロイ ターゲットや推論リクエスト サービスが得られます。

アーティファクト

パイプラインにおいて、アーティファクトはコンポーネント間で渡されるデータの単位となります。通常、コンポーネントには少なくとも 1 つの入力アーティファクトと 1 つの出力アーティファクトがあります。すべてのアーティファクトには、アーティファクトのプロパティを定義するメタデータが関連付けられている必要があります。また、アーティファクトは、ML メタデータ ストアに登録されたアーティファクト型で厳密に型指定する必要があります。アーティファクトアーティファクト型のコンセプトは、こちらのドキュメントに記載されているように、ML メタデータが定義するデータモデルに基づいています。TFX は上位の機能を実現するために、独自のアーティファクト型オントロジーを定義し、実装します。TFX 0.15 では、11 の既知のアーティファクト型が定義され、TFX システム全体で使用されます。

アーティファクト型には一意の名前と、そのインスタンスのプロパティのスキーマがあります。TFX は、パイプライン内のコンポーネントでアーティファクトを使用する方法としてアーティファクト型を利用しますが、必ずしもファイルシステム上のアーティファクトの物理的な内容を特定するわけではありません。

たとえば、アーティファクト型「Examples」は、tensorflow::Example プロトコル バッファ、CSV、JSON、またはその他の物理形式の TFRecord で実体化された Examples を表します。いずれの形式でも、パイプラインでの Examples の使用方法はまったく同じです。統計を生成するための分析、予想されるスキーマに対する検証、トレーニングの前処理、トレーニング モデルの Trainer への提供などに使用します。同様に、アーティファクト型「Model」は、TensorFlow SavedModel、ONNX、PMML、または PKL(Python の各種のモデル オブジェクト)など、さまざまな物理形式でエクスポートされたトレーニング済みモデル オブジェクトを表すことができます。いずれの場合でも、モデルはパイプラインでのサービングのために常に評価、分析、デプロイされます。

注: TFX 0.15 の時点では、TFX コンポーネントの実装は「Examples」アーティファクトが gzip 圧縮された TFRecord 形式の tensorflow::Example プロトコル バッファであると仮定しています。同様に、「Model」アーティファクトは TensorFlow SavedModel と見なされます。 TFX の今後のバージョンでは、こうしたアーティファクト型を拡張して、より多くのバリアントをサポートする可能性があります。

このような、同じアーティファクト型で存在する可能性があるバリアントを区別するために、ML メタデータではアーティファクト プロパティのセットを定義します。たとえば、「Examples」アーティファクトのそのようなアーティファクト プロパティの 1 つに「format」があり、その値が TFRecordJSONCSV などになるという具合です。「Examples」型のアーティファクトは常に、入力アーティファクトとして Examples を使用するように設計されたコンポーネント(Trainer など)に渡すことができます。ただし、使用するコンポーネントの実装では、「format」プロパティの特定の値に応じて動作を調整するか、Examples の特定の形式を処理する実装がない場合にランタイム エラーを発生させるようにします。

まとめると、アーティファクト型は TFX パイプライン システム全体におけるアーティファクトのオントロジーを定義し、アーティファクト プロパティアーティファクト型に固有のオントロジーを定義します。パイプライン システムのユーザーは、新しいカスタム プロパティを定義して入力することにより、そのようなオントロジーをローカルでパイプライン アプリケーションに拡張することを選択できます。ユーザーはまた、新しいアーティファクト型を導入するか、事前定義された型プロパティを変更すること(あるいはその両方)で、システム全体のオントロジーをグローバルに拡張することも選択できます。その場合、このような拡張は、パイプライン システムのマスター リポジトリ(TFX リポジトリ)に投稿されます。

TFX パイプライン コンポーネント

TFX パイプラインは、ML パイプラインを実装する一連のコンポーネントで、特にスケーラブルで高いパフォーマンスが必要な機械学習タスクを念頭に設計されています。モデリング、トレーニング、推論のサービング、またオンライン、ネイティブ モバイル、JavaScript ターゲットへのデプロイの管理などが対象となります。

通常、TFX パイプラインには次のコンポーネントが含まれます。

  • ExampleGen: パイプラインの最初の入力コンポーネントです。入力データセットを取り込み、分割(任意)します。

  • StatisticsGen: データセットの統計を計算します。

  • SchemaGen: 統計を精査し、データスキーマを作成します。

  • ExampleValidator: データセットに異常値と欠損値がないか確認します。

  • Transform: データセットに対して特徴量エンジニアリングを行います。

  • Trainer: モデルをトレーニングします。

  • Evaluator: トレーニング結果の詳細な分析とエクスポートしたモデルの検証を行い、本番環境への導入の妥当性の確認を支援します。

  • Pusher: サービスを提供するインフラストラクチャにモデルをデプロイします。

次の図に、これらのコンポーネント間のデータフローを示します。

コンポーネント フロー

コンポーネントの構造

TFX コンポーネントは、次の 3 つの主要な部分からなります。

  • ドライバ
  • エグゼキュータ
  • パブリッシャー

コンポーネントの構造

ドライバとパブリッシャー

ドライバはメタデータ ストアに対してクエリを実行することで、エグゼキュータにメタデータを提供します。パブリッシャーはエグゼキュータの結果を受け入れてメタデータに格納します。デベロッパーは通常、ドライバとパブリッシャーを直接扱う必要はありませんが、ドライバとパブリッシャーがログに記録したメッセージはデバッグの際に役立つことがあります。詳しくは、トラブルシューティングをご覧ください。

エグゼキュータ

エクゼキュータは、コンポーネントが処理を行う場所です。デベロッパーは、扱っているコンポーネントの型を実装するクラスの要件に基づいて、エクゼキュータで実行するコードを記述します。たとえば Transform コンポーネントを扱っている場合は、preprocessing_fn を開発する必要があります。

TFX ライブラリ

TFX には、ライブラリとパイプライン コンポーネントの両方が含まれています。次の図に、TFX ライブラリとパイプライン コンポーネントの関係を示します。

ライブラリとコンポーネント

TFX には、パイプライン コンポーネントの作成に使用されるライブラリである Python パッケージがいくつか用意されています。こうしたライブラリを使用してパイプラインのコンポーネントを作成することで、そのパイプラインに固有のコードの記述に注力できます。

TFX ライブラリには次のものが含まれます。

  • TensorFlow Data Validation(TFDV): 機械学習データを分析し、検証するためのライブラリです。高いスケーラビリティを備え、TensorFlow と TFX で適切に機能するように設計されています。TFDV には次の内容が含まれます。

    • トレーニング データとテストデータの要約統計量のスケーラブルな計算。
    • データ分布のビューアと統計情報の統合、データセット ペアの多面的な比較(ファセット)。

    • 必要な値、範囲、語彙などのデータに関する期待値を記述する自動データスキーマ生成。

    • スキーマの精査に役立つスキーマ ビューア。

    • 特徴の欠如、範囲外の値、誤った特徴型などの異常を識別する異常検出。

    • どの特徴に異常があるかを確認し、修正するために詳細を調べられるようにする異常ビューア。

  • TensorFlow Transform(TFT): TensorFlow でデータを前処理するためのライブラリです。TensorFlow Transform は、データの全走査が必要な次のような場合に便利です。

    • 平均値と標準偏差で入力値を正規化する。
    • すべての入力値に対して語彙を生成することで、文字列を整数に変換する。
    • 観測データの分布に基づいてバケットに割り当てることで、浮動小数点数を整数に変換する。
  • TensorFlow: TFX でのモデルのトレーニングに使用します。トレーニング データとモデリング コードを取り込み、SavedModel の結果を作成します。また、入力データを前処理するために TensorFlow Transform で作成された特徴量エンジニアリング パイプラインを統合します。

  • TensorFlow Model Analysis(TFMA): TensorFlow モデルを評価するためのライブラリです。TensorFlow とともに使用して EvalSavedModel を作成します。これが分析のベースとなります。ユーザーは Trainer で定義されているのと同じ指標を使用し、大量のデータを分散させた状態でモデルを評価できます。こうした指標をさまざまなデータスライスで計算し、Jupyter Notebook で可視化できます。

  • TensorFlow Metadata(TFMD): TensorFlow で機械学習モデルをトレーニングする際に役立つメタデータの標準表現を提供します。メタデータは、入力データの分析中に手動または自動で作成され、データの検証、探索、変換に使用できます。メタデータのシリアル化形式には次のものが含まれます。

    • 表形式のデータを記述するスキーマ(例: tf.Examples)。
    • そのようなデータセットに対する要約統計量のコレクション。
  • ML Metadata(MLMD): ML デベロッパーとデータ サイエンティストのワークフローに関連するメタデータを記録および取得するためのライブラリです。ほとんどの場合、メタデータは TFMD 表現を使用します。MLMD は、SQL-LiteMySQL、その他の類似のデータストアを使用して永続性を管理します。

関連技術

必須

  • Apache Beam: バッチとストリーミングの両方のデータ並列処理パイプラインを定義するためのオープンソースの統合モデルです。TFX は Apache Beam を使用してデータ並列パイプラインを実装します。パイプラインは、Apache Flink、Apache Spark、Google Cloud Dataflow など、Beam がサポートする分散処理バックエンドのいずれかによって実行されます。

任意

Apache Airflow や Kubeflow などのオーケストレータにより、ML パイプラインの構成、運用、モニタリング、保守が容易になります。

  • Apache Airflow: ワークフローの作成、スケジューリング、モニタリングをプログラマティックに行うためのプラットフォームです。TFX は Airflow を使用して、タスクの有向非巡回グラフ(DAG)としてワークフローを作成します。Airflow スケジューラは、指定された依存関係に従って一連のワーカーでタスクを実行します。豊富なコマンドライン ユーティリティが用意されており、DAG の複雑な処理が簡単に行えます。また、ユーザー インターフェースも充実しており、必要に応じて、本番環境でのパイプライン実行の可視化、進捗状況のモニタリング、問題のトラブルシューティングも簡単に行えます。ワークフローをコードとして定義することで、保守、バージョン管理、テスト、コラボレーションをより行いやすくなります。

  • Kubeflow: Kubernetes での機械学習(ML)ワークフローのデプロイをシンプル、ポータブル、スケーラブルにするのに役立ちます。Kubeflow の目標は、別のサービスを作成し直すことではなく、機械学習に最適なオープンソース ML 用システムをさまざまなインフラストラクチャに簡単にデプロイできるようにすることです。Kubeflow Pipelines では、Kubeflow での再現可能なワークフローの構成と実行が可能となっており、検証作業との統合やノートブック ベースのエクスペリエンスが実現します。Kubernetes 上の Kubeflow Pipelines サービスには、ホスト型のメタデータ ストア、コンテナベースのオーケストレーション エンジン、ノートブック サーバー、UI が含まれ、ユーザーが複雑な ML パイプラインを大規模に開発、実行、管理するのに役立ちます。Kubeflow Pipelines SDK を使用すると、コンポーネントの作成と共有、パイプラインの構成をプログラムで行えます。

移植性と相互運用性

TFX は、Apache AirflowApache BeamKubeflow など、複数の環境とオーケストレーション フレームワークに移植できるように設計されています。オンプレミスを含むさまざまなコンピューティング プラットフォームと、Google Cloud Platform(GCP)などのクラウド プラットフォームにも移植できます。特に TFX は、トレーニングと予測を行う Cloud AI Platform、ML ライフサイクルにおける複数の項目を対象とした分散データ処理を行う Cloud Dataflow など、複数のマネージド GCP サービスと相互運用できます。

Model と SavedModel

Model

モデルは、トレーニング プロセスの出力であり、トレーニング プロセス中に学習した重みをシリアル化したレコードです。この重みはトレーニング プロセスの後には、新しい入力サンプルの予測計算に使用できます。TFX と TensorFlow の場合、ある時点までに学習した重みを含むチェックポイントのことを「モデル」と呼称します。

なお、「モデル」は予測がどのように計算されるかを表す TensorFlow 計算グラフの定義(すなわち Python ファイル)を指すこともあります。この 2 つの意味は、文脈に応じて使い分けられます。

SavedModel

  • SavedModel とは: TensorFlow モデルにおけるシリアル化形式のことで、汎用性、言語非依存性、独立性、復元可能性などの特徴があります。
  • 重要である理由: SavedModel を使用すると、一度の抽象化で上位のシステムが TensorFlow モデルを生成、変換、使用できるようになります。

SavedModel は、本番環境での TensorFlow モデルの提供や、ネイティブ モバイルアプリまたは JavaScript アプリケーション用にトレーニングされたモデルのエクスポートを行う際に推奨されるシリアル化形式です。たとえば、予測を行うためにモデルを REST サービスに変換するには、SavedModel としてモデルをシリアル化し、TensorFlow Serving を使用して提供します。詳しくは、TensorFlow モデルの提供についての説明をご覧ください。

スキーマ

一部の TFX コンポーネントでは、スキーマという入力データの記述形式を使用します。スキーマは schema.proto のインスタンスであり、プロトコル バッファの一種(一般的には「protobuf」)です。スキーマでは、特徴値のデータ型、すべてのサンプルに特徴が必要かどうか、許容値の範囲、その他のプロパティを指定できます。TensorFlow Data Validation(TFDV)を使用するメリットとして、トレーニング データから型、カテゴリ、範囲が推定され、自動的にスキーマが生成されることが挙げられます。

以下に、スキーマ protobuf からの抜粋を示します。

...
feature {
  name: "age"
  value_count {
    min: 1
    max: 1
  }
  type: FLOAT
  presence {
    min_fraction: 1
    min_count: 1
  }
}
feature {
  name: "capital-gain"
  value_count {
    min: 1
    max: 1
  }
  type: FLOAT
  presence {
    min_fraction: 1
    min_count: 1
  }
}
...

次のコンポーネントでは、スキーマが使用されます。

  • TensorFlow Data Validation
  • TensorFlow Transform

典型的な TFX パイプラインでは、TensorFlow Data Validation によってスキーマが生成され、他のコンポーネントによって使用されます。

TFX を使用した開発

TFX により、研究、試験、ローカルマシンでの開発からデプロイに至るまで、機械学習プロジェクトのあらゆる段階に対して、強力なプラットフォームが提供されます。コードの重複を避け、トレーニング サービング スキューの可能性を排除するために、モデルのトレーニングとトレーニング済みモデルのデプロイの両方に TFX パイプラインを実装することが推奨されます。また、トレーニングと推論の両方に TensorFlow Transform ライブラリを活用する Transform コンポーネントを使用することも求められます。そうすることで、同じ前処理コードと分析コードを一貫して使用できるようになり、トレーニングに使用するデータと本番環境でトレーニング済みモデルに提供されるデータとの間に相違が生じることを避けられます。また、コードの作成が 1 度だけで済むようになります。

データ探索、可視化、クリーニング

データ探索、可視化、クリーニング

TFX パイプラインは通常、ExampleGen コンポーネントで始まります。ExampleGen コンポーネントは入力データを受け入れて、tf.Examples としてフォーマットします。多くの場合、これはデータをトレーニング用と評価用のデータセットに分割した後に行います。つまり、ExampleGen コンポーネントのコピーがトレーニング用と評価用の 2 つになるようにします。その後、通常は StatisticsGen コンポーネントと SchemaGen コンポーネントが続きます。これにより、データの検査、およびデータスキーマと統計情報の推定が行われます。スキーマと統計情報は ExampleValidator コンポーネントによって使用され、データ内の異常値、欠損値、不正なデータ型が検索されます。これらのコンポーネントはすべて、TensorFlow Data Validation ライブラリの機能を活用しています。

TensorFlow Data Validation(TFDV)は、データセットの初回の探索、可視化、クリーニングを行う際に有用なツールです。TFDV はデータを精査し、データ型、カテゴリ、範囲の推定を行った後、異常値と欠損値を自動的に特定します。また、データセットの調査と理解に役立つ可視化ツールも用意されています。パイプラインの実行が完了したら、MLMD からメタデータを読み取り、Jupyter ノートブックで TFDV の可視化ツールを使用してデータの分析を行えます。

初期モデルのトレーニングとデプロイに続き、TFDV を使用して、デプロイしたモデルに対する推論リクエストの新しいデータをモニタリングし、異常値やブレを確認できます。これは、傾向の変化や時季的な変動により時間の経過とともに変化する時系列データを扱う場合に特に有用です。また、データに問題が生じた場合や、新しいデータでのモデルの再トレーニングが必要になった場合の通知にも役立ちます。

データの可視化

データに対して、TFDV を使用するパイプラインのセクション(通常は StatisticsGen、SchemaGen、ExampleValidator)を初めて実行したら、結果を Jupyter スタイルのノートブックで可視化できます。モデルとアプリケーションに対してデータが最適になるまで、その後の実行結果を比較しながら調整できます。

まず ML メタデータ(MLMD)にクエリを行ってコンポーネントの実行結果を特定します。次に TFDV の可視化サポート API を使用してノートブックで可視化を行います。これには tfdv.load_statistics()tfdv.visualize_statistics() が含まれます。この可視化により、データセットの特性をより正確に把握できます。また、必要に応じて変更もできます。

モデルの開発とトレーニング

特徴量エンジニアリング

典型的な TFX パイプラインには Transform コンポーネントが含まれ、TensorFlow Transform(TFT)ライブラリの機能を活用して特徴量エンジニアリングを行います。Transform コンポーネントは、SchemaGen コンポーネントによって作成されたスキーマを使用し、データ変換を適用して、モデルのトレーニングに使用する特徴を作成、結合、変換します。推論リクエストへの送信データに欠損値があったり、型の変換が必要になったりする可能性がある場合は、Transform コンポーネントで欠損値のクリーンアップと型の変換も行う必要があります。TFX でのトレーニング用に TensorFlow コードを設計する場合には、重要な考慮事項がいくつかあります

モデリングとトレーニング

Transform コンポーネントの結果は SavedModel になり、Trainer コンポーネントで TensorFlow のモデリング コードにインポートされ、使用されます。この SavedModel には Transform コンポーネントで作成されたデータ エンジニアリング変換がすべて含まれているため、トレーニングと推論の両方で、まったく同じコードによる同一の変換が行われます。Transform コンポーネントの SavedModel を含むモデリング コードを使用すると、トレーニングと評価のデータを使用してモデルをトレーニングできます。

モデリング コードの最後のセクションでは、モデルを SavedModel と EvalSavedModel としてそれぞれ保存する必要があります。EvalSavedModel として保存するには、TensorFlow Model Analysis(TFMA)ライブラリを Trainer コンポーネントにインポートし、適用する必要があります。

import tensorflow_model_analysis as tfma
...

tfma.export.export_eval_savedmodel(
        estimator=estimator,
        export_dir_base=eval_model_dir,
        eval_input_receiver_fn=receiver_fn)

モデルのパフォーマンスの分析と把握

Model Analysis

最初のモデル開発とトレーニングに続いて、モデルのパフォーマンスを分析し、正確に把握することが重要です。典型的な TFX パイプラインには Evaluator コンポーネントが含まれ、これが TensorFlow Model Analysis(TFMA)ライブラリの機能を活用して、この開発フェーズでの使用に適したツールセットを提供します。Evaluator コンポーネントは、上記でエクスポートした EvalSavedModel を使用します。また、モデルのパフォーマンスを可視化して分析する際に使用できる SliceSpecs のリストも指定できます。各 SliceSpec は、カテゴリ特徴に対する特定のカテゴリや、数値特徴に対する特定の範囲など、精査対象となるトレーニング データのスライスを定義します。

これは、顧客のセグメントが年間購入額、地理的データ、年齢層、性別で区分できる場合に、それらに対するモデルのパフォーマンスを把握しようとする際などに重要です。ロングテールのデータセットでは特に大切になります。大きな割合を占めるグループのパフォーマンスが、重要ではあるものの割合の小さなグループの許容できないパフォーマンスを覆い隠す可能性があります。たとえば、作成したモデルは平均的な従業員に対してはうまくいっても、経営陣に対してはまったくうまくいかないかもしれません。そして、それを知ることが重要かもしれません。

モデルの分析と可視化

データに対して、初回のモデル トレーニング、およびトレーニング結果に対する Evaluator コンポーネント(TFMA を利用)の実行を完了したら、その結果を Jupyter スタイルのノートブックで可視化できます。モデルとアプリケーションに対して結果が最適になるまで、その後の実行結果を比較しながら調整できます。

まず ML メタデータ(MLMD)にクエリを行ってコンポーネントの実行結果を特定します。次に TFMA の可視化サポート API を使用してノートブックで可視化を行います。これには tfma.load_eval_results()tfma.view.render_slicing_metrics() が含まれます。この可視化により、データセットの特性をより正確に把握できます。また、必要に応じて変更もできます。

デプロイ ターゲット

納得のいくモデルを開発してトレーニングを行ったら、今度はそれを、推論リクエストを受け取る 1 つ以上のデプロイ ターゲットにデプロイします。TFX は、3 つのクラスのデプロイ ターゲットに対するデプロイをサポートしています。SavedModels としてエクスポートされたトレーニング済みモデルは、これらのデプロイ ターゲットのいずれか、またはすべてにデプロイできます。

コンポーネント フロー

推論: TensorFlow Serving

TensorFlow Serving(TFS)は、本番環境向けに設計された、機械学習モデル用の柔軟で高い性能を備えたサービング システムです。SavedModel を使用し、REST または gRPC インターフェースを介して推論リクエストを受け入れます。複数の高度なアーキテクチャの中の 1 つを使用して、同期と分散コンピューティング処理を行い、1 つ以上のネットワーク サーバー上で一連のプロセスとして実行されます。TFS ソリューションの開発とデプロイの詳細については、TFS のドキュメントをご覧ください。

典型的なパイプラインでは、Trainer コンポーネントでトレーニングされた SavedModels を Pusher コンポーネントが使用し、TFS インフラストラクチャにデプロイします。これには、複数のバージョンとモデルの更新の処理が含まれます。

ネイティブ モバイルアプリと IoT アプリケーションでの推論: TensorFlow Lite

TensorFlow Lite は、デベロッパーがトレーニング済み TensorFlow モデルをネイティブ モバイルアプリまたは IoT アプリケーションで使用できるようにするためのツールスイートです。TensorFlow Serving と同じ SavedModel を使用し、量子化やプルーニングなどの最適化手法を適用します。これにより、モバイル デバイスおよび IoT デバイスで実行する場合の要件に応じて、出力されるモデルのサイズとパフォーマンスを最適化します。TensorFlow Lite の使用方法の詳細については、TensorFlow Lite のドキュメントをご覧ください。

JavaScript での推論: TensorFlow JS

TensorFlow JS は、ブラウザ内および Node.js 上でモデルのトレーニングとデプロイを行うための JavaScript ライブラリです。TensorFlow Serving、TensorFlow Lite と同じ SavedModel を使用し、TensorFlow.js Web 形式に変換します。TensorFlow JS の使用方法の詳細については、TensorFlow JS のドキュメントをご覧ください。

Airflow を使用した TFX パイプラインの作成

詳細については、Airflow のワークショップをご覧ください。

Kubeflow を使用した TFX パイプラインの作成

セットアップ

Kubeflow でパイプラインを大規模に実行する場合、Kubernetes クラスタが必要になります。Kubeflow クラスタをデプロイするオプションについては、Kubeflow のデプロイ ガイドラインをご覧ください

TFX パイプラインの構成と実行

Kubeflow で TFX のサンプル パイプラインを実行するには、Cloud AI Platform パイプラインにおける TFX チュートリアルの手順を行ってください。TFX コンポーネントは Kubeflow Pipelines を構成するためにコンテナ化されています。サンプルでは、大量の公開データセットを読み取り、クラウドでのトレーニングとデータ処理ステップを大規模に実行するパイプラインの構成方法を示しています。

パイプライン アクションのコマンドライン インターフェース

TFX は統一された CLI を提供し、Apache Airflow、Apache Beam、Kubeflow などのさまざまなオーケストレータで、パイプラインの作成、更新、実行、リスト化、削除などのあらゆるパイプライン アクションを実行できるようにします。詳細については、こちらの手順をご覧ください。