معماری تحلیل مدل تنسورفلو

بررسی اجمالی

خط لوله تحلیل مدل TensorFlow (TFMA) به صورت زیر نشان داده شده است:

خط لوله TFMA

خط لوله از چهار جزء اصلی تشکیل شده است:

  • ورودی ها را بخوانید
  • استخراج
  • ارزیابی
  • نتایج را بنویسید

این مؤلفه ها از دو نوع اصلی استفاده می کنند: tfma.Extracts و tfma.evaluators.Evaluation . نوع tfma.Extracts نشان دهنده داده هایی است که در طول پردازش خط لوله استخراج می شوند و ممکن است با یک یا چند مثال برای مدل مطابقت داشته باشند. tfma.evaluators.Evaluation خروجی حاصل از ارزیابی عصاره ها در نقاط مختلف در طول فرآیند استخراج را نشان می دهد. به منظور ارائه یک API منعطف، این انواع فقط دستوراتی هستند که در آن کلیدها توسط پیاده سازی های مختلف تعریف می شوند (برای استفاده رزرو می شوند). انواع به شرح زیر تعریف می شود:

# Extracts represent data extracted during pipeline processing.
# For example, the PredictExtractor stores the data for the
# features, labels, and predictions under the keys "features",
# "labels", and "predictions".
Extracts = Dict[Text, Any]

# Evaluation represents the output from evaluating extracts at
# particular point in the pipeline. The evaluation outputs are
# keyed by their associated output type. For example, the metric / plot
# dictionaries from evaluating metrics and plots will be stored under
# "metrics" and "plots" respectively.
Evaluation = Dict[Text, beam.pvalue.PCollection]

توجه داشته باشید که tfma.Extracts هرگز مستقیماً نوشته نمی‌شوند، آنها همیشه باید از طریق یک ارزیاب برای تولید tfma.evaluators.Evaluation که سپس نوشته می‌شود، عبور کنند. همچنین توجه داشته باشید که tfma.Extracts دیکت هایی هستند که در یک beam.pvalue.PCollection ذخیره می شوند (یعنی beam.PTransform به عنوان ورودی beam.pvalue.PCollection[tfma.Extracts] در نظر گرفته می شود) در حالی که tfma.evaluators.Evaluation است که مقادیر آن beam.pvalue.PCollection s هستند (یعنی beam.PTransform خود دیکت را به عنوان آرگومان ورودی beam.value.PCollection می گیرد). به عبارت دیگر tfma.evaluators.Evaluation در زمان ساخت خط لوله استفاده می شود، اما tfma.Extracts در زمان اجرای خط لوله استفاده می شود.

ورودی ها را بخوانید

مرحله ReadInputs از یک تبدیل تشکیل شده است که ورودی های خام (tf.train.Example، CSV، ...) را می گیرد و آنها را به عصاره تبدیل می کند. امروزه عصاره‌ها به‌عنوان بایت‌های ورودی خام ذخیره‌شده در tfma.INPUT_KEY ، اما عصاره‌ها می‌توانند به هر شکلی باشند که با خط لوله استخراج سازگار باشد - به این معنی که tfma.Extracts را به عنوان خروجی ایجاد می‌کند، و آن عصاره‌ها با پایین‌دست سازگار هستند. استخراج کننده ها این به استخراج کننده های مختلف بستگی دارد که به وضوح آنچه را که نیاز دارند مستند کنند.

استخراج

فرآیند استخراج لیستی از beam.PTransform است که به صورت سری اجرا می شوند. استخراج کننده ها tfma.Extracts را به عنوان ورودی می گیرند و tfma.Extracts را به عنوان خروجی برمی گردانند. استخراج کننده نمونه tfma.extractors.PredictExtractor است که از عصاره ورودی تولید شده توسط تبدیل ورودی های خوانده شده استفاده می کند و آن را از طریق یک مدل اجرا می کند تا عصاره های پیش بینی تولید کند. استخراج کننده های سفارشی شده را می توان در هر نقطه وارد کرد، مشروط بر اینکه تبدیل آنها با tfma.Extracts in و tfma.Extracts out مطابقت داشته باشد. استخراج کننده به صورت زیر تعریف می شود:

# An Extractor is a PTransform that takes Extracts as input and returns
# Extracts as output. A typical example is a PredictExtractor that receives
# an 'input' placeholder for input and adds additional 'predictions' extracts.
Extractor = NamedTuple('Extractor', [
    ('stage_name', Text),
    ('ptransform', beam.PTransform)])  # Extracts -> Extracts

InputExtractor

tfma.extractors.InputExtractor برای استخراج ویژگی‌های خام، برچسب‌های خام و وزن‌های نمونه خام از رکوردهای tf.train.Example برای استفاده در برش‌های متریک و محاسبات استفاده می‌شود. به‌طور پیش‌فرض مقادیر به ترتیب در زیر کلیدهای استخراج features ، labels و example_weights ذخیره می‌شوند. برچسب های مدل تک خروجی و وزن نمونه مستقیماً به عنوان مقادیر np.ndarray ذخیره می شوند. برچسب‌های مدل چند خروجی و وزن‌های نمونه به‌عنوان دستور مقادیر np.ndarray (کلید شده با نام خروجی) ذخیره می‌شوند. اگر ارزیابی چند مدلی انجام شود، برچسب‌ها و وزن‌های نمونه بیشتر در یک دیکته دیگر (کلید شده با نام مدل) تعبیه می‌شوند.

پیش بینی استخراج

tfma.extractors.PredictExtractor پیش بینی های مدل را اجرا می کند و آنها را در زیر predictions های کلیدی در tfma.Extracts dict ذخیره می کند. پیش بینی های مدل تک خروجی مستقیماً به عنوان مقادیر خروجی پیش بینی شده ذخیره می شوند. پیش‌بینی‌های مدل چند خروجی به‌عنوان دیکته‌ای از مقادیر خروجی (که با نام خروجی کلید می‌خورد) ذخیره می‌شوند. اگر ارزیابی چند مدلی انجام شود، پیش‌بینی بیشتر در دیکته دیگری تعبیه می‌شود (با نام مدل کلید می‌خورد). مقدار واقعی خروجی استفاده شده به مدل بستگی دارد (مثلاً خروجی های برگشتی برآوردگر TF به صورت دیکته در حالی که keras مقادیر np.ndarray را برمی گرداند).

SliceKeyExtractor

tfma.extractors.SliceKeyExtractor از مشخصات برش استفاده می‌کند تا تعیین کند کدام برش‌ها برای هر ورودی نمونه بر اساس ویژگی‌های استخراج‌شده اعمال می‌شوند و مقادیر برش متناظر را برای استفاده بعدی توسط ارزیابان به عصاره‌ها اضافه می‌کند.

ارزیابی

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

# An evaluator is a PTransform that takes Extracts as input and
# produces an Evaluation as output. A typical example of an evaluator
# is the MetricsAndPlotsEvaluator that takes the 'features', 'labels',
# and 'predictions' extracts from the PredictExtractor and evaluates
# them using post export metrics to produce metrics and plots dictionaries.
Evaluator = NamedTuple('Evaluator', [
  ('stage_name', Text),
  ('run_after', Text),              # Extractor.stage_name
  ('ptransform', beam.PTransform)]) # Extracts -> Evaluation

توجه کنید که یک ارزیاب یک پرتو است. beam.PTransform که tfma.Extracts را به عنوان ورودی می گیرد. هیچ چیز مانع از اجرای تغییرات اضافی بر روی عصاره ها به عنوان بخشی از فرآیند ارزیابی نمی شود. برخلاف استخراج‌کننده‌ها که باید یک tfma.Extracts dict را برگردانند، هیچ محدودیتی در مورد انواع خروجی‌هایی که یک ارزیاب می‌تواند تولید کند وجود ندارد، اگرچه اکثر ارزیاب‌ها یک دیکته را نیز برمی‌گردانند (مثلاً نام‌ها و مقادیر متریک).

MetricsAndPlotsEvaluator

tfma.evaluators.MetricsAndPlotsEvaluator features ها، labels و predictions ها را به عنوان ورودی دریافت می کند، آنها را از طریق tfma.slicer.FanoutSlices اجرا می کند تا آنها را بر اساس برش ها گروه بندی کند، و سپس متریک ها را انجام می دهد و محاسبات را ترسیم می کند. این خروجی ها را به شکل فرهنگ لغت متریک تولید می کند و کلیدها و مقادیر را ترسیم می کند (اینها بعداً به پروتوهای سریالی برای خروجی توسط tfma.writers.MetricsAndPlotsWriter می شوند).

نتایج را بنویسید

مرحله WriteResults جایی است که خروجی ارزیابی روی دیسک نوشته می شود. WriteResults از نویسنده ها برای نوشتن داده ها بر اساس کلیدهای خروجی استفاده می کند. به عنوان مثال، یک tfma.evaluators.Evaluation ممکن است حاوی کلیدهایی برای metrics و plots باشد. سپس اینها با دیکشنری های معیارها و نمودارها به نام «متریک» و «نقشه» مرتبط می شوند. نویسندگان نحوه نوشتن هر فایل را مشخص می کنند:

# A writer is a PTransform that takes evaluation output as input and
# serializes the associated PCollections of data to a sink.
Writer = NamedTuple('Writer', [
  ('stage_name', Text),
  ('ptransform', beam.PTransform)])    # Evaluation -> PDone

MetricsAndPlotsWriter

ما یک tfma.writers.MetricsAndPlotsWriter ارائه می دهیم که معیارها و رسم دیکشنری ها را به پروتوهای سریالی تبدیل می کند و آنها را روی دیسک می نویسد.

اگر می‌خواهید از قالب سریال‌سازی متفاوتی استفاده کنید، می‌توانید یک نویسنده سفارشی ایجاد کنید و به جای آن از آن استفاده کنید. از آنجایی که tfma.evaluators.Evaluation شده به نویسنده ها حاوی خروجی برای همه ارزیاب ها است، یک تبدیل کمکی tfma.writers.Write ارائه شده است که نویسندگان می توانند در پیاده سازی های ptransform خود برای انتخاب پرتو مناسب استفاده کنند. beam.PCollection s بر اساس یک کلید خروجی (برای مثال به زیر مراجعه کنید).

سفارشی سازی

روش tfma.run_model_analysis برای سفارشی کردن extractors ، evaluators و writers مورد استفاده توسط خط لوله، استدلال‌های استخراج‌کننده، ارزیابی‌کننده و نویسنده را می‌گیرد. اگر هیچ آرگومان ارائه نشود، tfma.default_extractors ، tfma.default_evaluators ، و tfma.default_writers به ​​طور پیش‌فرض استفاده می‌شوند.

استخراج کننده های سفارشی

برای ایجاد یک استخراج کننده سفارشی، یک نوع tfma.extractors.Extractor ایجاد کنید که یک پرتو را می پوشاند. tfma.Extracts beam.PTransform عنوان ورودی و برگرداندن tfma.Extracts به عنوان خروجی. نمونه هایی از استخراج کننده ها تحت tfma.extractors موجود هستند.

ارزیاب های سفارشی

برای ایجاد یک ارزیاب سفارشی، یک نوع tfma.evaluators.Evaluator ایجاد کنید که یک beam.PTransform را بپیچد. tfma.Extracts به عنوان ورودی و برگرداندن tfma.evaluators.Evaluation به عنوان خروجی. یک ارزیاب بسیار ابتدایی ممکن است tfma.Extracts های ورودی را بگیرد و آنها را برای ذخیره در یک جدول خروجی دهد. این دقیقاً همان کاری است که tfma.evaluators.AnalysisTableEvaluator انجام می دهد. یک ارزیاب پیچیده تر ممکن است پردازش و تجمیع داده های اضافی را انجام دهد. به عنوان مثال tfma.evaluators.MetricsAndPlotsEvaluator را ببینید.

توجه داشته باشید که خود tfma.evaluators.MetricsAndPlotsEvaluator می تواند برای پشتیبانی از معیارهای سفارشی سفارشی شود (برای جزئیات بیشتر به معیارها مراجعه کنید).

نویسندگان سفارشی

برای ایجاد یک رایتر سفارشی، یک نوع tfma.writers.Writer ایجاد کنید که یک beam.PTransform را بپیچد. tfma.evaluators.Evaluation را به عنوان ورودی و برگرداندن beam.pvalue.PDone را به عنوان خروجی تبدیل کنید. در زیر یک مثال اساسی از یک نویسنده برای نوشتن TFRecords حاوی معیارها است:

tfma.writers.Writer(
  stage_name='WriteTFRecord(%s)' % tfma.METRICS_KEY,
  ptransform=tfma.writers.Write(
    key=tfma.METRICS_KEY,
    ptransform=beam.io.WriteToTFRecord(file_path_prefix=output_file))

ورودی های نویسنده به خروجی ارزیاب مرتبط بستگی دارد. برای مثال بالا، خروجی یک پروتوی سریالی است که توسط tfma.evaluators.MetricsAndPlotsEvaluator تولید شده است. یک نویسنده برای tfma.evaluators.AnalysisTableEvaluator مسئول نوشتن یک مجموعه beam.pvalue.PCollection از tfma.Extracts است.

توجه داشته باشید که یک نویسنده از طریق کلید خروجی مورد استفاده (مثلا tfma.METRICS_KEY ، tfma.ANALYSIS_KEY ، و غیره) با خروجی یک ارزیاب مرتبط می شود.

گام به گام مثال

در زیر نمونه‌ای از مراحل درگیر در خط لوله استخراج و ارزیابی است که هر دو tfma.evaluators.MetricsAndPlotsEvaluator و tfma.evaluators.AnalysisTableEvaluator استفاده می‌شوند:

run_model_analysis(
    ...
    extractors=[
        tfma.extractors.InputExtractor(...),
        tfma.extractors.PredictExtractor(...),
        tfma.extractors.SliceKeyExtrator(...)
    ],
    evaluators=[
        tfma.evaluators.MetricsAndPlotsEvaluator(...),
        tfma.evaluators.AnalysisTableEvaluator(...)
    ])

ReadInputs

# Out
Extracts {
  'input': bytes                 # CSV, Proto, ...
}

ExtractAndEvaluate

# In:  ReadInputs Extracts
# Out:
Extracts {
  'input': bytes                    # CSV, Proto, ...
  'features': tensor_like           # Raw features
  'labels': tensor_like             # Labels
  'example_weights': tensor_like    # Example weights
}
# In:  InputExtractor Extracts
# Out:
Extracts {
  'input': bytes                    # CSV, Proto, ...
  'features': tensor_like           # Raw features
  'labels': tensor_like             # Labels
  'example_weights': tensor_like    # Example weights
  'predictions': tensor_like        # Predictions
}
# In: PredictExtractor Extracts
# Out:
Extracts {
  'features': tensor_like           # Raw features
  'labels': tensor_like             # Labels
  'example_weights': tensor_like    # Example weights
  'predictions': tensor_like        # Predictions
  'slice_key': Tuple[bytes...]      # Slice
}
# In: SliceKeyExtractor Extracts
# Out:
Evaluation {
  'metrics': PCollection[Tuple[slicer.SliceKeyType, Dict[Text, Any]]]  # Tuples of (slice key, dictionary from metric key to metric values)
  'plots': PCollection[Tuple[slicer.SliceKeyType, Dict[Text, Any]]]  # Tuples of (slice key, dictionary from plot key to plot values)
}
# In: SliceKeyExtractor Extracts
# Out:
Evaluation {
  'analysis': PCollection[Extracts] # Final Extracts
}

WriteResults

# In:
Evaluation {
  'metrics': PCollection[Tuple[slicer.SliceKeyType, Dict[Text, Any]]]  # Tuples of (slice key, dictionary from metric key to metric values)
  'plots': PCollection[Tuple[slicer.SliceKeyType, Dict[Text, Any]]]  # Tuples of (slice key, dictionary from plot key to plot values)
  'analysis': PCollection[Extracts] # Final Extracts
}
# Out: metrics, plots, and analysis files