Trang này được dịch bởi Cloud Translation API.
Switch to English

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 chức năng 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.

Sử dụng phiên bản nào?

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 các dự án mới trong TensorFlow 2.x

Vì TensorFlow 2.x vẫn giữ các khả năng cấp cao của TensorFlow 1.x, nên không có lợi thế khi sử dụng phiên bản cũ hơn trên các dự án mới, 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 và 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 các 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 để chuyển sang TF 2.x.

Công cụ ước tính

API Ướ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.

Đây là ví dụ TFX end-to-end sử dụng Công cụ ước tính thuần túy: Ví dụ về taxi (Công cụ ước tính)

Keras 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. Đây là một ví dụ TFX end-to-end sử dụng Keras với model_to_estimator: Ví dụ Iris (model_to_estimator)

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 mỗi thành phần.

Thành phần TFX

Các phần sau giải thích cách các thành phần TFX liên quan hỗ trợ Keras gốc.

Biế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 .

Hàm phục vụ và hàm eval được thay đổi cho các Keras gốc. Thông tin chi tiết sẽ được thảo luận ở phần Trainer và Đánh giá sau.

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 Estimator mặc định. Để biết chi tiết, vui lòng kiểm tra tại đây .

Tệp mô-đun Keras với Biến đổi

Tệp mô-đun đào tạo phải chứa run_fn sẽ được GenericExecutor , một run_fn điển hình của run_fn sẽ giống như sau:

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ý phục vụ khi xuất mô hình được đà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ẽ giống như sau:

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 hàm 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 đây đượ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ó Biế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 công nhân đơn lẻ (ví dụ: MirroredStrategy , OneDeviceStrategy ).

Để sử dụng chiến lược phân phối, hãy tạo tf.distribute.Strategy thích hợp và di chuyển việc tạo và biên dịch mô hình Keras bên trong phạm vi chiến lược.

Ví dụ: thay thế ở trên model = _build_keras_model() 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 tính năng ghi nhật ký dòng căng thẳng cấp thông tin:

import logging
logging.getLogger("tensorflow").setLevel(logging.INFO)

và bạn sẽ có thể thấy 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 . Thành phần Trình đánh giá mới có thể thực hiện cả đánh giá mô hình đơn lẻ và cũng 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 giờ sẽ sử dụng kết quả may mắn 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 tính. Mô hình đã lưu _eval_input_receiver_fn và eval vốn đượ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 .