Tensorflowモデル分析アーキテクチャ

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

概要

TensorFlowモデル分析(TFMA)パイプラインは次のように表されます。

TFMAパイプライン

パイプラインは、次の4つの主要コンポーネントで構成されています。

  • 入力の読み取り
  • 抽出
  • 評価
  • 結果を書く

これらのコンポーネントは、 tfma.Extractstfma.evaluators.Evaluationの2つの主要なタイプを利用します。タイプtfma.Extractsは、パイプライン処理中に抽出されるデータを表し、モデルの1つ以上の例に対応する場合があります。 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が直接書き出されることは決してないことに注意してください。これらは、常にevaluatorを経由して、 tfma.evaluators.Evaluationを生成してから書き出される必要があります。また、 tfma.Extractsはbeam.pvalue.PCollectionに格納されるdictです(つまり、 beam.pvalue.PCollectionは入力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.PTransformのリストです。エクストラクタは、 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レコードから生の特徴、生のラベル、生のサンプルの重みを抽出して、メトリックのスライスと計算に使用します。デフォルトでは、値はそれぞれ抽出キーfeatureslabels 、およびexample_weightsの下に保存されます。単一出力のモデルラベルとサンプルの重みは、 np.ndarray値として直接保存されます。マルチ出力モデルのラベルと重みの例は、 np.ndarray値のdictとして保存されます(出力名でキー設定されます)。マルチモデル評価が実行される場合、ラベルとサンプルの重みは、別のdict(モデル名でキー設定)内にさらに埋め込まれます。

PredictExtractor

tfma.extractors.PredictExtractorは、モデル予測を実行し、それらをtfma.Extractsの主要なpredictionsの下に格納します。単一出力モデルの予測は、予測出力値として直接保存されます。マルチ出力モデルの予測は、出力値のdictとして保存されます(出力名でキー設定されます)。マルチモデル評価が実行される場合、予測はさらに別のdict(モデル名でキー設定)に埋め込まれます。使用される実際の出力値はモデルによって異なります(たとえば、TF Estimatorの戻り出力は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

エバリュエーターは、 beam.PTransformを入力としてtfma.Extracts beam.PTransformであることに注意してください。評価プロセスの一部として、実装が抽出に対して追加の変換を実行することを妨げるものは何もありません。 tfma.Extracts dictを返す必要があるエクストラクタとは異なり、ほとんどのエバリュエーターはdict(メトリック名や値など)も返しますが、エバリュエーターが生成できる出力のタイプに制限はありません。

MetricsAndPlotsEvaluator

tfma.evaluators.MetricsAndPlotsEvaluatorは、 featureslabels 、およびpredictionsを入力として受け取り、それらをtfma.slicer.FanoutSlicesで実行してスライスごとにグループ化し、メトリックを実行して計算をプロットします。メトリックのディクショナリの形式で出力を生成し、キーと値をプロットします(これらは、後でtfma.writers.MetricsAndPlotsWriterによって出力されるようにシリアル化されたプロトに変換されます)。

結果を書く

WriteResultsステージは、評価出力がディスクに書き出される場所です。 WriteResultsは、ライターを使用して、出力キーに基づいてデータを書き出します。たとえば、 tfma.evaluators.Evaluationには、 metricsplotsのキーが含まれている場合があります。これらは、「メトリクス」および「プロット」と呼ばれるメトリクスおよびプロットディクショナリに関連付けられます。ライターは、各ファイルの書き方を指定します。

# 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を選択できます。出力キー(例については以下を参照)。

カスタマイズ

tfma.run_model_analysisメソッドは、パイプラインで使用されるエクストラクター、エバリュエーター、およびライターをカスタマイズするために、 extractorsevaluators 、およびwriters引数を取ります。引数が指定されていない場合、デフォルトでtfma.default_extractorstfma.default_evaluators 、およびtfma.default_writersが使用されます。

カスタムエクストラクタ

カスタムエクストラクタを作成するには、 beam.PTransformをラップするtfma.extractors.Extractorタイプを作成し、 tfma.Extractsを入力として受け取り、 tfma.Extractsを出力として返します。エクストラクタの例は、 tfma.extractors入手できます。

カスタムエバリュエーター

カスタムエバリュエーターを作成するには、ビームをラップするtfma.evaluators.Evaluatorタイプを作成しますbeam.PTransformtfma.Extractsを入力として受け取り、 tfma.evaluators.Evaluationを出力として返します。非常に基本的なエバリュエーターは、着信tfma.Extractsを取得して出力し、テーブルに格納する場合があります。これはまさにtfma.evaluators.AnalysisTableEvaluatorが行うことです。より複雑なエバリュエーターは、追加の処理とデータ集約を実行する場合があります。例として、 tfma.evaluators.MetricsAndPlotsEvaluatorを参照してください。

tfma.evaluators.MetricsAndPlotsEvaluator自体をカスタマイズして、カスタムメトリックをサポートできることに注意してください(詳細については、メトリックを参照してください)。

カスタムライター

カスタムライターを作成するには、 tfma.evaluators.Evaluationを入力として、 beam.pvalue.PDone beam.PTransformラップするtfma.writers.Writerタイプを作成します。以下は、メトリックを含むTFRecordを書き出すためのライターの基本的な例です。

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のライターは、 tfma.evaluators.AnalysisTableEvaluatorbeam.pvalue.PCollectionを書き出す責任がありtfma.Extracts

ライターは、使用される出力キー( 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