SIG TFX-Addons 커뮤니티에 가입하고 TFX를 더욱 향상시키는 데 도움을 주세요! SIG TFX 애드온 가입

TensorFlow 모델 분석

TensorFlow Extended (TFX)의 주요 구성 요소 예

TensorFlow Model Analysis (TFMA) 는 다양한 데이터 조각에서 모델 평가를 수행하기위한 라이브러리입니다. TFMA는 Apache Beam을 사용하여 대량의 데이터에 대해 분산 방식으로 계산을 수행합니다.

이 예제 colab 노트북은 TFMA를 사용하여 데이터 세트의 특성과 관련하여 모델의 성능을 조사하고 시각화하는 방법을 보여줍니다. 이전에 훈련 한 모델을 사용하고 이제 결과를 가지고 놀 수 있습니다! 우리가 학습 한 모델은 Chicago Taxi Example을 위한 것으로 시카고 시에서 출시 한 Taxi Trips 데이터 세트 를 사용합니다. BigQuery UI 에서 전체 데이터 세트를 살펴보세요.

모델러이자 개발자로서이 데이터가 어떻게 사용되는지, 그리고 모델의 예측이 초래할 수있는 잠재적 인 이점과 피해에 대해 생각해보십시오. 이와 같은 모델은 사회적 편견과 불균형을 강화할 수 있습니다. 기능이 해결하려는 문제와 관련이 있습니까? 아니면 편향을 유발합니까? 자세한 내용은 ML 공정성 에 대해 읽어보십시오.

데이터 세트의 열은 다음과 같습니다.

pickup_community_area 요금 trip_start_month
trip_start_hour trip_start_day trip_start_timestamp
픽업 _ 위도 픽업 _ 경도 dropoff_latitude
dropoff_longitude trip_miles Pickup_census_tract
dropoff_census_tract 지불 _ 유형 회사
trip_seconds dropoff_community_area

Jupyter 확장 프로그램 설치

jupyter nbextension enable --py widgetsnbextension --sys-prefix 
jupyter nbextension install --py --symlink tensorflow_model_analysis --sys-prefix 
jupyter nbextension enable --py tensorflow_model_analysis --sys-prefix 

TensorFlow 모델 분석 (TFMA) 설치

이것은 모든 종속성을 가져오고 1 분 정도 걸립니다.

# Upgrade pip to the latest, and install TFMA.
pip install -U pip
pip install tensorflow-model-analysis

이제 아래 셀을 실행하기 전에 런타임을 다시 시작해야합니다.

# This setup was tested with TF 2.5 and TFMA 0.31 (using colab), but it should
# also work with the latest release.
import sys

# Confirm that we're using Python 3
assert sys.version_info.major==3, 'This notebook must be run using Python 3.'

import tensorflow as tf
print('TF version: {}'.format(tf.__version__))
import apache_beam as beam
print('Beam version: {}'.format(beam.__version__))
import tensorflow_model_analysis as tfma
print('TFMA version: {}'.format(tfma.__version__))
TF version: 2.5.0
Beam version: 2.29.0
TFMA version: 0.31.0

파일로드

필요한 모든 것이 포함 된 tar 파일을 다운로드합니다. 그것은 포함:

  • 훈련 및 평가 데이터 세트
  • 데이터 스키마
  • 저장된 모델 (케 라스 및 추정기) 및 저장된 모델 평가 (추정기) 훈련 및 제공.
# Download the tar file from GCP and extract it
import io, os, tempfile
TAR_NAME = 'saved_models-2.2'
BASE_DIR = tempfile.mkdtemp()
DATA_DIR = os.path.join(BASE_DIR, TAR_NAME, 'data')
MODELS_DIR = os.path.join(BASE_DIR, TAR_NAME, 'models')
SCHEMA = os.path.join(BASE_DIR, TAR_NAME, 'schema.pbtxt')
OUTPUT_DIR = os.path.join(BASE_DIR, 'output')

!curl -O https://storage.googleapis.com/artifacts.tfx-oss-public.appspot.com/datasets/{TAR_NAME}.tar
!tar xf {TAR_NAME}.tar
!mv {TAR_NAME} {BASE_DIR}
!rm {TAR_NAME}.tar

print("Here's what we downloaded:")
!ls -R {BASE_DIR}
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 6800k  100 6800k    0     0  25.0M      0 --:--:-- --:--:-- --:--:-- 25.0M
Here's what we downloaded:
/tmp/tmpsu298d8g:
saved_models-2.2

/tmp/tmpsu298d8g/saved_models-2.2:
data  models  schema.pbtxt

/tmp/tmpsu298d8g/saved_models-2.2/data:
eval  train

/tmp/tmpsu298d8g/saved_models-2.2/data/eval:
data.csv

/tmp/tmpsu298d8g/saved_models-2.2/data/train:
data.csv

/tmp/tmpsu298d8g/saved_models-2.2/models:
estimator  keras

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator:
eval_model_dir  serving_model_dir

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir:
1591221811

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811:
saved_model.pb  tmp.pbtxt  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir:
checkpoint
eval_chicago-taxi-eval
events.out.tfevents.1591221780.my-pipeline-b57vp-237544850
export
graph.pbtxt
model.ckpt-100.data-00000-of-00001
model.ckpt-100.index
model.ckpt-100.meta

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/eval_chicago-taxi-eval:
events.out.tfevents.1591221799.my-pipeline-b57vp-237544850

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/export:
chicago-taxi

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi:
1591221801

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi/1591221801:
saved_model.pb  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi/1591221801/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpsu298d8g/saved_models-2.2/models/keras:
0  1  2

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/0:
saved_model.pb  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/0/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/1:
saved_model.pb  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/1/variables:
variables.data-00000-of-00001  variables.index

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/2:
saved_model.pb  variables

/tmp/tmpsu298d8g/saved_models-2.2/models/keras/2/variables:
variables.data-00000-of-00001  variables.index

스키마 구문 분석

다운로드 한 항목 중에는 TensorFlow Data Validation 에서 생성 한 데이터 스키마가 있습니다. 이제 TFMA와 함께 사용할 수 있도록 파싱 해 보겠습니다.

import tensorflow as tf
from google.protobuf import text_format
from tensorflow.python.lib.io import file_io
from tensorflow_metadata.proto.v0 import schema_pb2
from tensorflow.core.example import example_pb2

schema = schema_pb2.Schema()
contents = file_io.read_file_to_string(SCHEMA)
schema = text_format.Parse(contents, schema)

스키마를 사용하여 TFRecord 생성

TFMA에 데이터 세트에 대한 액세스 권한을 부여해야하므로 TFRecords 파일을 생성하겠습니다. 스키마를 사용하여 생성 할 수 있습니다. 각 기능에 대한 올바른 유형을 제공하기 때문입니다.

import csv

datafile = os.path.join(DATA_DIR, 'eval', 'data.csv')
reader = csv.DictReader(open(datafile, 'r'))
examples = []
for line in reader:
  example = example_pb2.Example()
  for feature in schema.feature:
    key = feature.name
    if feature.type == schema_pb2.FLOAT:
      example.features.feature[key].float_list.value[:] = (
          [float(line[key])] if len(line[key]) > 0 else [])
    elif feature.type == schema_pb2.INT:
      example.features.feature[key].int64_list.value[:] = (
          [int(line[key])] if len(line[key]) > 0 else [])
    elif feature.type == schema_pb2.BYTES:
      example.features.feature[key].bytes_list.value[:] = (
          [line[key].encode('utf8')] if len(line[key]) > 0 else [])
  # Add a new column 'big_tipper' that indicates if tips was > 20% of the fare. 
  # TODO(b/157064428): Remove after label transformation is supported for Keras.
  big_tipper = float(line['tips']) > float(line['fare']) * 0.2
  example.features.feature['big_tipper'].float_list.value[:] = [big_tipper]
  examples.append(example)

