TensorFlow 2.x في TFX

تم إصدار TensorFlow 2.0 في عام 2019 ، مع تكامل وثيق مع Keras ، والتنفيذ المتحمس افتراضيًا، وتنفيذ وظيفة Pythonic ، من بين الميزات والتحسينات الجديدة الأخرى.

يقدم هذا الدليل نظرة عامة فنية شاملة عن TF 2.x في TFX.

أي إصدار للاستخدام؟

TFX متوافق مع TensorFlow 2.x، وتستمر واجهات برمجة التطبيقات عالية المستوى الموجودة في 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.

مقدر

تم الاحتفاظ بواجهة برمجة تطبيقات Estimator في TensorFlow 2.x، ولكنها ليست محور التركيز على الميزات الجديدة والتطوير. ستستمر التعليمات البرمجية المكتوبة في TensorFlow 1.x أو 2.x باستخدام المُقدِّرين في العمل كما هو متوقع في TFX.

فيما يلي مثال TFX شامل باستخدام المقدر الخالص: مثال تاكسي (المقدر)

Keras مع model_to_estimator

يمكن تغليف نماذج Keras باستخدام وظيفة tf.keras.estimator.model_to_estimator ، والتي تسمح لها بالعمل كما لو كانت مقدرات. لاستخدام هذا:

  1. بناء نموذج كيراس.
  2. قم بتمرير النموذج المترجم إلى model_to_estimator .
  3. استخدم نتيجة model_to_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,
      ...
  }

بخلاف ملف وحدة المستخدم الخاصة بالمدرب، تظل بقية المسار دون تغيير.

Keras الأصلية (أي Keras بدون model_to_estimator )

أمثلة وكولاب

فيما يلي عدة أمثلة مع Keras الأصلية:

لدينا أيضًا Keras Colab لكل مكون.

مكونات تي اف اكس

تشرح الأقسام التالية كيفية دعم مكونات TFX ذات الصلة لـ Keras الأصلية.

تحول

يتمتع Transform حاليًا بدعم تجريبي لنماذج Keras.

يمكن استخدام مكون التحويل نفسه لـ Keras الأصلي دون تغيير. يظل تعريف preprocessing_fn كما هو، باستخدام TensorFlow و tf.Transform ops.

تم تغيير وظيفة التقديم ووظيفة التقييم لـ Keras الأصلية. ستتم مناقشة التفاصيل في أقسام المدرب والمقيم التالية.

مدرب

لتكوين Keras الأصلي، يجب تعيين GenericExecutor لمكون المدرب ليحل محل المنفذ الافتراضي القائم على المُقدر. لمزيد من التفاصيل، يرجى التحقق هنا .

ملف وحدة 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.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 الآن نتيجة نعمة من Evaluator بدلاً من ModelValidator.

يدعم المقيم الجديد نماذج Keras بالإضافة إلى نماذج المقدر. لن تكون هناك حاجة إلى نموذج _eval_input_receiver_fn وeval المحفوظ الذي كان مطلوبًا سابقًا مع Keras، نظرًا لأن Evaluator يعتمد الآن على نفس SavedModel المستخدم للعرض.

راجع المقيم لمزيد من المعلومات .