Unisciti alla community di SIG TFX-Addons e aiutaci a rendere TFX ancora migliore! Iscriviti a SIG TFX-Addons

Analisi del modello TensorFlow

Un esempio di un componente chiave di TensorFlow Extended (TFX)

TensorFlow Model Analysis (TFMA) è una libreria per eseguire la valutazione del modello su diverse sezioni di dati. TFMA esegue i suoi calcoli in modo distribuito su grandi quantità di dati utilizzando Apache Beam .

Questo taccuino di colab di esempio illustra come utilizzare TFMA per indagare e visualizzare le prestazioni di un modello rispetto alle caratteristiche del set di dati. Useremo un modello che abbiamo addestrato in precedenza, e ora puoi giocare con i risultati! Il modello che abbiamo addestrato era per il Chicago Taxi Example , che utilizza il set di dati Taxi Trips rilasciato dalla città di Chicago. Esplora il set di dati completo nell'interfaccia utente di BigQuery .

In qualità di modellatore e sviluppatore, pensa a come vengono utilizzati questi dati e ai potenziali benefici e danni che le previsioni di un modello possono causare. Un modello come questo potrebbe rafforzare i pregiudizi e le disparità della società. Una caratteristica è rilevante per il problema che vuoi risolvere o introdurrà pregiudizi? Per ulteriori informazioni, leggi Informazioni sull'equità del machine learning .

Le colonne nel set di dati sono:

pick-up_community_area tariffa trip_start_month
trip_start_hour trip_start_day trip_start_timestamp
pickup_latitude pickup_longitudine dropoff_latitude
dropoff_longitude viaggio_miglia pickup_census_tract
dropoff_census_tract modalità di pagamento azienda
trip_seconds dropoff_community_area suggerimenti

Installa le estensioni 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 

Installa TensorFlow Model Analysis (TFMA)

Questo estrarrà tutte le dipendenze e richiederà un minuto.

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

Ora devi riavviare il runtime prima di eseguire le celle sottostanti.

# 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

Carica i file

Scaricheremo un file tar che ha tutto ciò di cui abbiamo bisogno. Quello include:

  • Dataset di formazione e valutazione
  • Schema dei dati
  • Addestrare e servire i modelli salvati (keras e estimatore) e valutare i modelli salvati (estimatore).
# 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

Analizza lo schema

Tra le cose che abbiamo scaricato c'era uno schema per i nostri dati creato da TensorFlow Data Validation . Analizziamolo ora in modo da poterlo utilizzare con 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)

Usa lo schema per creare TFRecords

Dobbiamo concedere a TFMA l'accesso al nostro set di dati, quindi creiamo un file TFRecords. Possiamo usare il nostro schema per crearlo, poiché ci fornisce il tipo corretto per ogni caratteristica.

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

Configura ed esegui TFMA

TFMA supporta una serie di diversi tipi di modello, inclusi modelli TF Keras, modelli basati su API di firma TF2 generiche, nonché modelli basati su stimatori TF. La guida get_started contiene l'elenco completo dei tipi di modello supportati e le eventuali restrizioni. Per questo esempio mostreremo come configurare un modello basato su Keras e un modello basato su estimatore che è stato salvato come EvalSavedModel . Vedere le FAQ per esempi di altre configurazioni.

TFMA fornisce supporto per il calcolo delle metriche utilizzate al momento dell'addestramento (ovvero le metriche integrate) e delle metriche definite dopo che il modello è stato salvato come parte delle impostazioni di configurazione di TFMA. Per la nostra configurazione keras dimostreremo l'aggiunta manuale di metriche e grafici come parte della nostra configurazione (consulta la guida alle metriche per informazioni sulle metriche e i grafici supportati). Per l'impostazione dello stimatore utilizzeremo le metriche integrate che sono state salvate con il modello. Le nostre configurazioni includono anche una serie di specifiche di slicing che sono discusse in maggior dettaglio nelle sezioni seguenti.

