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:
- Bir Keras modeli oluşturun.
- Derlenen modeli
model_to_estimator
aktarın. - 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:
- Penguen ( modül dosyası ): 'Merhaba dünya' uçtan uca örneği.
- MNIST ( modül dosyası ): Görüntü ve TFLite uçtan uca örneği.
- Taksi ( modül dosyası ): Gelişmiş Dönüşüm kullanımına sahip uçtan uca ö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 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ğitmen
Yerel Keras'ı yapılandırmak için, GenericExecutor
, varsayılan Tahminci tabanlı yürütücünün yerini alacak 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
, eğitilen modeli dışa aktarırken modelin tahmin için ham örnekleri alabilmesi için 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 (örn. 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()
ifadesini ş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.