ML Meta Verileri ile Daha İyi ML Mühendisliği

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

Penguenleri sınıflandırmak için bir üretim ML işlem hattı kurduğunuz bir senaryo varsayalım. İşlem hattı, eğitim verilerinizi alır, bir modeli eğitir ve değerlendirir ve onu üretime iter.

Ancak daha sonra bu modeli farklı penguen türlerini içeren daha büyük bir veri kümesiyle kullanmayı denediğinizde, modelinizin beklendiği gibi davranmadığını ve türleri yanlış sınıflandırmaya başladığını gözlemlersiniz.

Bu noktada, bilmekle ilgileniyorsunuz:

  • Mevcut tek yapı üretimdeki model olduğunda, modelde hata ayıklamanın en etkili yolu nedir?
  • Modeli eğitmek için hangi eğitim veri seti kullanıldı?
  • Hangi eğitim çalışması bu hatalı modele yol açtı?
  • Model değerlendirme sonuçları nerede?
  • Hata ayıklamaya nereden başlamalı?

ML Meta veri (MLMD) siz ve daha bu sorulara cevap yardımcı olmak için ML modelleri ile ilişkili meta verileri güçlendirir kütüphanesidir. Yararlı bir benzetme, bu meta verileri yazılım geliştirmede oturum açmaya eşdeğer olarak düşünmektir. MLMD, ML işlem hattınızın çeşitli bileşenleriyle ilişkili yapıtları ve kökeni güvenilir bir şekilde izlemenize olanak tanır.

Bu öğreticide, penguenleri vücut kütlesine, külmenlerinin uzunluğuna ve derinliğine ve paletlerinin uzunluğuna göre üç türe ayıran bir model oluşturmak için bir TFX Boru Hattı kurarsınız. Ardından, işlem hattı bileşenlerinin kökenini izlemek için MLMD'yi kullanırsınız.

Colab'da TFX Boru Hatları

Colab, üretim ortamından önemli ölçüde farklı olan hafif bir geliştirme ortamıdır. Üretimde, birden çok dağıtılmış sistemde veri alımı, dönüştürme, model eğitimi, çalıştırma geçmişleri vb. gibi çeşitli işlem hattı bileşenlerine sahip olabilirsiniz. Bu öğretici için, Düzenleme ve Meta Veri depolamada önemli farklılıkların bulunduğunun farkında olmalısınız - bunların tümü Colab içinde yerel olarak işlenir. CoLab içinde Tfx hakkında daha fazla bilgi burada .

Kurmak

Öncelikle gerekli paketleri kurup import ediyoruz, yolları ayarlıyoruz ve verileri indiriyoruz.

Pip'i Yükselt

Yerel olarak çalışırken bir sistemde Pip'i yükseltmekten kaçınmak için Colab'da çalıştığımızdan emin olun. Yerel sistemler elbette ayrı ayrı yükseltilebilir.

try:
  import colab
  !pip install --upgrade pip
except:
  pass

TFX'i yükleyin ve içe aktarın

pip install -q -U tfx

Paketleri içe aktar

Çalışma zamanını yeniden başlattınız mı?

Google Colab kullanıyorsanız, yukarıdaki hücreyi ilk kez çalıştırdığınızda, yukarıdaki "ÇALIŞTIRMA ZAMINI YENİDEN BAŞLAT" düğmesini tıklayarak veya "Çalışma Zamanı > Çalışma zamanını yeniden başlat ..." menüsünü kullanarak çalışma zamanını yeniden başlatmanız gerekir. Bunun nedeni Colab'ın paketleri yükleme şeklidir.

import os
import tempfile
import urllib
import pandas as pd

import tensorflow_model_analysis as tfma
from tfx.orchestration.experimental.interactive.interactive_context import InteractiveContext

TFX ve MLMD sürümlerini kontrol edin.

from tfx import v1 as tfx
print('TFX version: {}'.format(tfx.__version__))
import ml_metadata as mlmd
print('MLMD version: {}'.format(mlmd.__version__))
TFX version: 1.4.0
MLMD version: 1.4.0

Veri kümesini indirin

Bu CoLab olarak, kullandığımız Palmer Penguenler veri kümesi bulunabilir Github . Biz herhangi bir eksik kayıtları bırakarak veri kümesi işlenir ve damla island ve sex sütunlar ve etiketlerin dönüştürülen int32 . Veri seti, vücut kütlesine ve penguenlerin külmenlerinin uzunluğu ve derinliğine ve paletlerinin uzunluğuna ilişkin 334 kayıt içerir. Bu verileri penguenleri üç türden birine sınıflandırmak için kullanırsınız.

DATA_PATH = 'https://raw.githubusercontent.com/tensorflow/tfx/master/tfx/examples/penguin/data/labelled/penguins_processed.csv'
_data_root = tempfile.mkdtemp(prefix='tfx-data')
_data_filepath = os.path.join(_data_root, "penguins_processed.csv")
urllib.request.urlretrieve(DATA_PATH, _data_filepath)
('/tmp/tfx-datal9104odr/penguins_processed.csv',
 <http.client.HTTPMessage at 0x7f9c6d8d2290>)

InteractiveContext oluşturun

Bu defterde etkileşimli TFX bileşenlerini çalıştırmak için, bir oluşturmak InteractiveContext . InteractiveContext geçici bir MLMD veritabanı örneği ile geçici dizini kullanır. Not için çağrılar olduğunu InteractiveContext CoLab ortamının dışında hiç op vardır.

Genel olarak, bir altında grup benzer boru hattı pistlerine iyi bir uygulamadır Context .

interactive_context = InteractiveContext()
WARNING:absl:InteractiveContext pipeline_root argument not provided: using temporary directory /tmp/tfx-interactive-2021-12-05T11_15_56.285625-5hcexlo8 as root for pipeline outputs.
WARNING:absl:InteractiveContext metadata_connection_config not provided: using SQLite ML Metadata database at /tmp/tfx-interactive-2021-12-05T11_15_56.285625-5hcexlo8/metadata.sqlite.

TFX Boru Hattını Oluşturun

Bir TFX işlem hattı, makine öğrenimi iş akışının farklı yönlerini gerçekleştiren birkaç bileşenden oluşur. Bu defterin, oluşturmak ve çalıştırmak ExampleGen , StatisticsGen , SchemaGen ve Trainer bileşenleri ve kullanmak Evaluator ve Pusher değerlendirmek ve eğitimli modeli itmek için bileşeni.

Bakın bileşenleri öğretici TFX boru hattı bileşenlerine ilişkin daha fazla bilgi için.

ExampleGen Bileşenini örnekleyin ve çalıştırın

example_gen = tfx.components.CsvExampleGen(input_base=_data_root)
interactive_context.run(example_gen)
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.

İstatistikGen Bileşenini örnekleyin ve çalıştırın

statistics_gen = tfx.components.StatisticsGen(
    examples=example_gen.outputs['examples'])
interactive_context.run(statistics_gen)
WARNING:root:Make sure that locally built Python SDK docker image has Python 3.7 interpreter.

SchemaGen Bileşenini örnekleyin ve çalıştırın

infer_schema = tfx.components.SchemaGen(
    statistics=statistics_gen.outputs['statistics'], infer_feature_shape=True)
interactive_context.run(infer_schema)
WARNING: Logging before InitGoogleLogging() is written to STDERR
I1205 11:16:00.941947  6108 rdbms_metadata_access_object.cc:686] No property is defined for the Type

Eğitmen Bileşenini örnekleyin ve çalıştırın

# Define the module file for the Trainer component
trainer_module_file = 'penguin_trainer.py'
%%writefile {trainer_module_file}

# Define the training algorithm for the Trainer module file
import os
from typing import List, Text

import tensorflow as tf
from tensorflow import keras

from tfx import v1 as tfx
from tfx_bsl.public import tfxio

from tensorflow_metadata.proto.v0 import schema_pb2

# Features used for classification - culmen length and depth, flipper length,
# body mass, and species.

_LABEL_KEY = 'species'

_FEATURE_KEYS = [
    'culmen_length_mm', 'culmen_depth_mm', 'flipper_length_mm', 'body_mass_g'
]


def _input_fn(file_pattern: List[Text],
              data_accessor: tfx.components.DataAccessor,
              schema: schema_pb2.Schema, batch_size: int) -> tf.data.Dataset:
  return data_accessor.tf_dataset_factory(
      file_pattern,
      tfxio.TensorFlowDatasetOptions(
          batch_size=batch_size, label_key=_LABEL_KEY), schema).repeat()


def _build_keras_model():
  inputs = [keras.layers.Input(shape=(1,), name=f) for f in _FEATURE_KEYS]
  d = keras.layers.concatenate(inputs)
  d = keras.layers.Dense(8, activation='relu')(d)
  d = keras.layers.Dense(8, activation='relu')(d)
  outputs = keras.layers.Dense(3)(d)
  model = keras.Model(inputs=inputs, outputs=outputs)
  model.compile(
      optimizer=keras.optimizers.Adam(1e-2),
      loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
      metrics=[keras.metrics.SparseCategoricalAccuracy()])
  return model