Dopo aver creato un tfma.EvalConfig e tfma.EvalSharedModel possiamo quindi eseguire TFMA utilizzando tfma.run_model_analysis . Questo creerà un tfma.EvalResult che possiamo usare in seguito per il rendering delle nostre metriche e grafici.

Keras

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)`

Estimatore

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.

Visualizzazione di metriche e grafici

Ora che abbiamo eseguito la valutazione, diamo un'occhiata alle nostre visualizzazioni utilizzando TFMA. Per i seguenti esempi, visualizzeremo i risultati dell'esecuzione della valutazione sul modello Keras. Per visualizzare il modello basato sullo stimatore, aggiorna eval_result in modo che punti alla nostra variabile estimator_eval_result .

0 papà586100

Metriche di rendering

Per visualizzare le metriche usi tfma.view.render_slicing_metrics

Per impostazione predefinita, le viste mostreranno la sezione Overall . Per visualizzare una particolare fetta puoi utilizzare il nome della colonna (impostando slicing_column ) o fornire un tfma.SlicingSpec .

La visualizzazione delle metriche supporta le seguenti interazioni:

  • Fare clic e trascinare per eseguire la panoramica
  • Scorri per ingrandire
  • Fare clic con il tasto destro per ripristinare la visualizzazione
  • Passa il mouse sul punto dati desiderato per vedere maggiori dettagli.
  • Seleziona da quattro diversi tipi di visualizzazioni utilizzando le selezioni in basso.

Ad esempio, slicing_column per esaminare la funzione trip_start_hour dalle nostre precedenti 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', …

Panoramica delle fette

La visualizzazione predefinita è Panoramica sezioni quando il numero di sezioni è piccolo. Mostra i valori delle metriche per ogni sezione. Poiché abbiamo selezionato trip_start_hour sopra, ci mostra metriche come precisione e AUC per ogni ora, il che ci consente di cercare problemi specifici per alcune ore e non per altre.

Nella visualizzazione sopra:

  • Prova a ordinare la colonna delle funzioni, che è la nostra funzione trip_start_hours , facendo clic sull'intestazione della colonna
  • Prova a ordinare in base alla precisione e nota che la precisione per alcune ore con gli esempi è 0, il che potrebbe indicare un problema

Il grafico ci consente inoltre di selezionare e visualizzare diverse metriche nelle nostre sezioni.

  • Prova a selezionare metriche diverse dal menu "Mostra"
  • Prova a selezionare il richiamo nel menu "Mostra" e nota che il richiamo per alcune ore con gli esempi è 0, il che potrebbe indicare un problema

È anche possibile impostare una soglia per filtrare le sezioni con un numero inferiore di esempi o "pesi". Puoi digitare un numero minimo di esempi o utilizzare il dispositivo di scorrimento.

Istogramma delle metriche

Questa visualizzazione supporta anche un istogramma delle metriche come visualizzazione alternativa, che è anche la visualizzazione predefinita quando il numero di sezioni è elevato. I risultati verranno suddivisi in bucket e sarà possibile visualizzare il numero di fette / pesi totali / entrambi. Le colonne possono essere ordinate facendo clic sull'intestazione della colonna. Le fette con pesi piccoli possono essere filtrate impostando la soglia. È possibile applicare ulteriori filtri trascinando la banda grigia. Per ripristinare l'intervallo, fare doppio clic sulla banda. Il filtro può essere utilizzato anche per rimuovere i valori anomali nella visualizzazione e nelle tabelle delle metriche. Fare clic sull'icona a forma di ingranaggio per passare a una scala logaritmica anziché a una scala lineare.

  • Prova a selezionare "Istogramma metriche" nel menu Visualizzazione

Più fette

Il nostro tfma.EvalConfig iniziale tfma.EvalConfig creato un intero elenco di slicing_specs , che possiamo visualizzare aggiornando le informazioni sulle tfma.view.render_slicing_metrics passate a tfma.view.render_slicing_metrics . Qui selezioneremo la fetta trip_start_day (giorni della settimana). Prova a modificare trip_start_day in trip_start_month e trip_start_month nuovamente il rendering per esaminare sezioni diverse.

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

TFMA supporta anche la creazione di incroci di funzioni per analizzare combinazioni di funzioni. Le nostre impostazioni originali hanno creato un trip_start_hour e trip_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…

Incrociare le due colonne crea molte combinazioni! Restringiamo la nostra croce per guardare solo ai viaggi che iniziano a mezzogiorno . Quindi selezioniamo binary_accuracy dalla visualizzazione:

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…

Rendering grafici

Eventuali trame che sono stati aggiunti al tfma.EvalConfig come formazione post metric_specs possono essere visualizzate utilizzando tfma.view.render_plot .

Come per le metriche, i grafici possono essere visualizzati per sezione. A differenza delle metriche, è possibile visualizzare solo i grafici per un particolare valore di sezione, quindi è necessario utilizzare tfma.SlicingSpec e specificare sia il nome che il valore di una funzionalità di sezione. Se non viene fornita alcuna sezione, vengono utilizzati i grafici per la sezione Overall .

Nell'esempio seguente vengono visualizzati i grafici CalibrationPlot e ConfusionMatrixPlot calcolati per la trip_start_hour:1 .

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…

Monitoraggio delle prestazioni del modello nel tempo

Il set di dati di addestramento verrà utilizzato per l'addestramento del modello e, si spera, sarà rappresentativo del set di dati di test e dei dati che verranno inviati al modello in produzione. Tuttavia, sebbene i dati nelle richieste di inferenza possano rimanere gli stessi dei dati di addestramento, in molti casi inizieranno a cambiare abbastanza da modificare le prestazioni del modello.

Ciò significa che è necessario monitorare e misurare costantemente le prestazioni del modello, in modo da essere consapevoli e reagire ai cambiamenti. Diamo un'occhiata a come TFMA può aiutare.

Carichiamo 3 diverse esecuzioni del modello e usiamo TFMA per vedere come si confrontano usando 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

Innanzitutto, immaginiamo di aver addestrato e distribuito il nostro modello ieri, e ora vogliamo vedere come va sui nuovi dati in arrivo oggi. La visualizzazione inizierà visualizzando AUC. Dall'interfaccia utente è possibile:

  • Aggiungi altre metriche utilizzando il menu "Aggiungi serie di metriche".
  • Chiudi i grafici indesiderati facendo clic su x
  • Passa il mouse sui punti dati (le estremità dei segmenti di linea nel grafico) per ottenere maggiori dettagli
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…

Ora immaginiamo che sia passato un altro giorno e vogliamo vedere come va sui nuovi dati in arrivo oggi, rispetto ai due giorni precedenti:

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…

Convalida del modello

TFMA può essere configurato per valutare più modelli contemporaneamente. In genere questo viene fatto per confrontare un nuovo modello con una linea di base (come il modello attualmente in uso) per determinare quali sono le differenze di prestazioni nelle metriche (ad es. AUC, ecc.) Quando le soglie sono configurate, TFMA produrrà un record tfma.ValidationResult indica se le prestazioni corrispondono alle aspettative.

Riconfiguriamo la nostra valutazione Keras per confrontare due modelli: un candidato e una linea di base. Convalideremo anche le prestazioni del candidato rispetto alla linea di base impostando una tmfa.MetricThreshold sulla metrica AUC.

# 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

Quando si eseguono valutazioni con uno o più modelli rispetto a una linea di base, TFMA aggiunge automaticamente metriche diff per tutte le metriche calcolate durante la valutazione. Queste metriche prendono il nome dalla metrica corrispondente ma con _diff aggiunto al nome della metrica.

Diamo un'occhiata alle metriche prodotte dalla nostra corsa:

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

Ora diamo un'occhiata all'output dei nostri controlli di convalida. Per visualizzare i risultati della convalida utilizziamotfma.load_validator_result . Per il nostro esempio, la convalida non riesce perché l'AUC è al di sotto della soglia.

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