بنية تحليل نموذج Tensorflow

ملخص

يتم توضيح خط أنابيب تحليل نموذج TensorFlow (TFMA) على النحو التالي:

خط أنابيب TFMA

يتكون خط الأنابيب من أربعة مكونات رئيسية:

  • قراءة المدخلات
  • اِستِخلاص
  • تقييم
  • كتابة النتائج

تستخدم هذه المكونات نوعين أساسيين: tfma.Extracts و tfma.evaluators.Evaluation . يمثل النوع tfma.Extracts البيانات التي يتم استخراجها أثناء معالجة خطوط الأنابيب وقد تتوافق مع مثال واحد أو أكثر للنموذج. يمثل tfma.evaluators.Evaluation مخرجات تقييم المستخلصات في نقاط مختلفة أثناء عملية الاستخراج. من أجل توفير واجهة برمجة تطبيقات مرنة، هذه الأنواع هي مجرد أوامر يتم فيها تحديد المفاتيح (محجوزة للاستخدام) من خلال تطبيقات مختلفة. يتم تعريف الأنواع على النحو التالي:

# 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 PTransform يأخذ الإملاء نفسه كوسيطة لإدخال beam.value.PCollection ). بمعنى آخر، يتم استخدام tfma.evaluators.Evaluation في وقت إنشاء خط الأنابيب، ولكن يتم استخدام tfma.Extracts في وقت تشغيل خط الأنابيب.

قراءة المدخلات

تتكون مرحلة ReadInputs من تحويل يأخذ المدخلات الأولية (tf.train.Example، CSV، ...) ويحولها إلى مقتطفات. اليوم يتم تمثيل المقتطفات على أنها بايتات إدخال أولية مخزنة ضمن tfma.INPUT_KEY ، ومع ذلك يمكن أن تكون المقتطفات في أي شكل متوافق مع خط أنابيب الاستخراج - مما يعني أنها تنشئ tfma.Extracts كمخرجات، وأن تلك المقتطفات متوافقة مع المصب النازعون. الأمر متروك للمستخرجين المختلفين لتوثيق ما يحتاجون إليه بوضوح.

اِستِخلاص

عملية الاستخراج عبارة عن قائمة من beam.PTransform PTransform التي يتم تشغيلها في سلسلة. يأخذ المستخرجون tfma.Extracts كمدخلات ويعيدون tfma.Extracts كمخرجات. المستخرج النموذجي الأولي هو tfma.extractors.PredictExtractor الذي يستخدم مستخلص الإدخال الناتج عن تحويل مدخلات القراءة وتشغيله من خلال نموذج لإنتاج مقتطفات تنبؤات. يمكن إدراج المستخرجات المخصصة في أي وقت بشرط أن تتوافق تحويلاتها مع tfma.Extracts in و tfma.Extracts out API. يتم تعريف النازع على النحو التالي:

# 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

مستخرج الإدخال

يتم استخدام tfma.extractors.InputExtractor لاستخراج الميزات الأولية والتسميات الأولية وأوزان الأمثلة الأولية من سجلات tf.train.Example لاستخدامها في تقطيع المقاييس والحسابات. افتراضيًا، يتم تخزين القيم ضمن features استخراج المفاتيح labels و example_weights على التوالي. يتم تخزين تسميات النماذج أحادية الإخراج وأوزان الأمثلة مباشرة كقيم np.ndarray . يتم تخزين تسميات النماذج متعددة المخرجات وأوزان الأمثلة كإملاءات لقيم np.ndarray (مرتبطة باسم المخرج). إذا تم إجراء تقييم متعدد النماذج، فسيتم تضمين التسميات وأوزان الأمثلة بشكل أكبر في إملاء آخر (مرتبط باسم النموذج).

توقع النازع

يقوم tfma.extractors.PredictExtractor بتشغيل تنبؤات النموذج ويخزنها ضمن predictions الرئيسية في إملاء tfma.Extracts . يتم تخزين تنبؤات نموذج الإخراج الفردي مباشرة كقيم الإخراج المتوقعة. يتم تخزين تنبؤات النماذج متعددة المخرجات كإملاء لقيم المخرجات (مرتبطة باسم المخرج). إذا تم إجراء تقييم متعدد النماذج، فسيتم تضمين التنبؤ بشكل أكبر في إملاء آخر (مرتبط باسم النموذج). تعتمد قيمة المخرجات الفعلية المستخدمة على النموذج (على سبيل المثال، مخرجات الإرجاع لمقدر 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 ، لا توجد قيود على أنواع المخرجات التي يمكن للمقيم إنتاجها على الرغم من أن معظم المقيمين أيضًا يقومون بإرجاع إملاء (على سبيل المثال، أسماء وقيم القياس).

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

المقاييس والمؤامرات

نحن نقدم tfma.writers.MetricsAndPlotsWriter الذي يحول المقاييس والقواميس إلى نماذج أولية متسلسلة ويكتبها على القرص.

إذا كنت ترغب في استخدام تنسيق تسلسل مختلف، فيمكنك إنشاء كاتب مخصص واستخدامه بدلاً من ذلك. نظرًا لأن tfma.evaluators.Evaluation الذي تم تمريره إلى الكتاب يحتوي على مخرجات جميع المقيمين مجتمعين، يتم توفير تحويل مساعد tfma.writers.Write يمكن للكتاب استخدامه في تطبيقات ptransform الخاصة بهم لتحديد beam.PCollection المناسبة. PCollection s استنادًا إلى مفتاح الإخراج (انظر أدناه للحصول على مثال).

التخصيص

يستخدم الأسلوب tfma.run_model_analysis وسيطات extractors evaluators writers لتخصيص المستخرجين والمقيمين والكتاب الذين يستخدمهم المسار. إذا لم يتم توفير أي وسائط، فسيتم استخدام tfma.default_extractors و tfma.default_evaluators و tfma.default_writers بشكل افتراضي.

النازعون المخصصون

لإنشاء مستخرج مخصص، قم بإنشاء نوع tfma.extractors.Extractor الذي يغلف beam.PTransform PTransform يأخذ tfma.Extracts كمدخل ويعيد tfma.Extracts كمخرجات. تتوفر أمثلة على المستخرجات ضمن tfma.extractors .

المقيمون المخصصون

لإنشاء مقيم مخصص، قم بإنشاء نوع tfma.evaluators.Evaluator الذي يغلف beam.PTransform PTransform يأخذ tfma.Extracts كمدخل ويعيد tfma.evaluators.Evaluation كمخرج. يمكن للمقيم الأساسي أن يأخذ مقتطفات tfma.Extracts الواردة ويخرجها لتخزينها في جدول. وهذا هو بالضبط ما يفعله tfma.evaluators.AnalysisTableEvaluator . قد يقوم مقيم أكثر تعقيدًا بإجراء معالجة إضافية وتجميع البيانات. راجع tfma.evaluators.MetricsAndPlotsEvaluator كمثال.

لاحظ أنه يمكن تخصيص tfma.evaluators.MetricsAndPlotsEvaluator نفسه لدعم المقاييس المخصصة (راجع المقاييس لمزيد من التفاصيل).

كاتبين مخصصين

لإنشاء كاتب مخصص، قم بإنشاء نوع tfma.writers.Writer الذي يلتف على beam.PTransform 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