تم إصدار 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
، والتي تسمح لها بالعمل كما لو كانت مقدرات. لاستخدام هذا:
- بناء نموذج كيراس.
- قم بتمرير النموذج المترجم إلى
model_to_estimator
. - استخدم نتيجة
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 الأصلية:
- Penguin ( ملف الوحدة النمطية ): مثال شامل لـ "Hello World".
- MNIST ( ملف الوحدة النمطية ): مثال شامل للصورة وTFLite.
- Taxi ( ملف الوحدة النمطية ): مثال شامل مع استخدام التحويل المتقدم.
لدينا أيضًا Keras Colab لكل مكون.
مكونات تي اف اكس
تشرح الأقسام التالية كيفية دعم مكونات TFX ذات الصلة لـ Keras الأصلية.
تحويل
يتمتع Transform حاليًا بدعم تجريبي لنماذج Keras.
يمكن استخدام مكون التحويل نفسه لـ Keras الأصلي دون تغيير. يظل تعريف preprocessing_fn
كما هو، باستخدام TensorFlow و tf.Transform ops.
تم تغيير وظيفة التقديم ووظيفة التقييم لـ 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.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
المستخدم للعرض.