tfrecord_file = os.path.join(BASE_DIR, 'train_data.rio')
with tf.io.TFRecordWriter(tfrecord_file) as writer:
  for example in examples:
    writer.write(example.SerializeToString())

!ls {tfrecord_file}
/tmp/tmpsu298d8g/train_data.rio

TFMA 설정 및 실행

TFMA는 TF keras 모델, 일반 TF2 서명 API 기반 모델, TF 추정기 기반 모델을 비롯한 다양한 모델 유형을 지원합니다. get_started 가이드에는 지원되는 모델 유형의 전체 목록과 제한 사항이 있습니다. 이 예에서는 EvalSavedModel 로 저장된 추정기 기반 모델뿐만 아니라 keras 기반 모델을 구성하는 방법을 보여줄 것입니다. 다른 구성의 예는 FAQ 를 참조하십시오.

TFMA는 모델이 TFMA 구성 설정의 일부로 저장된 후에 정의 된 메트릭뿐만 아니라 훈련 시간에 사용 된 메트릭 (예 : 내장 메트릭) 계산을 지원합니다. keras 설정 의 경우 구성의 일부로 메트릭 및 플롯을 수동으로 추가하는 방법을 보여줍니다 (지원되는 메트릭 및 플롯에 대한 정보는 메트릭 가이드 참조). 추정기 설정을 위해 모델과 함께 저장된 기본 제공 메트릭을 사용합니다. 또한 설정에는 다음 섹션에서 자세히 설명하는 여러 슬라이싱 사양이 포함되어 있습니다.

tfma.EvalConfigtfma.EvalSharedModel 을 만든 후 tfma.run_model_analysis를 사용하여 tfma.run_model_analysis 를 실행할 수 있습니다. 그러면 나중에 메트릭과 플롯을 렌더링하는 데 사용할 수있는 tfma.EvalResult 가 생성됩니다.

케 라스

import tensorflow_model_analysis as tfma

# Setup tfma.EvalConfig settings
keras_eval_config = text_format.Parse("""
  ## Model information
  model_specs {
    # For keras (and serving models) we need to add a `label_key`.
    label_key: "big_tipper"
  }

  ## Post training metric information. These will be merged with any built-in
  ## metrics from training.
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "BinaryAccuracy" }
    metrics { class_name: "BinaryCrossentropy" }
    metrics { class_name: "AUC" }
    metrics { class_name: "AUCPrecisionRecall" }
    metrics { class_name: "Precision" }
    metrics { class_name: "Recall" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics { class_name: "CalibrationPlot" }
    metrics { class_name: "ConfusionMatrixPlot" }
    # ... add additional metrics and plots ...
  }

  ## Slicing information
  slicing_specs {}  # overall slice
  slicing_specs {
    feature_keys: ["trip_start_hour"]
  }
  slicing_specs {
    feature_keys: ["trip_start_day"]
  }
  slicing_specs {
    feature_values: {
      key: "trip_start_month"
      value: "1"
    }
  }
  slicing_specs {
    feature_keys: ["trip_start_hour", "trip_start_day"]
  }
""", tfma.EvalConfig())

# Create a tfma.EvalSharedModel that points at our keras model.
keras_model_path = os.path.join(MODELS_DIR, 'keras', '2')
keras_eval_shared_model = tfma.default_eval_shared_model(
    eval_saved_model_path=keras_model_path,
    eval_config=keras_eval_config)

keras_output_path = os.path.join(OUTPUT_DIR, 'keras')

# Run TFMA
keras_eval_result = tfma.run_model_analysis(
    eval_shared_model=keras_eval_shared_model,
    eval_config=keras_eval_config,
    data_location=tfrecord_file,
    output_path=keras_output_path)
​​
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:apache_beam.runners.interactive.interactive_environment:Dependencies required for Interactive Beam PCollection visualization are not available, please use: `pip install apache-beam[interactive]` to install necessary dependencies to enable all data visualization features.
WARNING:apache_beam.io.tfrecordio:Couldn't find python-snappy so the implementation of _TFRecordUtil._masked_crc32c is not as fast as it could be.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/writers/metrics_plots_and_validations_writer.py:113: tf_record_iterator (from tensorflow.python.lib.io.tf_record) is deprecated and will be removed in a future version.
Instructions for updating:
Use eager execution and: 
`tf.data.TFRecordDataset(path)`

평가자

import tensorflow_model_analysis as tfma

# Setup tfma.EvalConfig settings
estimator_eval_config = text_format.Parse("""
  ## Model information
  model_specs {
    # To use EvalSavedModel set `signature_name` to "eval".
    signature_name: "eval"
  }

  ## Post training metric information. These will be merged with any built-in
  ## metrics from training.
  metrics_specs {
    metrics { class_name: "ConfusionMatrixPlot" }
    # ... add additional metrics and plots ...
  }

  ## Slicing information
  slicing_specs {}  # overall slice
  slicing_specs {
    feature_keys: ["trip_start_hour"]
  }
  slicing_specs {
    feature_keys: ["trip_start_day"]
  }
  slicing_specs {
    feature_values: {
      key: "trip_start_month"
      value: "1"
    }
  }
  slicing_specs {
    feature_keys: ["trip_start_hour", "trip_start_day"]
  }
""", tfma.EvalConfig())

# Create a tfma.EvalSharedModel that points at our eval saved model.
estimator_base_model_path = os.path.join(
    MODELS_DIR, 'estimator', 'eval_model_dir')
estimator_model_path = os.path.join(
    estimator_base_model_path, os.listdir(estimator_base_model_path)[0])
estimator_eval_shared_model = tfma.default_eval_shared_model(
    eval_saved_model_path=estimator_model_path,
    eval_config=estimator_eval_config)

estimator_output_path = os.path.join(OUTPUT_DIR, 'estimator')

# Run TFMA
estimator_eval_result = tfma.run_model_analysis(
    eval_shared_model=estimator_eval_shared_model,
    eval_config=estimator_eval_config,
    data_location=tfrecord_file,
    output_path=estimator_output_path)
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/load.py:169: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/load.py:169: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0.
INFO:tensorflow:Restoring parameters from /tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables
INFO:tensorflow:Restoring parameters from /tmp/tmpsu298d8g/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/graph_ref.py:189: get_tensor_from_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.get_tensor_from_tensor_info or tf.compat.v1.saved_model.get_tensor_from_tensor_info.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_model_analysis/eval_saved_model/graph_ref.py:189: get_tensor_from_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.
Instructions for updating:
This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.get_tensor_from_tensor_info or tf.compat.v1.saved_model.get_tensor_from_tensor_info.

메트릭 및 플롯 시각화

이제 평가를 실행 했으므로 TFMA를 사용하여 시각화를 살펴 보겠습니다. 다음 예에서는 keras 모델에서 평가를 실행 한 결과를 시각화합니다. 추정기 기반 모델을 보려면 estimator_eval_result 변수를 가리 키도록 eval_result 를 업데이트하십시오.

eval_result = keras_eval_result
# eval_result = estimator_eval_result

렌더링 메트릭

메트릭을 보려면 tfma.view.render_slicing_metrics 를 사용 tfma.view.render_slicing_metrics

기본적으로보기는 Overall 슬라이스를 표시합니다. 특정 슬라이스를 보려면 slicing_column 을 설정하여 열 이름을 사용하거나 tfma.SlicingSpec 제공 할 수 tfma.SlicingSpec .

메트릭 시각화는 다음 상호 작용을 지원합니다.

  • 이동하려면 클릭하고 드래그하세요.
  • 확대 / 축소하려면 스크롤
  • 보기를 재설정하려면 마우스 오른쪽 버튼을 클릭하십시오.
  • 원하는 데이터 포인트 위로 마우스를 가져 가면 자세한 내용을 볼 수 있습니다.
  • 하단의 선택 항목을 사용하여 네 가지 유형의보기 중에서 선택합니다.

예를 들어, slicing_column 을 설정하여 이전 slicing_specstrip_start_hour 기능을 살펴 slicing_specs .

tfma.view.render_slicing_metrics(eval_result, slicing_column='trip_start_hour')
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_hour:2', …

슬라이스 개요

기본 시각화는 슬라이스 수가 적을 때 슬라이스 개요 입니다. 각 조각에 대한 메트릭 값을 보여줍니다. 위에서 trip_start_hour 선택 trip_start_hour 각 시간에 대한 정확도 및 AUC와 같은 측정 항목을 보여 trip_start_hour 다른 시간이 아닌 특정 시간에 관련된 문제를 찾을 수 있습니다.

위의 시각화에서 :

  • 열 헤더를 클릭하여 trip_start_hours 기능인 기능 열을 정렬 해보십시오.
  • 정밀도를 기준으로 정렬을 시도 하고 예제를 통해 일부 시간의 정밀도가 0 인 것을 확인하십시오. 이는 문제를 나타낼 수 있습니다.

차트를 사용하면 조각에서 다른 메트릭을 선택하고 표시 할 수도 있습니다.

  • "표시"메뉴에서 다른 측정 항목을 선택해보세요.
  • "표시"메뉴에서 리콜을 선택해보십시오. 일부 시간에 대한 리콜 (예제 포함)이 0이며 이는 문제를 나타낼 수 있습니다.

더 적은 수의 예제 또는 "가중치"로 슬라이스를 필터링하도록 임계 값을 설정할 수도 있습니다. 최소한의 예를 입력하거나 슬라이더를 사용할 수 있습니다.

메트릭 히스토그램

이보기는 또한 슬라이스 수가 많을 때 기본보기 인 메트릭 히스토그램 을 대체 시각화로 지원합니다. 결과는 버킷으로 나뉘어 슬라이스 수 / 총 가중치 / 둘 다 시각화 할 수 있습니다. 열 머리글을 클릭하여 열을 정렬 할 수 있습니다. 가중치가 작은 슬라이스는 임계 값을 설정하여 필터링 할 수 있습니다. 회색 밴드를 드래그하여 추가 필터링을 적용 할 수 있습니다. 범위를 재설정하려면 밴드를 두 번 클릭하십시오. 필터링을 사용하여 시각화 및 메트릭 테이블에서 이상 값을 제거 할 수도 있습니다. 선형 눈금 대신 대수 눈금으로 전환하려면 톱니 바퀴 아이콘을 클릭합니다.

  • 시각화 메뉴에서 "메트릭 히스토그램"을 선택해보십시오.

더 많은 조각

우리의 초기 tfma.EvalConfig 의 전체 목록을 만들어 slicing_specs 우리가 통과 업데이트 슬라이스 정보에 의해 시각화 할 수 있습니다, tfma.view.render_slicing_metrics . 여기에서 trip_start_day 슬라이스 (요일)를 선택합니다. trip_start_daytrip_start_month 변경하고 다시 렌더링하여 다른 조각을 조사해보십시오.

tfma.view.render_slicing_metrics(eval_result, slicing_column='trip_start_day')
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day:3', '…

TFMA는 또한 기능 조합을 분석하기위한 기능 교차 생성을 지원합니다. 원래 설정은 교차 trip_start_hourtrip_start_day 생성했습니다.

tfma.view.render_slicing_metrics(
    eval_result,
    slicing_spec=tfma.SlicingSpec(
        feature_keys=['trip_start_hour', 'trip_start_day']))
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day_X_tri…

두 열을 교차하면 많은 조합이 생성됩니다! 정오에 시작하는 여행 만 살펴 보도록 십자가를 좁혀 보겠습니다. 그런 다음 시각화에서 binary_accuracy 를 선택 binary_accuracy .

tfma.view.render_slicing_metrics(
    eval_result,
    slicing_spec=tfma.SlicingSpec(
        feature_keys=['trip_start_day'], feature_values={'trip_start_hour': '12'}))
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day_X_tri…

플롯 렌더링

받는 추가 된 플롯 tfma.EvalConfig 후 교육으로 metric_specs 사용하여 표시 할 수 있습니다 tfma.view.render_plot .

메트릭과 마찬가지로 플롯을 슬라이스별로 볼 수 있습니다. 메트릭과 달리 특정 슬라이스 값에 대한 플롯 만 표시 할 수 있으므로 tfma.SlicingSpec 사용해야하며 슬라이스 기능 이름과 값을 모두 지정해야합니다. 슬라이스가 제공되지 않으면 Overall 슬라이스에 대한 플롯이 사용됩니다.

아래 예에서는 trip_start_hour:1 슬라이스에 대해 계산 된 CalibrationPlotConfusionMatrixPlot 플롯을 표시합니다.

tfma.view.render_plot(
    eval_result,
    tfma.SlicingSpec(feature_values={'trip_start_hour': '1'}))
PlotViewer(config={'sliceName': 'trip_start_hour:1', 'metricKeys': {'calibrationPlot': {'metricName': 'calibra…

시간 경과에 따른 모델 성능 추적

학습 데이터 세트는 모델 학습에 사용되며 테스트 데이터 세트와 프로덕션에서 모델로 전송 될 데이터를 대표합니다. 그러나 추론 요청의 데이터는 학습 데이터와 동일하게 유지 될 수 있지만 많은 경우 모델의 성능이 변경 될 정도로 충분히 변경되기 시작합니다.

즉, 변경 사항을 인식하고 대응할 수 있도록 지속적으로 모델의 성능을 모니터링하고 측정해야합니다. TFMA가 어떻게 도울 수 있는지 살펴 보겠습니다.

3 개의 다른 모델 실행을로드하고 TFMA를 사용하여 render_time_series 사용하여 비교하는 방법을 살펴 render_time_series .

# Note this re-uses the EvalConfig from the keras setup.

# Run eval on each saved model
output_paths = []
for i in range(3):
  # Create a tfma.EvalSharedModel that points at our saved model.
  eval_shared_model = tfma.default_eval_shared_model(
      eval_saved_model_path=os.path.join(MODELS_DIR, 'keras', str(i)),
      eval_config=keras_eval_config)

  output_path = os.path.join(OUTPUT_DIR, 'time_series', str(i))
  output_paths.append(output_path)

  # Run TFMA
  tfma.run_model_analysis(eval_shared_model=eval_shared_model,
                          eval_config=keras_eval_config,
                          data_location=tfrecord_file,
                          output_path=output_path)
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta

먼저, 어제 모델을 학습하고 배포했다고 상상하고 이제는 오늘 들어오는 새 데이터에서 모델이 어떻게 작동하는지보고 싶습니다. 시각화는 AUC를 표시하여 시작됩니다. UI에서 다음을 수행 할 수 있습니다.

  • "메트릭 시리즈 추가"메뉴를 사용하여 다른 메트릭을 추가하십시오.
  • x를 클릭하여 원하지 않는 그래프를 닫습니다.
  • 자세한 내용을 보려면 데이터 포인트 (그래프의 선분 끝) 위로 마우스를 가져갑니다.
eval_results_from_disk = tfma.load_eval_results(output_paths[:2])

tfma.view.render_time_series(eval_results_from_disk)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'binary_accuracy': {'doubleValu…

이제 우리는 다른 날이 지났다고 상상하고 오늘 들어오는 새로운 데이터에 대해 이전 이틀과 비교하여 어떻게되는지보고 싶습니다.

eval_results_from_disk = tfma.load_eval_results(output_paths)

tfma.view.render_time_series(eval_results_from_disk)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'binary_accuracy': {'doubleValu…

모델 검증

TFMA는 동시에 여러 모델을 평가하도록 구성 할 수 있습니다. 일반적으로 이것은 새로운 모델을 기준선 (예 : 현재 제공되는 모델)과 비교하여 메트릭 (예 : AUC 등)의 성능 차이가 기준선과 관련이 있는지 확인하기 위해 수행됩니다. 임계 값 이 구성되면 TFMA는 성능이 tfma.ValidationResult 와 일치하는지 여부를 나타내는 tfma.ValidationResult 레코드를 생성합니다.

케 라스 평가를 재구성하여 후보와 기준의 두 모델을 비교해 보겠습니다. 또한 AUC 메트릭에 tmfa.MetricThreshold 를 설정하여 기준에 대한 후보의 성능을 검증합니다.

# Setup tfma.EvalConfig setting
eval_config_with_thresholds = text_format.Parse("""
  ## Model information
  model_specs {
    name: "candidate"
    # For keras we need to add a `label_key`.
    label_key: "big_tipper"
  }
  model_specs {
    name: "baseline"
    # For keras we need to add a `label_key`.
    label_key: "big_tipper"
    is_baseline: true
  }

  ## Post training metric information
  metrics_specs {
    metrics { class_name: "ExampleCount" }
    metrics { class_name: "BinaryAccuracy" }
    metrics { class_name: "BinaryCrossentropy" }
    metrics {
      class_name: "AUC"
      threshold {
        # Ensure that AUC is always > 0.9
        value_threshold {
          lower_bound { value: 0.9 }
        }
        # Ensure that AUC does not drop by more than a small epsilon
        # e.g. (candidate - baseline) > -1e-10 or candidate > baseline - 1e-10
        change_threshold {
          direction: HIGHER_IS_BETTER
          absolute { value: -1e-10 }
        }
      }
    }
    metrics { class_name: "AUCPrecisionRecall" }
    metrics { class_name: "Precision" }
    metrics { class_name: "Recall" }
    metrics { class_name: "MeanLabel" }
    metrics { class_name: "MeanPrediction" }
    metrics { class_name: "Calibration" }
    metrics { class_name: "CalibrationPlot" }
    metrics { class_name: "ConfusionMatrixPlot" }
    # ... add additional metrics and plots ...
  }

  ## Slicing information
  slicing_specs {}  # overall slice
  slicing_specs {
    feature_keys: ["trip_start_hour"]
  }
  slicing_specs {
    feature_keys: ["trip_start_day"]
  }
  slicing_specs {
    feature_keys: ["trip_start_month"]
  }
  slicing_specs {
    feature_keys: ["trip_start_hour", "trip_start_day"]
  }
""", tfma.EvalConfig())

# Create tfma.EvalSharedModels that point at our keras models.
candidate_model_path = os.path.join(MODELS_DIR, 'keras', '2')
baseline_model_path = os.path.join(MODELS_DIR, 'keras', '1')
eval_shared_models = [
  tfma.default_eval_shared_model(
      model_name=tfma.CANDIDATE_KEY,
      eval_saved_model_path=candidate_model_path,
      eval_config=eval_config_with_thresholds),
  tfma.default_eval_shared_model(
      model_name=tfma.BASELINE_KEY,
      eval_saved_model_path=baseline_model_path,
      eval_config=eval_config_with_thresholds),
]

validation_output_path = os.path.join(OUTPUT_DIR, 'validation')

# Run TFMA
eval_result_with_validation = tfma.run_model_analysis(
    eval_shared_models,
    eval_config=eval_config_with_thresholds,
    data_location=tfrecord_file,
    output_path=validation_output_path)
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:absl:Tensorflow version (2.5.0) found. Note that TFMA support for TF 2.0 is currently in beta

기준선에 대해 하나 이상의 모델로 평가를 실행할 때 TFMA는 평가 중에 계산 된 모든 메트릭에 대해 diff 메트릭을 자동으로 추가합니다. 이러한 메트릭은 해당 메트릭의 이름을 따서 명명되지만 메트릭 이름에 _diff 추가됩니다.

실행에 의해 생성 된 메트릭을 살펴 보겠습니다.

tfma.view.render_time_series(eval_result_with_validation)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'binary_accuracy': {'doubleValu…

이제 유효성 검사의 출력을 살펴 보겠습니다. 유효성 검사 결과를 보려면tfma.load_validator_result 를 사용tfma.load_validator_result . 이 예의 경우 AUC가 임계 값 미만이므로 유효성 검사가 실패합니다.

validation_result = tfma.load_validation_result(validation_output_path)
print(validation_result.validation_ok)
False