TensorFlow 2.x trong TFX

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:

  1. Xây dựng mô hình Keras.
  2. Chuyển mô hình đã biên dịch vào model_to_estimator .
  3. 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:

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 TensorFlowtf.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.

Xem Người đánh giá để biết thêm thông tin .