TensorFlow 2.0 dirilis pada tahun 2019 , dengan integrasi Keras yang erat , eksekusi yang bersemangat secara default, dan eksekusi fungsi Pythonic , di antara fitur dan peningkatan baru lainnya.
Panduan ini memberikan gambaran teknis komprehensif tentang TF 2.x di TFX.
Versi mana yang akan digunakan?
TFX kompatibel dengan TensorFlow 2.x, dan API tingkat tinggi yang ada di TensorFlow 1.x (khususnya Estimator) terus berfungsi.
Mulai proyek baru di TensorFlow 2.x
Karena TensorFlow 2.x mempertahankan kemampuan tingkat tinggi TensorFlow 1.x, tidak ada keuntungan menggunakan versi lama pada project baru, meskipun Anda tidak berencana menggunakan fitur baru tersebut.
Oleh karena itu, jika Anda memulai proyek TFX baru, sebaiknya gunakan TensorFlow 2.x. Anda mungkin ingin mengupdate kode nanti karena dukungan penuh untuk Keras dan fitur baru lainnya telah tersedia, dan cakupan perubahan akan jauh lebih terbatas jika Anda memulai dengan TensorFlow 2.x, daripada mencoba mengupgrade dari TensorFlow 1.x di masa depan.
Mengonversi proyek yang ada ke TensorFlow 2.x
Kode yang ditulis untuk TensorFlow 1.x sebagian besar kompatibel dengan TensorFlow 2.x dan akan terus berfungsi di TFX.
Namun, jika Anda ingin memanfaatkan peningkatan dan fitur baru yang tersedia di TF 2.x, Anda dapat mengikuti petunjuk untuk bermigrasi ke TF 2.x .
Penaksir
Estimator API tetap dipertahankan di TensorFlow 2.x, tetapi tidak menjadi fokus fitur dan pengembangan baru. Kode yang ditulis di TensorFlow 1.x atau 2.x menggunakan Estimator akan terus berfungsi seperti yang diharapkan di TFX.
Berikut adalah contoh TFX end-to-end menggunakan Estimator murni: Contoh taksi (Estimator)
Keras dengan model_to_estimator
Model keras dapat digabungkan dengan fungsi tf.keras.estimator.model_to_estimator
, yang memungkinkannya bekerja seolah-olah mereka adalah Estimator. Untuk menggunakan ini:
- Membangun model Keras.
- Teruskan model yang dikompilasi ke
model_to_estimator
. - Gunakan hasil
model_to_estimator
di Trainer, seperti biasanya Anda menggunakan 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,
...
}
Selain file modul pengguna Trainer, alur lainnya tetap tidak berubah.
Keras Asli (yaitu Keras tanpa model_to_estimator
)
Contoh dan Colab
Berikut beberapa contoh dengan Keras asli:
- Penguin ( file modul ): Contoh ujung-ke-ujung 'Halo dunia'.
- MNIST ( file modul ): Gambar dan contoh ujung-ke-ujung TFLite.
- Taksi ( file modul ): contoh ujung ke ujung dengan penggunaan Transformasi tingkat lanjut.
Kami juga memiliki Keras Colab per komponen.
Komponen TFX
Bagian berikut menjelaskan bagaimana komponen TFX terkait mendukung Keras asli.
Mengubah
Transform saat ini memiliki dukungan eksperimental untuk model Keras.
Komponen Transform sendiri dapat digunakan untuk Keras asli tanpa perubahan. Definisi preprocessing_fn
tetap sama, menggunakan operasi TensorFlow dan tf.Transform .
Fungsi penyajian dan fungsi eval diubah untuk Keras asli. Detailnya akan dibahas pada bagian Trainer dan Evaluator berikut ini.
Pelatih
Untuk mengonfigurasi Keras asli, GenericExecutor
perlu disetel untuk komponen Trainer guna menggantikan eksekutor berbasis Estimator default. Untuk detailnya, silakan periksa di sini .
File Modul Keras dengan Transform
File modul pelatihan harus berisi run_fn
yang akan dipanggil oleh GenericExecutor
, Keras run_fn
yang khas akan terlihat seperti ini:
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)
Pada run_fn
di atas, tanda tangan penyajian diperlukan saat mengekspor model yang dilatih agar model dapat mengambil contoh mentah untuk prediksi. Fungsi penyajian pada umumnya akan terlihat seperti ini:
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
Dalam fungsi penyajian di atas, transformasi tf.Transform perlu diterapkan ke data mentah untuk inferensi, menggunakan lapisan tft.TransformFeaturesLayer
. _serving_input_receiver_fn
sebelumnya yang diperlukan untuk Estimator tidak lagi diperlukan dengan Keras.
File Modul Keras tanpa Transformasi
Ini mirip dengan file modul yang ditunjukkan di atas, tetapi tanpa transformasi:
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.Strategi
Saat ini TFX hanya mendukung strategi pekerja tunggal (misalnya, MirroredStrategy , OneDeviceStrategy ).
Untuk menggunakan strategi distribusi, buat tf.distribute.Strategy yang sesuai dan pindahkan pembuatan dan kompilasi model Keras ke dalam cakupan strategi.
Misalnya, ganti model = _build_keras_model()
di atas dengan:
mirrored_strategy = tf.distribute.MirroredStrategy()
with mirrored_strategy.scope():
model = _build_keras_model()
# Rest of the code can be unchanged.
model.fit(...)
Untuk memverifikasi perangkat (CPU/GPU) yang digunakan oleh MirroredStrategy
, aktifkan logging tensorflow tingkat info:
import logging
logging.getLogger("tensorflow").setLevel(logging.INFO)
dan Anda seharusnya dapat melihat Using MirroredStrategy with devices (...)
di log.
Penilai
Di TFMA v0.2x, ModelValidator dan Evaluator telah digabungkan menjadi satu komponen Evaluator baru . Komponen Evaluator baru dapat melakukan evaluasi model tunggal dan juga memvalidasi model saat ini dibandingkan dengan model sebelumnya. Dengan perubahan ini, komponen Pusher kini menggunakan hasil berkah dari Evaluator, bukan ModelValidator.
Evaluator baru mendukung model Keras dan juga model Estimator. Model tersimpan _eval_input_receiver_fn
dan eval yang diperlukan sebelumnya tidak lagi diperlukan dengan Keras, karena Evaluator sekarang didasarkan pada SavedModel
yang sama yang digunakan untuk penyajian.