مشاهده در 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، این منابع اضافی را بررسی کنید: