Tensorflow 模型分析架構

總覽

TensorFlow 模型分析 (TFMA) 管道的描繪方式如下

TFMA Pipeline

管道由四個主要元件組成

  • 讀取輸入
  • 擷取
  • 評估
  • 寫入結果

這些元件使用兩種主要類型:tfma.Extractstfma.evaluators.Evaluationtfma.Extracts 類型代表在管道處理期間擷取的資料,而且可能對應於模型的一個或多個範例。tfma.evaluators.Evaluation 代表評估擷取內容在擷取過程各個點的輸出。為了提供彈性的 API,這些類型只是 dict,其中的鍵由不同的實作定義 (保留供使用)。這些類型的定義如下

# 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 中的 dict (也就是 beam.PTransform 會將 beam.pvalue.PCollection[tfma.Extracts] 做為輸入),而 tfma.evaluators.Evaluation 是一個 dict,其值為 beam.pvalue.PCollection (也就是 beam.PTransform 會將 dict 本身做為 beam.value.PCollection 輸入的引數)。換句話說,tfma.evaluators.Evaluation 是在管道建構時間使用,但 tfma.Extracts 是在管道執行階段使用。

讀取輸入

ReadInputs 階段是由轉換組成,該轉換會接收原始輸入 (tf.train.Example、CSV 等),並將它們轉換為擷取內容。目前擷取內容是以原始輸入位元組的形式表示,並儲存在 tfma.INPUT_KEY 下,但擷取內容可以是與擷取管道相容的任何形式,也就是說,它會建立 tfma.Extracts 做為輸出,而且這些擷取內容與下游擷取器相容。不同的擷取器必須清楚記錄它們的需求。

擷取

擷取程序是一系列依序執行的 beam.PTransformtfma.Extracts 擷取器會將 tfma.Extracts 做為輸入,並傳回 tfma.Extracts 做為輸出。原型擷取器是 tfma.extractors.PredictExtractor,它會使用讀取輸入轉換產生的輸入擷取內容,並透過模型執行以產生預測擷取內容。自訂擷取器可以插入在任何點,前提是它們的轉換符合 tfma.Extracts 輸入和 tfma.Extracts 輸出 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

InputExtractor

tfma.extractors.InputExtractor 用於從 tf.train.Example 記錄擷取原始特徵、原始標籤和原始範例權重,以用於指標分區和計算。根據預設,這些值會儲存在擷取鍵 featureslabelsexample_weights 下。單一輸出模型標籤和範例權重會直接儲存為 np.ndarray 值。多重輸出模型標籤和範例權重會儲存為 np.ndarray 值的 dict (以輸出名稱做為鍵)。如果執行多模型評估,標籤和範例權重會進一步嵌入在另一個 dict 內 (以模型名稱做為鍵)。

PredictExtractor

tfma.extractors.PredictExtractor 執行模型預測,並將它們儲存在 tfma.Extracts dict 中的 predictions 鍵下。單一輸出模型預測會直接儲存為預測輸出值。多重輸出模型預測會儲存為輸出值 dict (以輸出名稱做為鍵)。如果執行多模型評估,預測會進一步嵌入在另一個 dict 內 (以模型名稱做為鍵)。使用的實際輸出值取決於模型 (例如,TF 估算器以 dict 形式傳回輸出,而 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

請注意,評估器是將 tfma.Extracts 做為輸入的 beam.PTransform。實作可以對擷取內容執行額外轉換,做為評估程序的一部分,這沒有任何限制。與必須傳回 tfma.Extracts dict 的擷取器不同,評估器可以產生的輸出類型沒有限制,不過大多數評估器也會傳回 dict (例如,指標名稱和值)。

MetricsAndPlotsEvaluator

tfma.evaluators.MetricsAndPlotsEvaluator 接收 featureslabelspredictions 做為輸入,透過 tfma.slicer.FanoutSlices 執行它們以依分區分組,然後執行指標和繪圖計算。它會以指標和繪圖鍵和值的字典形式產生輸出 (這些稍後會轉換為序列化 proto,以供 tfma.writers.MetricsAndPlotsWriter 輸出)。

寫入結果

WriteResults 階段是評估輸出寫出到磁碟的位置。WriteResults 使用寫入器,根據輸出鍵寫出資料。例如,tfma.evaluators.Evaluation 可能包含 metricsplots 的鍵。然後,這些會與名為「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,它會將指標和繪圖字典轉換為序列化 proto,並將它們寫入磁碟。

如果您想要使用不同的序列化格式,您可以建立自訂寫入器並改用該寫入器。由於傳遞至寫入器的 tfma.evaluators.Evaluation 包含所有評估器的組合輸出,因此提供了 tfma.writers.Write 輔助轉換,寫入器可以在其 ptransform 實作中使用,以根據輸出鍵選取適當的 beam.PCollection (請參閱下方的範例)。

自訂

tfma.run_model_analysis 方法採用 extractorsevaluatorswriters 引數,用於自訂管道使用的擷取器、評估器和寫入器。如果未提供任何引數,則預設會使用 tfma.default_extractorstfma.default_evaluatorstfma.default_writers

自訂擷取器

若要建立自訂擷取器,請建立 tfma.extractors.Extractor 類型,它會包裝 beam.PTransform,將 tfma.Extracts 做為輸入並傳回 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 產生的序列化 proto。tfma.evaluators.AnalysisTableEvaluator 的寫入器會負責寫出 tfma.Extractsbeam.pvalue.PCollection

請注意,寫入器會透過使用的輸出鍵 (例如 tfma.METRICS_KEYtfma.ANALYSIS_KEY 等) 與評估器的輸出建立關聯。

逐步範例

以下範例說明當同時使用 tfma.evaluators.MetricsAndPlotsEvaluatortfma.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