TensorFlow 2.0 được phát hành vào năm 2019 , với sự tích hợp chặt chẽ của Keras , thực thi háo hức theo mặc định và thực thi hàm Pythonic , cùng với các tính năng và cải tiến mới khác.
Hướng dẫn này cung cấp tổng quan kỹ thuật toàn diện về TF 2.x trong TFX.
Phiên bản nào để sử dụng?
TFX tương thích với TensorFlow 2.x và các API cấp cao tồn tại trong TensorFlow 1.x (đặc biệt là Công cụ ước tính) tiếp tục hoạt động.
Bắt đầu dự án mới trong TensorFlow 2.x
Vì TensorFlow 2.x vẫn giữ được các khả năng cấp cao của TensorFlow 1.x nên việc sử dụng phiên bản cũ hơn cho các dự án mới sẽ không có lợi ích gì, ngay cả khi bạn không định sử dụng các tính năng mới.
Do đó, nếu bạn đang bắt đầu một dự án TFX mới, chúng tôi khuyên bạn nên sử dụng TensorFlow 2.x. Bạn có thể muốn cập nhật mã của mình sau khi có hỗ trợ đầy đủ cho Keras và các tính năng mới khác, đồng thời phạm vi thay đổi sẽ bị hạn chế hơn nhiều nếu bạn bắt đầu với TensorFlow 2.x, thay vì cố gắng nâng cấp từ TensorFlow 1.x trong tương lai.
Chuyển đổi các dự án hiện có sang TensorFlow 2.x
Mã được viết cho TensorFlow 1.x phần lớn tương thích với TensorFlow 2.x và sẽ tiếp tục hoạt động trong TFX.
Tuy nhiên, nếu bạn muốn tận dụng những cải tiến và tính năng mới khi chúng có sẵn trong TF 2.x, bạn có thể làm theo hướng dẫn để di chuyển sang TF 2.x.
Công cụ ước tính
API Công cụ ước tính đã được giữ lại trong TensorFlow 2.x nhưng không phải là trọng tâm của các tính năng và sự phát triển mới. Mã được viết bằng TensorFlow 1.x hoặc 2.x sử dụng Công cụ ước tính sẽ tiếp tục hoạt động như mong đợi trong TFX.
Dưới đây là ví dụ về TFX toàn diện sử dụng Công cụ ước tính thuần túy: Ví dụ về Taxi (Công cụ ước tính)
Máy ảnh với model_to_estimator
Các mô hình Keras có thể được bao bọc bằng hàm tf.keras.estimator.model_to_estimator
, cho phép chúng hoạt động như thể chúng là Công cụ ước tính. Để sử dụng cái này:
- Xây dựng mô hình Keras.
- Chuyển mô hình đã biên dịch vào
model_to_estimator
. - Sử dụng kết quả của
model_to_estimator
trong Trainer, theo cách bạn thường sử dụng Công cụ ước tính.
# 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,
...
}
Ngoài tệp mô-đun người dùng của Trainer, phần còn lại của quy trình vẫn không thay đổi.
Keras gốc (tức là Keras không có model_to_estimator
)
Ví dụ và Colab
Dưới đây là một số ví dụ với Keras bản địa:
- Penguin ( tệp mô-đun ): Ví dụ từ đầu đến cuối 'Xin chào thế giới'.
- MNIST ( tệp mô-đun ): Ví dụ về hình ảnh và TFLite end-to-end.
- Taxi ( tệp mô-đun ): ví dụ từ đầu đến cuối với cách sử dụng Chuyển đổi nâng cao.
Chúng tôi cũng có Keras Colab cho từng thành phần.
Thành phần TFX
Các phần sau đây giải thích cách các thành phần TFX liên quan hỗ trợ Keras gốc.
chuyển đổi
Transform hiện có hỗ trợ thử nghiệm cho các mô hình Keras.
Bản thân thành phần Transform có thể được sử dụng cho Keras gốc mà không cần thay đổi. Định nghĩa preprocessing_fn
vẫn giữ nguyên, sử dụng các hoạt động TensorFlow và tf.Transform .
Chức năng phục vụ và chức năng eval được thay đổi cho Keras gốc. Thông tin chi tiết sẽ được thảo luận trong phần Huấn luyện viên và Người đánh giá sau đây.
huấn luyện viên
Để định cấu hình Keras gốc, GenericExecutor
cần được đặt cho thành phần Trainer để thay thế trình thực thi dựa trên Công cụ ước tính mặc định. Để biết chi tiết, xin vui lòng kiểm tra ở đây .
Tệp mô-đun Keras với Transform
Tệp mô-đun đào tạo phải chứa run_fn
sẽ được GenericExecutor
gọi, run_fn
Keras điển hình sẽ trông như thế này:
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)
Trong run_fn
ở trên, cần có chữ ký cung cấp khi xuất mô hình đã đào tạo để mô hình đó có thể lấy các ví dụ thô để dự đoán. Một chức năng phục vụ điển hình sẽ trông như thế này:
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
Trong chức năng phục vụ ở trên, các phép biến đổi tf.Transform cần được áp dụng cho dữ liệu thô để suy luận, sử dụng lớp tft.TransformFeaturesLayer
. _serving_input_receiver_fn
trước đó được yêu cầu cho Công cụ ước tính sẽ không còn cần thiết với Keras nữa.
Tệp Mô-đun Keras không có Chuyển đổi
Điều này tương tự như tệp mô-đun được hiển thị ở trên, nhưng không có các biến đổi:
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
Tại thời điểm này, TFX chỉ hỗ trợ các chiến lược riêng lẻ (ví dụ: MirroredStrategy , OneDeviceStrategy ).
Để sử dụng chiến lược phân phối, hãy tạo một tf.distribute.Strategy thích hợp và chuyển việc tạo và biên dịch mô hình Keras vào trong phạm vi chiến lược.
Ví dụ: thay thế model = _build_keras_model()
ở trên bằng:
mirrored_strategy = tf.distribute.MirroredStrategy()
with mirrored_strategy.scope():
model = _build_keras_model()
# Rest of the code can be unchanged.
model.fit(...)
Để xác minh thiết bị (CPU/GPU) được MirroredStrategy
sử dụng, hãy bật ghi nhật ký dòng chảy cấp độ thông tin:
import logging
logging.getLogger("tensorflow").setLevel(logging.INFO)
và bạn sẽ có thể xem Using MirroredStrategy with devices (...)
trong nhật ký.
Người đánh giá
Trong TFMA v0.2x, ModelValidator và Evaluator đã được kết hợp thành một thành phần Evaluator mới duy nhất. Thành phần Người đánh giá mới có thể thực hiện cả việc đánh giá mô hình đơn lẻ và cũng có thể xác nhận mô hình hiện tại so với các mô hình trước đó. Với thay đổi này, thành phần Pusher hiện sử dụng kết quả ban phước từ Evaluator thay vì ModelValidator.
Trình đánh giá mới hỗ trợ các mô hình Keras cũng như các mô hình Công cụ ước tính. Mô hình đã lưu _eval_input_receiver_fn
và eval được yêu cầu trước đây sẽ không còn cần thiết với Keras nữa vì Trình đánh giá hiện dựa trên cùng một SavedModel
được sử dụng để phân phát.