مهندسی ML بهتر با ML Metadata

با مجموعه‌ها، منظم بمانید ذخیره و دسته‌بندی محتوا براساس اولویت‌های شما.

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

سناریویی را فرض کنید که در آن یک خط لوله تولید ML برای طبقه بندی پنگوئن ها راه اندازی می کنید. خط لوله داده های آموزشی شما را جذب می کند، یک مدل را آموزش می دهد و ارزیابی می کند و آن را به سمت تولید سوق می دهد.

با این حال، وقتی بعداً سعی می‌کنید از این مدل با مجموعه داده بزرگ‌تری که شامل انواع مختلف پنگوئن‌ها است استفاده کنید، مشاهده می‌کنید که مدل شما مطابق انتظار رفتار نمی‌کند و شروع به طبقه‌بندی نادرست گونه‌ها می‌کند.

در این مرحله، شما علاقه مندید که بدانید:

  • زمانی که تنها مصنوع موجود مدل در حال تولید است، کارآمدترین راه برای اشکال زدایی مدل چیست؟
  • کدام مجموعه داده آموزشی برای آموزش مدل استفاده شده است؟
  • کدام دوره آموزشی منجر به این مدل اشتباه شده است؟
  • نتایج ارزیابی مدل کجاست؟
  • اشکال زدایی را از کجا شروع کنیم؟

ML متاداده (MLMD) یک کتابخانه است که اهرم فراداده همراه با مدل های ML برای کمک به شما به این پرسشها پاسخ و بیشتر است. یک تشبیه مفید این است که این ابرداده را معادل ورود به سیستم توسعه نرم افزار بدانیم. MLMD شما را قادر می سازد تا به طور قابل اعتماد مصنوعات و دودمان مرتبط با اجزای مختلف خط لوله ML خود را ردیابی کنید.

در این آموزش، شما یک خط لوله TFX راه اندازی کرده اید تا مدلی بسازید که پنگوئن ها را بر اساس توده بدن، طول و عمق کولمن ها و طول باله هایشان به سه گونه طبقه بندی می کند. سپس از MLMD برای ردیابی اصل و نسب اجزای خط لوله استفاده می کنید.

خطوط لوله TFX در Colab

کولب یک محیط توسعه سبک وزن است که تفاوت قابل توجهی با محیط تولید دارد. در تولید، ممکن است اجزای خط لوله مختلفی مانند داده‌ها، تبدیل، آموزش مدل، تاریخچه اجرا و غیره در چندین سیستم توزیع شده داشته باشید. برای این آموزش، باید توجه داشته باشید که تفاوت های قابل توجهی در Orchestration و ذخیره سازی Metadata وجود دارد - همه اینها به صورت محلی در Colab انجام می شود. اطلاعات بیشتر در مورد TFX بدانید در COLAB اینجا .

برپایی

ابتدا بسته های لازم را نصب و وارد می کنیم، مسیرها را تنظیم می کنیم و داده ها را دانلود می کنیم.

پیپ را ارتقا دهید

برای جلوگیری از ارتقاء Pip در سیستم هنگام اجرای محلی، بررسی کنید که در Colab در حال اجرا هستیم. البته سیستم های محلی را می توان به طور جداگانه ارتقا داد.

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

TFX را نصب و وارد کنید

pip install -q -U tfx

بسته های وارداتی

آیا زمان اجرا را مجدداً راه اندازی کردید؟

اگر از Google Colab استفاده می‌کنید، اولین باری که سلول بالا را اجرا می‌کنید، باید با کلیک کردن روی دکمه «راه‌اندازی مجدد زمان اجرا» یا با استفاده از منوی «زمان اجرا > زمان اجرا مجدد ...» زمان اجرا را مجدداً راه‌اندازی کنید. این به دلیل روشی است که Colab بسته ها را بارگذاری می کند.

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 و MLMD را بررسی کنید.

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

مجموعه داده را دانلود کنید

در این COLAB، ما با استفاده از مجموعه داده پالمر پنگوئن که می توان در یافت گیتهاب . ما پردازش مجموعه داده با ترک کردن هر پرونده ناقص، و قطره island و sex ستون ها، و برچسب ها را به تبدیل int32 . مجموعه داده شامل 334 رکورد از توده بدن، طول و عمق کلمن پنگوئن ها و طول باله های آنها است. شما از این داده ها برای طبقه بندی پنگوئن ها به یکی از سه گونه استفاده می کنید.

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 ایجاد کنید

