TFX での TensorFlow 2.x
TensorFlow 2.0 は 2019 年にリリースされ、Keras との緊密な統合、デフォルトでの Eager execution、Python 式の関数の実行 など、新しい機能と改善を導入しました。
このガイドでは、TFX における TF 2.x の技術的な概要を総合的に説明します。
どのバージョンを使用すればよいのか
TFX は TensorFlow 2.x と互換性があり、TensorFlow 1.x で存在していた高位 API(特に Estimator)も引き続き動作します。
TensorFlow 2.x で新しいプロジェクトを開始する
TensorFlow 2.x は TensorFlow 1.x の高位機能を保持しているため、新しいプロジェクトで新機能を使用しないにしても古いバージョンを使用するメリットありません。
したがって、新しい TFX プロジェクトを開始する場合は、TensorFlow 2.x を使用することをお勧めします。後になって、Keras のフルサポートや新機能が利用できるようになったときにコードを更新する場合、TensorFlow 2.x で作成しているほうが、TensorFlow 1.x からアップグレードしようとするよりも、将来的に変更の範囲がはるかに狭まります。
既存のプロジェクトを TensorFlow 2.x に変換する
TensorFlow 1.x 向けに記述されたコードはほとんど TensorFlow 2.xと互換しており、TFX でも引き続き動作します。
ただし、TF 2.x で改善や新機能が利用できるようになったときにそれらを利用する場合は、TF 2.x への移行手順を実施することができます。
Estimator
Estimator API は TensorFlow 2.x でも保持されていますが、新しい機能と開発の焦点ではありません。TensorFlow 1.x または 2.x で Estimator を使用して記述されたコードは TFX でも引き続き期待通りに動作します。
Taxi example (Estimator) は、純粋な Estimator を使用したエンドツーエンドの TFX の例です。
model_to_estimator
を使った Keras
Keras モデルは tf.keras.estimator.model_to_estimator
関数で囲むことができます。こうすると、Keras モデルが Estimator であるかのように動作させることができます。この関数を使用するには、次のように行います。
Keras モデルを構築します。
コンパイルされたモデルを
model_to_estimator
に渡します。通常の Estimator の使用と同じように、
model_to_estimator
の結果を Trainer に使用します。
Trainer のユーザーモジュールファイルを除き、残りのパイプラインに変更はありません。
ネイティブの Keras(model_to_estimator
を使用しない Keras)
注意: Keras の全機能のフルサポートに現在取り組んでいます。ほとんどの場合、TFX 内の Keras は期待通りに機能しますが、FeatireColumns のスパース特徴量ではまだ動作しません。
例と Colab
以下は、ネイティブ Keras を使用したいくつかの例です。
また、コンポーネント別の Keras Colab もあります。
TFX コンポーネント
以下のセクションでは、関連する TFX コンポーネントがどのようにネイティブ Keras をサポートしているのかを説明します。
Transform
Transform の Keras モデルサポートは、現在実験的です。
Transform コンポーネント自体は変更なしでネイティブ Keras に使用できます。preprocessing_fn
の定義も同じままで、TensorFlow と tf.Transform 演算を使用します。
ネイティブ Keras のサービング関数と評価関数は変更されています。詳細は、以下の Trainer と Evaluator のセクションで説明します。
注意: preprocessing_fn
内での変換は、training または eval のラベル特徴量に適用することはできません。
Trainer
ネイディブ Keras を構成するには、Trainer の GenericExecutor
を設定し、デフォルトの Estimator に基づく Executor を置き換える必要があります。詳細はこちらをご覧ください。
Transform を使った Keras モジュールファイル
トレーニングモジュールファイルには run_fn
が必要であり、これは、GenericExecutor
によって呼び出されます。一般的な Keras run_fn
は次のようになります。
上記の run_fn
ではトレーニング済みのモデルをエクスポートする際に予測するための生の Example を取れるよう、サービングシグネチャが必要です。一般的なサービング関数は次のようになります。
上記のサービング関数では、tft.TransformFeaturesLayer
レイヤーを使用して、tf.Transform 変換を生データに適用して推論する必要があります。Estimator に必要であった以前の _serving_input_receiver_fn
は Keras では使用する必要がなくなりました。
Transform を使用しない Keras モジュールファイル
これは上記に示したモジュールファイルに似ていますが、変換が使用されていません。
tf.distribute.Strategy
現時点では、TFX はシングルワーカーストラテジー(MirroredStrategy、OneDeviceStrategy など)のみをサポートしています。
分散型ストラテジーを使用するには、適切な tf.distribute.Strategy を作成し、作成したものと Keras モデルのコンパイルをストラテジーのスコープ内に移動します。
たとえば、上記の model = _build_keras_model()
を次のように置き換えます。
MirroredStrategy
が使用するデバイス(CPU/GPU)を確認するには、info レベルの TensorFlow ログ機能を有効にします。
すると、ログに Using MirroredStrategy with devices (...)
が表示されるようになります。
注意: GPU のメモリ不足の問題では、環境変数の TF_FORCE_GPU_ALLOW_GROWTH=true
が必要な場合があります。詳細は、TensorFlow の GPU ガイドをご覧ください。
Evaluator
TFMA v0.2x では、ModelValidator と Evaluator は 1 つの新しい Evaluator コンポーネントに統合されました。新しい Evaluator コンポーネントは、単一モデルの評価だけでなく、現在のモデルを前のモデルと比較して検証することができます。この変更により、Pusher コンポーネントは ModelValidator ではなく Evaluator の blessing 結果を消費するようになりました。
新しい Evaluator は、Keras モデルだけでなく Estimator モデルもサポートしています。Evaluator がサービングに使用されるものと同じ SavedModel
に基づくようになったため、以前に必要であった _eval_input_receiver_fn
と eval Saved Model は Keras では必要でなくなっています。