def run_fn(fn_args: tfx.components.FnArgs):
  schema = schema_pb2.Schema()
  tfx.utils.parse_pbtxt_file(fn_args.schema_path, schema)
  train_dataset = _input_fn(
      fn_args.train_files, fn_args.data_accessor, schema, batch_size=10)
  eval_dataset = _input_fn(
      fn_args.eval_files, fn_args.data_accessor, schema, batch_size=10)
  model = _build_keras_model()
  model.fit(
      train_dataset,
      epochs=int(fn_args.train_steps / 20),
      steps_per_epoch=20,
      validation_data=eval_dataset,
      validation_steps=fn_args.eval_steps)
  model.save(fn_args.serving_model_dir, save_format='tf')
Writing penguin_trainer.py

Run Trainer bileşeni.

trainer = tfx.components.Trainer(
    module_file=os.path.abspath(trainer_module_file),
    examples=example_gen.outputs['examples'],
    schema=infer_schema.outputs['schema'],
    train_args=tfx.proto.TrainArgs(num_steps=100),
    eval_args=tfx.proto.EvalArgs(num_steps=50))
interactive_context.run(trainer)
running bdist_wheel
running build
running build_py
creating build
creating build/lib
copying penguin_trainer.py -> build/lib
installing to /tmp/tmpum1crtxy
running install
running install_lib
copying build/lib/penguin_trainer.py -> /tmp/tmpum1crtxy
running install_egg_info
running egg_info
creating tfx_user_code_Trainer.egg-info
writing tfx_user_code_Trainer.egg-info/PKG-INFO
writing dependency_links to tfx_user_code_Trainer.egg-info/dependency_links.txt
writing top-level names to tfx_user_code_Trainer.egg-info/top_level.txt
writing manifest file 'tfx_user_code_Trainer.egg-info/SOURCES.txt'
reading manifest file 'tfx_user_code_Trainer.egg-info/SOURCES.txt'
writing manifest file 'tfx_user_code_Trainer.egg-info/SOURCES.txt'
Copying tfx_user_code_Trainer.egg-info to /tmp/tmpum1crtxy/tfx_user_code_Trainer-0.0+fef7c4ed90dc336ca26daee59d65660cf8da5fa988b2ca0c89df2f558fda10f4-py3.7.egg-info
running install_scripts
creating /tmp/tmpum1crtxy/tfx_user_code_Trainer-0.0+fef7c4ed90dc336ca26daee59d65660cf8da5fa988b2ca0c89df2f558fda10f4.dist-info/WHEEL
creating '/tmp/tmpo87nn6ey/tfx_user_code_Trainer-0.0+fef7c4ed90dc336ca26daee59d65660cf8da5fa988b2ca0c89df2f558fda10f4-py3-none-any.whl' and adding '/tmp/tmpum1crtxy' to it
adding 'penguin_trainer.py'
adding 'tfx_user_code_Trainer-0.0+fef7c4ed90dc336ca26daee59d65660cf8da5fa988b2ca0c89df2f558fda10f4.dist-info/METADATA'
adding 'tfx_user_code_Trainer-0.0+fef7c4ed90dc336ca26daee59d65660cf8da5fa988b2ca0c89df2f558fda10f4.dist-info/WHEEL'
adding 'tfx_user_code_Trainer-0.0+fef7c4ed90dc336ca26daee59d65660cf8da5fa988b2ca0c89df2f558fda10f4.dist-info/top_level.txt'
adding 'tfx_user_code_Trainer-0.0+fef7c4ed90dc336ca26daee59d65660cf8da5fa988b2ca0c89df2f558fda10f4.dist-info/RECORD'
removing /tmp/tmpum1crtxy
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/setuptools/command/install.py:37: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
  setuptools.SetuptoolsDeprecationWarning,