برای اجرای قطعات TFX تعاملی در این نوت بوک، ایجاد یک InteractiveContext . InteractiveContext با استفاده از یک دایرکتوری موقت با MLMD مثال پایگاه داده زودگذر. توجه داشته باشید که تماس به InteractiveContext بدون عملیات خارج از محیط COLAB هستند.

به طور کلی، یک تمرین خوب برای گروه اجرا می شود خط لوله مشابه تحت یک است 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 را بسازید

خط لوله TFX از چندین مؤلفه تشکیل شده است که جنبه های مختلف گردش کار ML را انجام می دهند. در این نوت بوک، شما ایجاد و اجرای ExampleGen ، StatisticsGen ، SchemaGen و Trainer قطعات و استفاده از Evaluator و Pusher جزء به ارزیابی و فشار مدل آموزش داده است.

به مراجعه آموزش اجزای برای اطلاعات بیشتر بر روی اجزای خط لوله TFX.

نمونه سازی کنید و کامپوننت ExampleGen را اجرا کنید

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.

کامپوننت StatisticsGen را نمونه سازی کرده و اجرا کنید

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 را نمونه سازی کرده و اجرا کنید

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

کامپوننت Trainer را نمونه سازی کرده و اجرا کنید

# 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

اجرای Trainer جزء.

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

مدل را ارزیابی و فشار دهید

استفاده از Evaluator جزء به منظور بررسی و برکت 'مدل قبل از استفاده از Pusher جزء به فشار مدل به یک دایرکتوری از خدمت.

_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 پایگاه داده MLMD را پر می کند. در بخش بعدی، شما از API MLMD برای جستجو در این پایگاه داده برای اطلاعات فراداده استفاده می کنید.

از پایگاه داده MLMD پرس و جو کنید

پایگاه داده MLMD سه نوع متادیتا را ذخیره می کند:

  • فراداده در مورد اطلاعات خط لوله و اصل و نسب مرتبط با اجزای خط لوله
  • فراداده در مورد مصنوعاتی که در طول اجرای خط لوله تولید شده اند
  • فراداده در مورد اجرای خط لوله

یک خط لوله محیطی معمولی تولید، با رسیدن داده های جدید، چندین مدل را ارائه می دهد. هنگامی که با نتایج اشتباه در مدل‌های ارائه‌شده مواجه می‌شوید، می‌توانید از پایگاه داده MLMD پرس و جو کنید تا مدل‌های اشتباه را جدا کنید. سپس می توانید خط و نسب اجزای خط لوله مربوط به این مدل ها را برای اشکال زدایی مدل های خود ردیابی کنید

تنظیم از فروشگاه ابرداده (MD) با InteractiveContext قبلا تعریف شده به پرس و جو پایگاه داده MLMD.

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 ایجاد کنید.

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)

اول، پرس و جو از فروشگاه MD برای یک لیست از تمام ذخیره شده خود را ArtifactTypes .

display_types(store.get_artifact_types())

بعد، پرس و جو تمام PushedModel مصنوعات است.

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

برای آخرین مدل هل شده از فروشگاه MD استعلام بگیرید. این آموزش فقط یک مدل هل داده شده دارد.

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

یکی از اولین مراحل در اشکال زدایی یک مدل هل داده شده این است که ببینیم کدام مدل آموزش دیده رانده شده است و ببینیم کدام داده آموزشی برای آموزش آن مدل استفاده می شود.

MLMD APIهای پیمایشی را برای قدم زدن در نمودار منشأ ارائه می دهد که می توانید از آنها برای تجزیه و تحلیل منشأ مدل استفاده کنید.

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

مصنوعات والد را برای مدل تحت فشار پرس و جو کنید.

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

خواص مدل را پرس و جو کنید.

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

مصنوعات بالادستی را برای مدل جستجو کنید.

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

داده های آموزشی را که مدل با آن آموزش داده شده است، دریافت کنید.

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

اکنون که داده های آموزشی را دارید که مدل با آن آموزش داده است، برای یافتن مرحله آموزش (اجرا) مجدداً از پایگاه داده پرس و جو کنید. لیستی از انواع اجرای ثبت شده را از فروشگاه MD جستجو کنید.

display_types(store.get_execution_types())

گام آموزش است ExecutionType نام tfx.components.trainer.component.Trainer . از فروشگاه MD عبور کنید تا مربی که مطابق با مدل هل داده شده است را اجرا کنید.

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)

خلاصه

در این آموزش، یاد گرفتید که چگونه می توانید از MLMD برای ردیابی اصل و نسب اجزای خط لوله TFX خود و حل مشکلات استفاده کنید.

برای کسب اطلاعات بیشتر در مورد نحوه استفاده از MLMD، این منابع اضافی را بررسی کنید: