このページは Cloud Translation API によって翻訳されました。
Switch to English

TFXのTensorFlow 2.x

TensorFlow 2.0は、2019年にリリースされたと、 Kerasの緊密な統合熱心に実行デフォルトでは、と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 1.xからアップグレードしようとするのではなく、TensorFlow 2.xから始めると、変更の範囲がはるかに制限されます。未来。

既存のプロジェクトをTensorFlow 2.xに変換する

TensorFlow 1.x用に作成されたコードはTensorFlow 2.xとほぼ互換性があり、TFXで引き続き機能します。

ただし、TF 2.xで利用可能になったときに改善や新機能を利用したい場合は、TF 2.x への移行手順に従ってください

見積もり

Estimator APIはTensorFlow 2.xでも保持されていますが、新機能や開発の焦点では​​ありません。 Estimatorsを使用してTensorFlow 1.xまたは2.xで記述されたコードは、TFXで期待どおりに機能し続けます。

以下は、純粋なEstimatorを使用したエンドツーエンドのTFXの例です。 タクシーの例(Estimator)

model_to_estimatorしたmodel_to_estimator

Kerasモデルは、 tf.keras.estimator.model_to_estimator関数でラップできます。これにより、Estimatorであるかのように機能できます。これを使用するには:

  1. Kerasモデルを構築します。
  2. コンパイルしたモデルをmodel_to_estimatorます。
  3. トレーナーでmodel_to_estimatorの結果を使用します。通常、Estimatorを使用します。
 # Build a Keras model.
def _keras_model_builder():
  """Creates a Keras model."""
  ...

  model = tf.keras.Model(inputs=inputs, outputs=output)
  model.compile()

  return model


# Write a typical trainer function
def trainer_fn(trainer_fn_args, schema):
  """Build the estimator, using model_to_estimator."""
  ...

  # Model to estimator
  estimator = tf.keras.estimator.model_to_estimator(
      keras_model=_keras_model_builder(), config=run_config)

  return {
      'estimator': estimator,
      ...
  }
 

トレーナーのユーザーモジュールファイル以外は、パイプラインの残りの部分は変更されません。以下に、model_to_estimatorでKerasを使用したエンドツーエンドのTFXの例を示します。 アイリスの例(model_to_estimator)

ネイティブmodel_to_estimator (つまり、 model_to_estimatorないmodel_to_estimator

例とコラボ

ネイティブKerasのいくつかの例を以下に示します。

また、コンポーネントごとのKeras Colabもあります。

TFXコンポーネント

以下のセクションでは、関連するTFXコンポーネントがネイティブKerasをどのようにサポートするかについて説明します。

変身

Transformは現在、Kerasモデルを試験的にサポートしています。

Transformコンポーネント自体は、変更なしでネイティブKerasに使用できます。 TensorFlowtf.Transform opsを使用して、 preprocessing_fn定義は同じままです。

ネイティブKerasのサービング関数とeval関数が変更されました。詳細については、以下のトレーナーとエバリュエーターのセクションで説明します。

トレーナー

ネイティブGenericExecutorを構成するには、 GenericExecutorをトレーナーコンポーネントに設定して、デフォルトのEstimatorベースのエグゼキューGenericExecutor必要があります。詳しくはこちらをご覧ください。

変換付きのKerasモジュールファイル

トレーニングモジュールファイル必須に含まれるrun_fnによって呼び出されますGenericExecutor 、典型的なKerasのrun_fn次のようになります。

 def run_fn(fn_args: TrainerFnArgs):
  """Train the model based on given args.

  Args:
    fn_args: Holds args used to train the model as name/value pairs.
  """
  tf_transform_output = tft.TFTransformOutput(fn_args.transform_output)

  # Train and eval files contains transformed examples.
  # _input_fn read dataset based on transformed feature_spec from tft.
  train_dataset = _input_fn(fn_args.train_files, tf_transform_output, 40)
  eval_dataset = _input_fn(fn_args.eval_files, tf_transform_output, 40)

  model = _build_keras_model()

  model.fit(
      train_dataset,
      steps_per_epoch=fn_args.train_steps,
      validation_data=eval_dataset,
      validation_steps=fn_args.eval_steps)

  signatures = {
      'serving_default':
          _get_serve_tf_examples_fn(model,
                                    tf_transform_output).get_concrete_function(
                                        tf.TensorSpec(
                                            shape=[None],
                                            dtype=tf.string,
                                            name='examples')),
  }
  model.save(fn_args.serving_model_dir, save_format='tf', signatures=signatures)
 

上記のrun_fnでは、トレーニングされたモデルをエクスポートするときに、モデルが予測の生の例を取ることができるようにするために、サービス署名が必要です。典型的な配信機能は次のようになります。

 def _get_serve_tf_examples_fn(model, tf_transform_output):
  """Returns a function that parses a serialized tf.Example."""

  # the layer is added as an attribute to the model in order to make sure that
  # the model assets are handled correctly when exporting.
  model.tft_layer = tf_transform_output.transform_features_layer()

  @tf.function
  def serve_tf_examples_fn(serialized_tf_examples):
    """Returns the output to be used in the serving signature."""
    feature_spec = tf_transform_output.raw_feature_spec()
    feature_spec.pop(_LABEL_KEY)
    parsed_features = tf.io.parse_example(serialized_tf_examples, feature_spec)

    transformed_features = model.tft_layer(parsed_features)

    return model(transformed_features)

  return serve_tf_examples_fn
 

上記の配信関数では、 tft.TransformFeaturesLayerレイヤーを使用して、推論のためにtf.Transform変換を生データに適用する必要があります。 Estimatorsに必要であった以前の_serving_input_receiver_fn必要なくなりました。

変換なしのKerasモジュールファイル

これは上記のモジュールファイルに似ていますが、変換はありません。

 def _get_serve_tf_examples_fn(model, schema):

  @tf.function
  def serve_tf_examples_fn(serialized_tf_examples):
    feature_spec = _get_raw_feature_spec(schema)
    feature_spec.pop(_LABEL_KEY)
    parsed_features = tf.io.parse_example(serialized_tf_examples, feature_spec)
    return model(parsed_features)

  return serve_tf_examples_fn


def run_fn(fn_args: TrainerFnArgs):
  schema = io_utils.parse_pbtxt_file(fn_args.schema_file, schema_pb2.Schema())

  # Train and eval files contains raw examples.
  # _input_fn reads the dataset based on raw feature_spec from schema.
  train_dataset = _input_fn(fn_args.train_files, schema, 40)
  eval_dataset = _input_fn(fn_args.eval_files, schema, 40)

  model = _build_keras_model()

  model.fit(
      train_dataset,
      steps_per_epoch=fn_args.train_steps,
      validation_data=eval_dataset,
      validation_steps=fn_args.eval_steps)

  signatures = {
      'serving_default':
          _get_serve_tf_examples_fn(model, schema).get_concrete_function(
              tf.TensorSpec(shape=[None], dtype=tf.string, name='examples')),
  }
  model.save(fn_args.serving_model_dir, save_format='tf', signatures=signatures)
 
tf.distribute.Strategy

現時点では、TFXはシングルワーカー戦略(たとえば、 MirroredStrategyOneDeviceStrategy )のみをサポートしています。

配布戦略を使用するには、適切なtf.distribute.Strategyを作成し、Kerasモデルの作成とコンパイルを戦略スコープ内に移動します。

たとえば、上記のmodel = _build_keras_model()を次のように置き換えます。

   mirrored_strategy = tf.distribute.MirroredStrategy()
  with mirrored_strategy.scope():
    model = _build_keras_model()

  # Rest of the code can be unchanged.
  model.fit(...)
 

MirroredStrategyで使用されるデバイス(CPU / GPU)を確認するには、情報レベルのテンソルフローログを有効にします。

 import logging
logging.getLogger("tensorflow").setLevel(logging.INFO)
 

ログUsing MirroredStrategy with devices (...)Using MirroredStrategy with devices (...)を確認できるはずです。

評価者

TFMA v0.2xでは、ModelValidatorとEvaluatorが1つの新しいEvaluatorコンポーネントに統合されました。新しいエバリュエーターコンポーネントは、単一モデルの評価と、以前のモデルと比較した現在のモデルの検証の両方を実行できます。この変更により、PusherコンポーネントはModelValidatorではなくEvaluatorからの祝福結果を消費するようになりました。

新しいEvaluatorは、KerasモデルとEstimatorモデルをサポートしています。 Evaluatorは現在、提供に使用されるものと同じSavedModel基づいているため、以前に必要であった_eval_input_receiver_fnおよびeval保存モデルは_eval_input_receiver_fn不要になります。

詳細については、エバリュエーターを参照してください