TFX'te TensorFlow 2.x

TensorFlow 2.0, diğer yeni özellikler ve iyileştirmelerin yanı sıra Keras'ın sıkı entegrasyonu , varsayılan olarak istekli yürütme ve Pythonic işlev yürütme ile 2019'da piyasaya sürüldü .

Bu kılavuz, TFX'teki TF 2.x'e kapsamlı bir teknik genel bakış sağlar.

Hangi sürümü kullanmalı?

TFX, TensorFlow 2.x ile uyumludur ve TensorFlow 1.x'te bulunan üst düzey API'ler (özellikle Tahminciler) çalışmaya devam eder.

TensorFlow 2.x'te yeni projeler başlatın

TensorFlow 2.x, TensorFlow 1.x'in üst düzey yeteneklerini koruduğu için, yeni özellikleri kullanmayı planlamasanız bile eski sürümü yeni projelerde kullanmanın hiçbir avantajı yoktur.

Bu nedenle yeni bir TFX projesine başlıyorsanız TensorFlow 2.x kullanmanızı öneririz. Keras ve diğer yeni özellikler için tam destek kullanıma sunuldukça kodunuzu daha sonra güncellemek isteyebilirsiniz ve TensorFlow 1.x'ten yükseltme yapmaya çalışmak yerine TensorFlow 2.x ile başlarsanız değişikliklerin kapsamı çok daha sınırlı olacaktır. gelecek.

Mevcut projeleri TensorFlow 2.x'e dönüştürme

TensorFlow 1.x için yazılan kod, TensorFlow 2.x ile büyük ölçüde uyumludur ve TFX'te çalışmaya devam edecektir.

Ancak TF 2.x'te kullanıma sunulan iyileştirmelerden ve yeni özelliklerden yararlanmak istiyorsanız TF 2.x'e geçiş talimatlarını takip edebilirsiniz.

Tahminci

Tahminci API'si TensorFlow 2.x'te muhafaza edilmiştir ancak yeni özelliklerin ve geliştirmelerin odak noktası değildir. Tahminciler kullanılarak TensorFlow 1.x veya 2.x'te yazılan kod, TFX'te beklendiği gibi çalışmaya devam edecektir.

İşte saf Tahminciyi kullanan uçtan uca bir TFX örneği: Taksi örneği (Tahmini Aracı)

model_to_estimator ile Keras

Keras modelleri, Tahmin Ediciler gibi çalışmalarına olanak tanıyan tf.keras.estimator.model_to_estimator işleviyle sarılabilir. Bunu kullanmak için:

  1. Bir Keras modeli oluşturun.
  2. Derlenen modeli model_to_estimator aktarın.
  3. Trainer'da model_to_estimator sonucunu, genellikle bir Tahminciyi kullandığınız şekilde kullanın.
# 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'ın kullanıcı modülü dosyası dışında işlem hattının geri kalanı değişmeden kalır.

Yerel Keras (yani model_to_estimator olmayan Keras)

Örnekler ve Colab

Yerel Kera'larla ilgili birkaç örnek:

Ayrıca bileşen başına bir Keras Colab'ımız var.

TFX Bileşenleri

Aşağıdaki bölümlerde ilgili TFX bileşenlerinin yerel Keras'ı nasıl desteklediği açıklanmaktadır.

Dönüştür

Transform şu anda Keras modelleri için deneysel desteğe sahiptir.

Transform bileşeninin kendisi yerel Keras'lar için değişiklik yapılmadan kullanılabilir. preprocessing_fn tanımı, TensorFlow ve tf.Transform ops kullanılarak aynı kalır.

Yerel Keras için sunma işlevi ve değerlendirme işlevi değiştirildi. Ayrıntılar aşağıdaki Eğitmen ve Değerlendirici bölümlerinde tartışılacaktır.

Eğitimci

Yerel Keras'ı yapılandırmak için, GenericExecutor , varsayılan Tahminci tabanlı yürütücüyü değiştirmek üzere Trainer bileşeni için ayarlanması gerekir. Ayrıntılar için lütfen burayı kontrol edin.

Transform ile Keras Modül dosyası

Eğitim modülü dosyası, GenericExecutor tarafından çağrılacak bir run_fn içermelidir; tipik bir Keras run_fn şöyle görünecektir:

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)

Yukarıdaki run_fn , modelin tahmin amacıyla ham örnekleri alabilmesi için eğitilen modeli dışa aktarırken bir sunum imzasına ihtiyaç vardır. Tipik bir servis fonksiyonu şuna benzer:

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

Yukarıdaki sunum işlevinde, tft.TransformFeaturesLayer katmanı kullanılarak çıkarım için ham verilere tf.Transform dönüşümlerinin uygulanması gerekir. Tahminciler için gerekli olan önceki _serving_input_receiver_fn artık Keras'ta ihtiyaç duyulmayacak.

Dönüşüm olmadan Keras Modül dosyası

Bu, yukarıda gösterilen modül dosyasına benzer, ancak dönüşümler yoktur:

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.Strateji

Şu anda TFX yalnızca tek çalışan stratejilerini desteklemektedir (örneğin, MirroredStrategy , OneDeviceStrategy ).

Bir dağıtım stratejisi kullanmak için uygun bir tf.distribute.Strategy oluşturun ve Keras modelinin oluşturulmasını ve derlenmesini bir strateji kapsamına taşıyın.

Örneğin, yukarıdaki model = _build_keras_model() şununla değiştirin:

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

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

MirroredStrategy tarafından kullanılan cihazı (CPU/GPU) doğrulamak için bilgi düzeyinde tensorflow günlüğünü etkinleştirin:

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

ve günlükte Using MirroredStrategy with devices (...) görebilmeniz gerekir.

Değerlendirici

TFMA v0.2x'te ModelValidator ve Evaluator tek bir yeni Evaluator bileşeninde birleştirildi. Yeni Evaluator bileşeni hem tek model değerlendirmesi gerçekleştirebiliyor hem de mevcut modeli önceki modellerle karşılaştırarak doğrulayabiliyor. Bu değişiklikle birlikte İtici bileşeni artık ModelValidator yerine Evaluator'dan gelen bir nimet sonucunu tüketiyor.

Yeni Değerlendirici, Tahminci modellerinin yanı sıra Keras modellerini de destekler. Evaluator artık sunum için kullanılan SavedModel aynısını temel aldığından, daha önce gerekli olan _eval_input_receiver_fn ve eval kayıtlı modeline artık Keras'ta ihtiyaç duyulmayacak.

Daha fazla bilgi için Değerlendirici'ye bakın .