listing git files failed - pretending there aren't any
I1205 11:16:01.389324  6108 rdbms_metadata_access_object.cc:686] No property is defined for the Type
I1205 11:16:01.392832  6108 rdbms_metadata_access_object.cc:686] No property is defined for the Type
Processing /tmp/tfx-interactive-2021-12-05T11_15_56.285625-5hcexlo8/_wheels/tfx_user_code_Trainer-0.0+fef7c4ed90dc336ca26daee59d65660cf8da5fa988b2ca0c89df2f558fda10f4-py3-none-any.whl
Installing collected packages: tfx-user-code-Trainer
Successfully installed tfx-user-code-Trainer-0.0+fef7c4ed90dc336ca26daee59d65660cf8da5fa988b2ca0c89df2f558fda10f4
Epoch 1/5
20/20 [==============================] - 1s 11ms/step - loss: 0.9891 - sparse_categorical_accuracy: 0.4300 - val_loss: 0.9594 - val_sparse_categorical_accuracy: 0.4800
Epoch 2/5
20/20 [==============================] - 0s 6ms/step - loss: 0.8369 - sparse_categorical_accuracy: 0.6350 - val_loss: 0.7484 - val_sparse_categorical_accuracy: 0.8200
Epoch 3/5
20/20 [==============================] - 0s 6ms/step - loss: 0.5289 - sparse_categorical_accuracy: 0.8350 - val_loss: 0.5068 - val_sparse_categorical_accuracy: 0.7800
Epoch 4/5
20/20 [==============================] - 0s 6ms/step - loss: 0.4481 - sparse_categorical_accuracy: 0.7800 - val_loss: 0.4125 - val_sparse_categorical_accuracy: 0.8600
Epoch 5/5
20/20 [==============================] - 0s 6ms/step - loss: 0.3068 - sparse_categorical_accuracy: 0.8650 - val_loss: 0.3279 - val_sparse_categorical_accuracy: 0.8300
2021-12-05 11:16:06.493168: W tensorflow/python/util/util.cc:348] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
INFO:tensorflow:Assets written to: /tmp/tfx-interactive-2021-12-05T11_15_56.285625-5hcexlo8/Trainer/model/4/Format-Serving/assets
INFO:tensorflow:Assets written to: /tmp/tfx-interactive-2021-12-05T11_15_56.285625-5hcexlo8/Trainer/model/4/Format-Serving/assets

Modeli değerlendirin ve itin

Kullanım Evaluator değerlendirmek ve kullanmadan önce modeli 'korusun' bileşeni Pusher bir hizmet dizine modeli itmek için bileşeni.

_serving_model_dir = os.path.join(tempfile.mkdtemp(),
                                  'serving_model/penguins_classification')
eval_config = tfma.EvalConfig(
    model_specs=[
        tfma.ModelSpec(label_key='species', signature_name='serving_default')
    ],
    metrics_specs=[
        tfma.MetricsSpec(metrics=[
            tfma.MetricConfig(
                class_name='SparseCategoricalAccuracy',
                threshold=tfma.MetricThreshold(
                    value_threshold=tfma.GenericValueThreshold(
                        lower_bound={'value': 0.6})))
        ])
    ],
    slicing_specs=[tfma.SlicingSpec()])
evaluator = tfx.components.Evaluator(
    examples=example_gen.outputs['examples'],
    model=trainer.outputs['model'],
    schema=infer_schema.outputs['schema'],
    eval_config=eval_config)
interactive_context.run(evaluator)
I1205 11:16:07.075275  6108 rdbms_metadata_access_object.cc:686] No property is defined for the Type
I1205 11:16:07.078761  6108 rdbms_metadata_access_object.cc:686] No property is defined for the Type
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/writers/metrics_plots_and_validations_writer.py:114: 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:114: 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)`
pusher = tfx.components.Pusher(
    model=trainer.outputs['model'],
    model_blessing=evaluator.outputs['blessing'],
    push_destination=tfx.proto.PushDestination(
        filesystem=tfx.proto.PushDestination.Filesystem(
            base_directory=_serving_model_dir)))
interactive_context.run(pusher)
I1205 11:16:11.935312  6108 rdbms_metadata_access_object.cc:686] No property is defined for the Type

TFX işlem hattını çalıştırmak, MLMD Veritabanını doldurur. Sonraki bölümde, bu veritabanını meta veri bilgileri için sorgulamak için MLMD API'sini kullanırsınız.

MLMD Veritabanını Sorgulayın

MLMD veritabanı üç tür meta veri depolar:

  • İşlem hattı bileşenleriyle ilişkili işlem hattı ve köken bilgileri hakkında meta veriler
  • İşlem hattı çalıştırması sırasında oluşturulan yapılar hakkında meta veriler
  • İşlem hattının yürütmeleriyle ilgili meta veriler

Tipik bir üretim ortamı işlem hattı, yeni veriler geldikçe birden çok modele hizmet eder. Sunulan modellerde hatalı sonuçlarla karşılaştığınızda, hatalı modelleri izole etmek için MLMD veritabanını sorgulayabilirsiniz. Ardından, modellerinizde hata ayıklamak için bu modellere karşılık gelen işlem hattı bileşenlerinin kökenini izleyebilirsiniz.

İle meta (MD) mağaza kurma InteractiveContext MLMD veritabanını sorgulamak için önceden tanımlanmış.

connection_config = interactive_context.metadata_connection_config
store = mlmd.MetadataStore(connection_config)

# All TFX artifacts are stored in the base directory
base_dir = connection_config.sqlite.filename_uri.split('metadata.sqlite')[0]

MD deposundaki verileri görüntülemek için bazı yardımcı işlevler oluşturun.

def display_types(types):
  # Helper function to render dataframes for the artifact and execution types
  table = {'id': [], 'name': []}
  for a_type in types:
    table['id'].append(a_type.id)
    table['name'].append(a_type.name)
  return pd.DataFrame(data=table)
def display_artifacts(store, artifacts):
  # Helper function to render dataframes for the input artifacts
  table = {'artifact id': [], 'type': [], 'uri': []}
  for a in artifacts:
    table['artifact id'].append(a.id)
    artifact_type = store.get_artifact_types_by_id([a.type_id])[0]
    table['type'].append(artifact_type.name)
    table['uri'].append(a.uri.replace(base_dir, './'))
  return pd.DataFrame(data=table)
def display_properties(store, node):
  # Helper function to render dataframes for artifact and execution properties
  table = {'property': [], 'value': []}
  for k, v in node.properties.items():
    table['property'].append(k)
    table['value'].append(
        v.string_value if v.HasField('string_value') else v.int_value)
  for k, v in node.custom_properties.items():
    table['property'].append(k)
    table['value'].append(
        v.string_value if v.HasField('string_value') else v.int_value)
  return pd.DataFrame(data=table)

İlk olarak, tüm saklanan bir listesi için sorgu MD mağaza ArtifactTypes .

display_types(store.get_artifact_types())

Sonra, sorgu tüm PushedModel eserler.

pushed_models = store.get_artifacts_by_type("PushedModel")
display_artifacts(store, pushed_models)

En son aktarılan model için MD deposunu sorgulayın. Bu öğreticide yalnızca bir itilmiş model vardır.

pushed_model = pushed_models[-1]
display_properties(store, pushed_model)

Aktarılan bir modelde hata ayıklamanın ilk adımlarından biri, hangi eğitilmiş modelin aktarıldığına bakmak ve bu modeli eğitmek için hangi eğitim verilerinin kullanıldığını görmektir.

MLMD, model kaynağını analiz etmek için kullanabileceğiniz kaynak grafiğinde gezinmek için geçiş API'leri sağlar.

def get_one_hop_parent_artifacts(store, artifacts):
  # Get a list of artifacts within a 1-hop of the artifacts of interest
  artifact_ids = [artifact.id for artifact in artifacts]
  executions_ids = set(
      event.execution_id
      for event in store.get_events_by_artifact_ids(artifact_ids)
      if event.type == mlmd.proto.Event.OUTPUT)
  artifacts_ids = set(
      event.artifact_id
      for event in store.get_events_by_execution_ids(executions_ids)
      if event.type == mlmd.proto.Event.INPUT)
  return [artifact for artifact in store.get_artifacts_by_id(artifacts_ids)]

İtilen model için üst yapıtları sorgulayın.

parent_artifacts = get_one_hop_parent_artifacts(store, [pushed_model])
display_artifacts(store, parent_artifacts)

Modelin özelliklerini sorgulayın.

exported_model = parent_artifacts[0]
display_properties(store, exported_model)

Model için yukarı akış yapılarını sorgulayın.

model_parents = get_one_hop_parent_artifacts(store, [exported_model])
display_artifacts(store, model_parents)

Modelin eğittiği eğitim verilerini alın.

used_data = model_parents[0]
display_properties(store, used_data)

Artık modelin eğittiği eğitim verilerine sahip olduğunuza göre, eğitim adımını (yürütme) bulmak için veritabanını yeniden sorgulayın. Kayıtlı yürütme türlerinin bir listesi için MD deposunu sorgulayın.

display_types(store.get_execution_types())

Eğitim adımdır ExecutionType adında tfx.components.trainer.component.Trainer . İtilen modele karşılık gelen eğiticiyi çalıştırmak için MD deposunda gezinin.

def find_producer_execution(store, artifact):
  executions_ids = set(
      event.execution_id
      for event in store.get_events_by_artifact_ids([artifact.id])
      if event.type == mlmd.proto.Event.OUTPUT)
  return store.get_executions_by_id(executions_ids)[0]

trainer = find_producer_execution(store, exported_model)
display_properties(store, trainer)

Özet

Bu öğreticide, TFX işlem hattı bileşenlerinizin kökenini izlemek ve sorunları çözmek için MLMD'den nasıl yararlanabileceğinizi öğrendiniz.

MLMD'nin nasıl kullanılacağı hakkında daha fazla bilgi edinmek için şu ek kaynaklara göz atın: