TensorFlow 2.x в TFX

TensorFlow 2.0 был выпущен в 2019 году и отличался тесной интеграцией Keras , быстрым выполнением по умолчанию и выполнением функций Pythonic , а также другими новыми функциями и улучшениями .

В этом руководстве представлен подробный технический обзор TF 2.x в TFX.

Какую версию использовать?

TFX совместим с TensorFlow 2.x, и API-интерфейсы высокого уровня, существовавшие в TensorFlow 1.x (особенно оценщики), продолжают работать.

Начинайте новые проекты в 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.

Оценщик

API-интерфейс Estimator остался в TensorFlow 2.x, но не является предметом новых функций и разработок. Код, написанный в TensorFlow 1.x или 2.x с использованием оценщиков, будет продолжать работать в TFX должным образом.

Вот сквозной пример TFX с использованием чистого оценщика: пример такси (оценщик)

Керас с model_to_estimator

Модели Keras можно обернуть функцией tf.keras.estimator.model_to_estimator , которая позволяет им работать так, как если бы они были оценщиками. Чтобы использовать это:

  1. Создайте модель Keras.
  2. Передайте скомпилированную модель в model_to_estimator .
  3. Используйте результат model_to_estimator в Trainer так же, как вы обычно используете 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,
      ...
  }

За исключением файла пользовательского модуля Trainer, остальная часть конвейера остается неизменной.

Собственный Керас (т.е. Керас без model_to_estimator )

Примеры и сотрудничество

Вот несколько примеров с собственным Keras:

У нас также есть покомпонентный Keras Colab .

Компоненты TFX

В следующих разделах объясняется, как связанные компоненты TFX поддерживают собственный Keras.

Трансформировать

В настоящее время Transform имеет экспериментальную поддержку моделей Keras.

Сам компонент Transform можно использовать для собственного Keras без изменений. Определение preprocessing_fn остается прежним, с использованием операций TensorFlow и tf.Transform .

Функция обслуживания и функция оценки изменены для собственного Keras. Подробности будут обсуждаться в следующих разделах для тренеров и оценщиков.

Тренер

Чтобы настроить собственный Keras, необходимо установить GenericExecutor для компонента Trainer, чтобы заменить исполнителя на основе Estimator по умолчанию. Для получения подробной информации, пожалуйста, проверьте здесь .

Файл модуля Keras с преобразованием

Файл учебного модуля должен содержать run_fn , который будет вызываться GenericExecutor . Типичный run_fn Keras будет выглядеть так:

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 schema from tft.
  train_dataset = _input_fn(fn_args.train_files, fn_args.data_accessor,
                            tf_transform_output.transformed_metadata.schema)
  eval_dataset = _input_fn(fn_args.eval_files, fn_args.data_accessor,
                           tf_transform_output.transformed_metadata.schema)

  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

В приведенной выше обслуживающей функции преобразования tf.Transform необходимо применить к необработанным данным для вывода, используя слой tft.TransformFeaturesLayer . Предыдущий _serving_input_receiver_fn , который требовался для оценщиков, больше не понадобится в Keras.

Файл модуля 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 data schema.
  train_dataset = _input_fn(fn_args.train_files, fn_args.data_accessor, schema)
  eval_dataset = _input_fn(fn_args.eval_files, fn_args.data_accessor, schema)

  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.Стратегия

В настоящее время TFX поддерживает только стратегии одного рабочего процесса (например, MirroredStrategy , OneDeviceStrategy ).

Чтобы использовать стратегию распространения, создайте соответствующий 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 , включите ведение журнала тензорного потока на уровне информации:

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

и вы сможете увидеть в журнале Using MirroredStrategy with devices (...) .

оценщик

В TFMA v0.2x ModelValidator и Evaluator были объединены в один новый компонент Evaluator . Новый компонент Evaluator может выполнять как оценку отдельной модели, так и проверять текущую модель по сравнению с предыдущими моделями. Благодаря этому изменению компонент Pusher теперь использует результат благословения от Evaluator вместо ModelValidator.

Новый Evaluator поддерживает модели Keras, а также модели Estimator. Сохраненные модели _eval_input_receiver_fn и eval, которые требовались ранее, больше не будут необходимы для Keras, поскольку Evaluator теперь основан на той же SavedModel , которая используется для обслуживания.

Дополнительную информацию см. в Оценщике .