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 برآوردگر در TensorFlow 2.x حفظ شده است، اما تمرکز ویژگی‌های جدید و توسعه نیست. کد نوشته شده در TensorFlow 1.x یا 2.x با استفاده از برآوردگرها همانطور که در TFX انتظار می رود به کار خود ادامه می دهد.

در اینجا یک مثال TFX انتها به انتها با استفاده از برآوردگر خالص آورده شده است: مثال تاکسی (Estimator)

Keras با model_to_estimator

مدل‌های Keras را می‌توان با تابع tf.keras.estimator.model_to_estimator پیچیده کرد، که به آن‌ها اجازه می‌دهد طوری کار کنند که گویی تخمین‌گر هستند. برای استفاده از این:

  1. یک مدل کراس بسازید.
  2. مدل کامپایل شده را به model_to_estimator منتقل کنید.
  3. از نتیجه model_to_estimator در Trainer استفاده کنید، روشی که معمولاً از یک برآوردگر استفاده می کنید.
# 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 )

نمونه ها و Colab

در اینجا چندین نمونه از Keras بومی وجود دارد:

ما همچنین یک Keras Colab برای هر جزء داریم.

اجزای TFX

بخش‌های زیر توضیح می‌دهند که چگونه مؤلفه‌های مرتبط TFX از Keras بومی پشتیبانی می‌کنند.

تبدیل کنید

Transform در حال حاضر از مدل های Keras پشتیبانی آزمایشی دارد.

خود مؤلفه Transform می تواند برای Keras های بومی بدون تغییر استفاده شود. تعریف preprocessing_fn با استفاده از TensorFlow و tf.Transform یکسان باقی می ماند.

تابع خدمت و عملکرد eval برای Keras بومی تغییر کرده است. جزئیات در بخش مربی و ارزیاب بعدی مورد بحث قرار خواهد گرفت.

مربی

برای پیکربندی Keras بومی، GenericExecutor باید برای کامپوننت Trainer تنظیم شود تا جایگزین مجری پیش‌فرض مبتنی بر برآوردگر شود. برای جزئیات، لطفا اینجا را بررسی کنید.

فایل Keras Module با Transform

فایل ماژول آموزشی باید حاوی 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 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 Module بدون Transform

این شبیه به فایل ماژول نشان داده شده در بالا است، اما بدون تغییرات:

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

در حال حاضر 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(...)

برای تأیید دستگاه (CPU/GPU) مورد استفاده توسط MirroredStrategy ، ثبت‌نام در سطح اطلاعات tensorflow را فعال کنید:

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

و باید بتوانید Using MirroredStrategy with devices (...) در لاگ ببینید.

ارزیاب

در TFMA v0.2x، ModelValidator و Evaluator در یک جزء جدید Evaluator ترکیب شده‌اند. جزء ارزیاب جدید می تواند هم ارزیابی تک مدل را انجام دهد و هم مدل فعلی را در مقایسه با مدل های قبلی اعتبار سنجی کند. با این تغییر، کامپوننت Pusher اکنون به جای ModelValidator یک نتیجه برکت از Evaluator مصرف می کند.

ارزیاب جدید از مدل های Keras و همچنین مدل های برآوردگر پشتیبانی می کند. مدل _eval_input_receiver_fn و eval saved که قبلاً مورد نیاز بود، دیگر با Keras مورد نیاز نخواهد بود، زیرا Evaluator اکنون بر اساس همان SavedModel است که برای ارائه استفاده می‌شود.

برای اطلاعات بیشتر به ارزیاب مراجعه کنید .