Przykład kluczowego komponentu TensorFlow Extended (TFX)
TensorFlow Analiza modelu (TFMA) jest biblioteką do przeprowadzania oceny modelu w różnych plasterków danych. TFMA wykonuje swoje obliczenia w równomierny sposób na duże ilości danych, z wykorzystaniem Apache belkę .
Ten przykładowy notatnik colab ilustruje, w jaki sposób TFMA może być używany do badania i wizualizacji wydajności modelu w odniesieniu do cech zestawu danych. Użyjemy modelu, który trenowaliśmy wcześniej, a teraz możesz pobawić się wynikami! Model trenowaliśmy było dla Chicago Taxi przykładu , który używa Taxi Trips zbiór danych wydany przez miasto Chicago. Poznaj pełny zestaw danych w BigQuery UI .
Jako projektant i programista zastanów się, w jaki sposób te dane są wykorzystywane i jakie potencjalne korzyści i szkody mogą spowodować prognozy modelu. Taki model mógłby wzmocnić uprzedzenia społeczne i dysproporcje. Czy funkcja jest istotna dla problemu, który chcesz rozwiązać, czy wprowadzi stronniczość? Aby uzyskać więcej informacji, przeczytaj o ML sprawiedliwości .
Kolumny w zbiorze danych to:
pickup_community_area | opłata | trip_start_month |
trip_start_hour | trip_start_day | trip_start_timestamp |
szerokość_odbioru | długość_odbioru | dropoff_latitude |
dropoff_longitude | podróż_mile | pickup_census_tract |
dropoff_census_tract | typ płatności | Spółka |
trip_seconds | dropoff_community_area | porady |
Zainstaluj rozszerzenia 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
Zainstaluj analizę modelu TensorFlow (TFMA)
To pobierze wszystkie zależności i zajmie minutę.
# Upgrade pip to the latest, and install TFMA.
pip install -U pip
pip install tensorflow-model-analysis
Teraz musisz ponownie uruchomić środowisko wykonawcze przed uruchomieniem poniższych komórek.
# 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.4.4 Beam version: 2.34.0 TFMA version: 0.29.0
Załaduj pliki
Pobierzemy plik tar, który zawiera wszystko, czego potrzebujemy. To obejmuje:
- Zbiory danych szkoleniowych i ewaluacyjnych
- Schemat danych
- Uczenie i serwowanie zapisanych modeli (keras i estymator) oraz ewaluacja zapisanych modeli (estymator).
# 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 28.2M 0 --:--:-- --:--:-- --:--:-- 28.2M Here's what we downloaded: /tmp/tmp_at9q62d: saved_models-2.2 /tmp/tmp_at9q62d/saved_models-2.2: data models schema.pbtxt /tmp/tmp_at9q62d/saved_models-2.2/data: eval train /tmp/tmp_at9q62d/saved_models-2.2/data/eval: data.csv /tmp/tmp_at9q62d/saved_models-2.2/data/train: data.csv /tmp/tmp_at9q62d/saved_models-2.2/models: estimator keras /tmp/tmp_at9q62d/saved_models-2.2/models/estimator: eval_model_dir serving_model_dir /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/eval_model_dir: 1591221811 /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/eval_model_dir/1591221811: saved_model.pb tmp.pbtxt variables /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables: variables.data-00000-of-00001 variables.index /tmp/tmp_at9q62d/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/tmp_at9q62d/saved_models-2.2/models/estimator/serving_model_dir/eval_chicago-taxi-eval: events.out.tfevents.1591221799.my-pipeline-b57vp-237544850 /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/serving_model_dir/export: chicago-taxi /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi: 1591221801 /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi/1591221801: saved_model.pb variables /tmp/tmp_at9q62d/saved_models-2.2/models/estimator/serving_model_dir/export/chicago-taxi/1591221801/variables: variables.data-00000-of-00001 variables.index /tmp/tmp_at9q62d/saved_models-2.2/models/keras: 0 1 2 /tmp/tmp_at9q62d/saved_models-2.2/models/keras/0: saved_model.pb variables /tmp/tmp_at9q62d/saved_models-2.2/models/keras/0/variables: variables.data-00000-of-00001 variables.index /tmp/tmp_at9q62d/saved_models-2.2/models/keras/1: saved_model.pb variables /tmp/tmp_at9q62d/saved_models-2.2/models/keras/1/variables: variables.data-00000-of-00001 variables.index /tmp/tmp_at9q62d/saved_models-2.2/models/keras/2: saved_model.pb variables /tmp/tmp_at9q62d/saved_models-2.2/models/keras/2/variables: variables.data-00000-of-00001 variables.index
Przeanalizuj schemat
Wśród rzeczy, które ściągnąłem było schematu dla naszych danych, które zostały utworzone przez TensorFlow sprawdzania poprawności danych . Przeanalizujmy to teraz, abyśmy mogli używać go z 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)
Użyj schematu do tworzenia TFRecords
Musimy dać TFMA dostęp do naszego zbioru danych, więc stwórzmy plik TFRecords. Możemy użyć naszego schematu, aby go utworzyć, ponieważ daje nam właściwy typ dla każdej funkcji.
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/tmp_at9q62d/train_data.rio
Skonfiguruj i uruchom TFMA
TFMA obsługuje wiele różnych typów modeli, w tym modele TF Keras, modele oparte na ogólnych API sygnatur TF2, a także modele oparte na estymatorach TF. Get_started Podręcznik zawiera pełną listę obsługiwanych typów modeli i wszelkich ograniczeń. W tym przykładzie mamy zamiar pokazać, jak skonfigurować Keras modelu opartego jak również modelu opartego estymatora, który został zapisany jako EvalSavedModel
. Zobacz nas na przykłady innych konfiguracjach.
TFMA zapewnia obsługę obliczania metryk, które były używane w czasie uczenia (tj. metryk wbudowanych), a także metryk zdefiniowanych po zapisaniu modelu w ramach ustawień konfiguracyjnych TFMA. Dla naszych Keras konfiguracji pokażemy dodając nasze metryki i działek ręcznie jako część naszej konfiguracji (patrz metryki przewodnik dla informacji o metryki i działek, które są obsługiwane). Do konfiguracji estymatora użyjemy wbudowanych metryk, które zostały zapisane z modelem. Nasze konfiguracje zawierają również szereg specyfikacji krojenia, które są omówione bardziej szczegółowo w kolejnych sekcjach.
Po utworzeniu tfma.EvalConfig
i tfma.EvalSharedModel
możemy następnie uruchomić TFMA użyciu tfma.run_model_analysis
. Spowoduje to utworzenie tfma.EvalResult
które możemy później użyć do renderowania nasze metryki i działek.
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)
2021-12-04 10:18:15.463173: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcusolver.so.10'; dlerror: libcusolver.so.10: cannot open shared object file: No such file or directory 2021-12-04 10:18:15.464249: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1757] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform. Skipping registering GPU devices... WARNING:absl:Tensorflow version (2.4.4) 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:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter. 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)`
Taksator
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:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter. 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/tmp_at9q62d/saved_models-2.2/models/estimator/eval_model_dir/1591221811/variables/variables INFO:tensorflow:Restoring parameters from /tmp/tmp_at9q62d/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.
Wizualizacja metryk i wykresów
Teraz, gdy już uruchomiliśmy ocenę, przyjrzyjmy się naszym wizualizacjom przy użyciu TFMA. W poniższych przykładach zwizualizujemy wyniki z uruchomienia oceny na modelu Keras. Aby zobaczyć aktualizację modelu Estymator oparty na eval_result
do punktu, w naszej estimator_eval_result
zmiennej.
eval_result = keras_eval_result
# eval_result = estimator_eval_result
Wskaźniki renderowania
Aby zobaczyć metryk użyć tfma.view.render_slicing_metrics
Domyślnie widoki wyświetli Overall
kawałek. Aby wyświetlić konkretny kawałek można użyć nazwy kolumny (przez ustawienie slicing_column
) lub dostarczyć tfma.SlicingSpec
.
Wizualizacja metryk obsługuje następujące interakcje:
- Kliknij i przeciągnij, aby przesunąć
- Przewiń, aby powiększyć
- Kliknij prawym przyciskiem myszy, aby zresetować widok
- Najedź na żądany punkt danych, aby zobaczyć więcej szczegółów.
- Wybierz jeden z czterech różnych typów widoków, korzystając z opcji na dole.
Na przykład, będziemy ustawienie slicing_column
spojrzeć na trip_start_hour
funkcji z naszych poprzednich 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', …
Przegląd plasterków
Domyślną wizualizacja jest Plastry Przegląd gdy liczba plastrów jest niewielka. Pokazuje wartości metryk dla każdego wycinka. Ponieważ wybraliśmy trip_start_hour
powyżej, to pokazuje nam takie dane, jak dokładność i AUC dla każdej godziny, co pozwala nam spojrzeć na problemy, które są specyficzne dla pewnych godzinach, a nie inne.
Na powyższej wizualizacji:
- Spróbuj sortowania kolumny funkcji, która jest naszym
trip_start_hours
wyposażone, klikając nagłówek kolumny - Spróbuj sortując precyzją, i zauważ, że precyzja dla niektórych godzin z przykładów jest 0, co może wskazywać na problem
Wykres pozwala nam również wybierać i wyświetlać różne metryki w naszych wycinkach.
- Spróbuj wybrać inne dane z menu „Pokaż”
- Spróbuj wybrać przywołanie w menu „Pokaż”, i zauważ, że przywołanie dla niektórych godzin z przykładów jest 0, co może wskazywać na problem
Możliwe jest również ustawienie progu, aby odfiltrować wycinki z mniejszą liczbą przykładów lub „wagą”. Możesz wpisać minimalną liczbę przykładów lub użyć suwaka.
Histogram danych
Pogląd ten obsługuje również Metrics Histogram jako alternatywny wizualizacji, która jest również domyślny widok gdy liczba plastrów jest duża. Wyniki zostaną podzielone na wiaderka i można zwizualizować liczbę kromek / wagę całkowitą / obie. Kolumny można sortować, klikając nagłówek kolumny. Plastry o małej wadze można odfiltrować, ustawiając próg. Dalsze filtrowanie można zastosować, przeciągając szary pasek. Aby zresetować zakres, kliknij dwukrotnie zespół. Filtrowania można również użyć do usunięcia wartości odstających z wizualizacji i tabel metryk. Kliknij ikonę koła zębatego, aby przełączyć się na skalę logarytmiczną zamiast na skalę liniową.
- Spróbuj wybrać „Histogram metryk” w menu Wizualizacja
Więcej plasterków
Nasz początkowy tfma.EvalConfig
stworzył całą listę slicing_specs
, które możemy wizualizować za aktualizowanie informacji slice przekazany do tfma.view.render_slicing_metrics
. Tutaj będziemy wybierać trip_start_day
slice (dni tygodnia). Spróbuj zmienić trip_start_day
do trip_start_month
i renderowania ponownie zbadać różne plastry.
tfma.view.render_slicing_metrics(eval_result, slicing_column='trip_start_day')
SlicingMetricsViewer(config={'weightedExamplesColumn': 'example_count'}, data=[{'slice': 'trip_start_day:3', '…
TFMA obsługuje również tworzenie krzyżyków cech w celu analizy kombinacji cech. Nasze oryginalne ustawienia stworzony przekrój trip_start_hour
i 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…
Skrzyżowanie dwóch kolumn tworzy mnóstwo kombinacji! Załóżmy zawężenia nasz krzyż bierze pod uwagę jedynie wycieczki, które zaczynają się w południe. W takim razie wybierz binary_accuracy
z wizualizacją:
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…
Renderowanie działek
Wszelkie działek, które zostały dodane do tfma.EvalConfig
jak pocztowych szkoleniowych metric_specs
mogą być wyświetlane przy użyciu tfma.view.render_plot
.
Podobnie jak w przypadku metryk, wykresy można przeglądać według plasterka. W przeciwieństwie do metryki, tylko działki do określonego wycinka wartości mogą być wyświetlane tak tfma.SlicingSpec
musi być używany i musi określić zarówno nazwę obiektu plasterek i wartość. Jeśli nie plaster jest następnie działki o Overall
wycinka służy.
W poniższym przykładzie mamy do wyświetlania CalibrationPlot
i ConfusionMatrixPlot
działek, które zostały obliczone dla trip_start_hour:1
plaster.
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…
Śledzenie wydajności modelu w czasie
Twój zestaw danych uczących będzie używany do uczenia modelu i, miejmy nadzieję, będzie reprezentatywny dla zestawu danych testowych oraz danych, które zostaną wysłane do modelu w środowisku produkcyjnym. Jednak chociaż dane w żądaniach wnioskowania mogą pozostać takie same jak dane treningowe, w wielu przypadkach zaczną się one zmieniać na tyle, że zmieni się wydajność modelu.
Oznacza to, że musisz na bieżąco monitorować i mierzyć wydajność swojego modelu, aby być świadomym zmian i na nie reagować. Przyjrzyjmy się, jak TFMA może pomóc.
Obciążenie 3 różne modele biegnie Chodźmy i stosowanie TFMA aby zobaczyć ich porównanie za pomocą 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:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter. WARNING:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter. WARNING:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
Najpierw wyobrazimy sobie, że wczoraj przeszkoliliśmy i wdrożyliśmy nasz model, a teraz chcemy zobaczyć, jak radzi sobie z nowymi danymi, które pojawią się dzisiaj. Wizualizacja rozpocznie się od wyświetlenia AUC. Z interfejsu użytkownika możesz:
- Dodaj inne dane za pomocą menu „Dodaj serię danych”.
- Zamknij niechciane wykresy, klikając x
- Najedź kursorem na punkty danych (końce segmentów linii na wykresie), aby uzyskać więcej szczegółów
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…
Teraz wyobrazimy sobie, że minął kolejny dzień i chcemy zobaczyć, jak sobie radzi z nowymi danymi napływającymi dzisiaj w porównaniu z poprzednimi dwoma dniami:
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…
Walidacja modelu
TFMA można skonfigurować do jednoczesnej oceny wielu modeli. Zazwyczaj odbywa się to w celu porównania nowego modelu z punktem odniesienia (takim jak obecnie obsługujący model) w celu określenia, jakie są różnice wydajności w metrykach (np. AUC itp.) w stosunku do punktu odniesienia. Kiedy progi są skonfigurowane, TFMA będzie produkować tfma.ValidationResult
zapis wskazujący, czy wydajność pasuje stanie spełnić oczekiwania.
Skonfigurujmy ponownie naszą ocenę Keras, aby porównać dwa modele: kandydat i punkt odniesienia. Będziemy również zweryfikować skuteczność kandydata przeciwko wyjściowej poprzez ustawienie tmfa.MetricThreshold
na metryki 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:absl:Tensorflow version (2.4.4) found. Note that TFMA support for TF 2.0 is currently in beta WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.
Podczas przeprowadzania ocen z jednym lub większą liczbą modeli względem linii bazowej, TFMA automatycznie dodaje metryki diff dla wszystkich metryk obliczonych podczas oceny. Dane te są nazywane po odpowiedniej metryki ale z _diff
dołączonym do nazwy metrycznym.
Przyjrzyjmy się metrykom wygenerowanym przez nasz bieg:
tfma.view.render_time_series(eval_result_with_validation)
TimeSeriesViewer(config={'isModelCentric': True}, data=[{'metrics': {'': {'': {'binary_accuracy': {'doubleValu…
Przyjrzyjmy się teraz wynikom naszych sprawdzeń weryfikacyjnych. Aby wyświetlić wyniki walidacji używamy tfma.load_validator_result
. W naszym przykładzie weryfikacja kończy się niepowodzeniem, ponieważ wartość AUC jest poniżej progu.
validation_result = tfma.load_validation_result(validation_output_path)
print(validation_result.validation_ok)
False