Architektura analizy modelu Tensorflow

Przegląd

Potok analizy modelu TensorFlow (TFMA) przedstawiono w następujący sposób:

Rurociąg TFMA

Rurociąg składa się z czterech głównych elementów:

  • Przeczytaj dane wejściowe
  • Ekstrakcja
  • Ocena
  • Zapisz wyniki

Komponenty te korzystają z dwóch podstawowych typów: tfma.Extracts i tfma.evaluators.Evaluation . Typ tfma.Extracts reprezentuje dane wyodrębniane podczas przetwarzania potoku i może odpowiadać jednemu lub większej liczbie przykładów modelu. tfma.evaluators.Evaluation reprezentuje wynik oceny ekstraktów na różnych etapach procesu ekstrakcji. Aby zapewnić elastyczne API, typy te są po prostu dyktatorami, w których klucze są zdefiniowane (zarezerwowane do użytku) przez różne implementacje. Typy są zdefiniowane w następujący sposób:

# 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]

Należy pamiętać, że tfma.Extracts nigdy nie są zapisywane bezpośrednio. Zawsze muszą przejść przez osobę oceniającą, aby wygenerować tfma.evaluators.Evaluation , który następnie jest zapisywany. Należy również zauważyć, że tfma.Extracts to dyktaty przechowywane w beam.pvalue.PCollection (tj. beam.PTransform s przyjmują jako dane wejściowe beam.pvalue.PCollection[tfma.Extracts] ), podczas gdy tfma.evaluators.Evaluation to dyktat, którego wartości są beam.pvalue.PCollection (tzn. beam.PTransform przyjmują sam dyktat jako argument wejścia beam.value.PCollection ). Innymi słowy plik tfma.evaluators.Evaluation jest używany w czasie konstruowania potoku, ale plik tfma.Extracts jest używany w czasie wykonywania potoku.

Przeczytaj dane wejściowe

Etap ReadInputs składa się z transformacji, która pobiera surowe dane wejściowe (tf.train.Example, CSV, ...) i konwertuje je na ekstrakty. Obecnie ekstrakty są reprezentowane jako surowe bajty wejściowe przechowywane w tfma.INPUT_KEY , jednakże ekstrakty mogą mieć dowolną formę zgodną z potokiem ekstrakcji - co oznacza, że ​​tworzy tfma.Extracts jako dane wyjściowe i że te ekstrakty są kompatybilne z dalszym ciągiem ekstraktory. Jasna dokumentacja tego, czego wymagają, zależy od poszczególnych ekstraktorów.

Ekstrakcja

Proces wyodrębniania to lista beam.PTransform uruchamianych szeregowo. Ekstraktory pobierają tfma.Extracts jako dane wejściowe i zwracają tfma.Extracts jako dane wyjściowe. Prototypowym ekstraktorem jest tfma.extractors.PredictExtractor , który wykorzystuje ekstrakt wejściowy wygenerowany przez transformację odczytanych danych wejściowych i przepuszcza go przez model w celu wygenerowania ekstraktów predykcji. Niestandardowe ekstraktory można wstawiać w dowolnym miejscu, pod warunkiem, że ich transformacje są zgodne z interfejsami API tfma.Extracts in i tfma.Extracts out. Ekstraktor definiuje się następująco:

# 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

Ekstraktor wejściowy

tfma.extractors.InputExtractor służy do wyodrębniania surowych cech, nieprzetworzonych etykiet i nieprzetworzonych przykładowych wag z rekordów tf.train.Example w celu wykorzystania przy dzieleniu metryk i obliczeniach. Domyślnie wartości są przechowywane odpowiednio w features wyodrębniania kluczy, labels i example_weights . Etykiety modeli z pojedynczym wyjściem i przykładowe wagi są przechowywane bezpośrednio jako wartości np.ndarray . Etykiety modeli z wieloma wynikami i przykładowe wagi są przechowywane jako wskazania wartości np.ndarray (wpisane według nazwy wyniku). Jeśli zostanie przeprowadzona ocena wielu modeli, etykiety i przykładowe wagi zostaną dodatkowo osadzone w innym dyktacie (kluczowanym według nazwy modelu).

Ekstraktor prognoz

tfma.extractors.PredictExtractor uruchamia przewidywania modelu i przechowuje je pod kluczowymi predictions w dyktacie tfma.Extracts . Prognozy modelu pojedynczego wyniku są przechowywane bezpośrednio jako przewidywane wartości wyjściowe. Predykcje modelu z wieloma wynikami są przechowywane jako dyktat wartości wyjściowych (wpisanych według nazwy wyniku). Jeśli zostanie przeprowadzona ocena wielu modeli, prognoza zostanie dodatkowo osadzona w innym dyktacie (wpisanym według nazwy modelu). Rzeczywista używana wartość wyjściowa zależy od modelu (np. wyniki zwracane przez estymator TF w formie dyktatu, podczas gdy keras zwraca wartości np.ndarray ).

Ekstraktor SliceKey

Funkcja tfma.extractors.SliceKeyExtractor wykorzystuje specyfikację krojenia, aby określić, które wycinki mają zastosowanie do każdego przykładowego wejścia w oparciu o wyodrębnione funkcje, i dodaje odpowiednie wartości krojenia do ekstraktów w celu późniejszego wykorzystania przez osoby oceniające.

Ocena

Ocena to proces pobrania ekstraktu i jego oceny. Chociaż powszechne jest przeprowadzanie oceny na końcu rurociągu ekstrakcyjnego, istnieją przypadki użycia, które wymagają oceny na wcześniejszym etapie procesu ekstrakcji. Jako tacy ewaluatorzy są powiązani z ekstraktorami, względem których wyników powinni być oceniani. Ewaluator jest zdefiniowany w następujący sposób:

# 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

Zauważ, że ewaluatorem jest beam.PTransform , która jako dane wejściowe pobiera tfma.Extracts . Nic nie stoi na przeszkodzie, aby wdrożenie wykonało dodatkowe przekształcenia na ekstraktach w ramach procesu oceny. W przeciwieństwie do ekstraktorów, które muszą zwracać dyktando tfma.Extracts , nie ma żadnych ograniczeń co do typów wyników, jakie może wygenerować ewaluator, chociaż większość ewaluatorów również zwraca dyktando (np. nazwy i wartości metryk).

MetricsAndPlotsEvaluator

Funkcja tfma.evaluators.MetricsAndPlotsEvaluator pobiera features , labels i predictions jako dane wejściowe, uruchamia je za pomocą tfma.slicer.FanoutSlices , aby pogrupować je według wycinków, a następnie wykonuje obliczenia metryk i wykresów. Generuje dane wyjściowe w postaci słowników metryk oraz wykreśla klucze i wartości (są one później konwertowane na serializowane protosy do celów wyjściowych przez tfma.writers.MetricsAndPlotsWriter ).

Zapisz wyniki

Na etapie WriteResults wyniki oceny są zapisywane na dysku. WriteResults używa modułów zapisujących do zapisywania danych na podstawie kluczy wyjściowych. Na przykład plik tfma.evaluators.Evaluation może zawierać klucze do metrics i plots . Zostałyby one następnie powiązane ze słownikami metryk i wykresów, zwanymi „metrykami” i „wykresami”. Autorzy określają sposób zapisywania każdego pliku:

# 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

Udostępniamy tfma.writers.MetricsAndPlotsWriter , który konwertuje metryki i wykreśla słowniki na serializowane protosy i zapisuje je na dysku.

Jeśli chcesz użyć innego formatu serializacji, możesz utworzyć niestandardowy moduł zapisujący i użyć go zamiast tego. Ponieważ plik tfma.evaluators.Evaluation przekazany modułom piszącym zawiera dane wyjściowe wszystkich modułów oceniających łącznie, dostępna jest transformacja pomocnicza tfma.writers.Write , której moduły piszące mogą używać w swoich implementacjach ptransform w celu wybrania odpowiedniej beam.PCollection s w oparciu o klucz wyjściowy (przykład poniżej).

Personalizacja

Metoda tfma.run_model_analysis przyjmuje argumenty extractors , evaluators i writers w celu dostosowania ekstraktorów, ewaluatorów i zapisów używanych przez potok. Jeśli nie podano żadnych argumentów, domyślnie używane są tfma.default_extractors , tfma.default_evaluators i tfma.default_writers .

Niestandardowe ekstraktory

Aby utworzyć niestandardowy ekstraktor, utwórz typ tfma.extractors.Extractor , który otacza beam.PTransform , przyjmując tfma.Extracts jako dane wejściowe i zwracając tfma.Extracts jako dane wyjściowe. Przykłady ekstraktorów są dostępne w tfma.extractors .

Niestandardowi ewaluatorzy

Aby utworzyć niestandardowy ewaluator, utwórz typ tfma.evaluators.Evaluator , który otacza beam.PTransform , przyjmując tfma.Extracts jako dane wejściowe i zwracając tfma.evaluators.Evaluation jako dane wyjściowe. Bardzo prosty ewaluator może po prostu pobrać przychodzące tfma.Extracts i wyprowadzić je w celu przechowywania w tabeli. Dokładnie to robi tfma.evaluators.AnalysisTableEvaluator . Bardziej skomplikowany ewaluator może przeprowadzić dodatkowe przetwarzanie i agregację danych. Jako przykład zobacz tfma.evaluators.MetricsAndPlotsEvaluator .

Należy pamiętać, że sam tfma.evaluators.MetricsAndPlotsEvaluator można dostosować do obsługi niestandardowych metryk (więcej szczegółów można znaleźć w sekcji metryki ).

Autorzy niestandardowi

Aby utworzyć niestandardowy moduł zapisujący, utwórz typ tfma.writers.Writer , który otacza beam.PTransform , przyjmując tfma.evaluators.Evaluation jako dane wejściowe i zwracając beam.pvalue.PDone jako dane wyjściowe. Poniżej znajduje się podstawowy przykład programu piszącego do zapisywania rekordów TFRecord zawierających metryki:

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))

Dane wejściowe autora zależą od wyników powiązanego oceniającego. W powyższym przykładzie wyjściem jest serializowany proto utworzony przez tfma.evaluators.MetricsAndPlotsEvaluator . Osoba pisząca dla tfma.evaluators.AnalysisTableEvaluator byłaby odpowiedzialna za wypisanie beam.pvalue.PCollection tfma.Extracts .

Należy zauważyć, że moduł piszący jest powiązany z wynikami oceniającego poprzez używany klucz wyjściowy (np. tfma.METRICS_KEY , tfma.ANALYSIS_KEY itp.).

Przykład krok po kroku

Poniżej znajduje się przykład kroków występujących w potoku ekstrakcji i oceny, gdy używane są zarówno tfma.evaluators.MetricsAndPlotsEvaluator , jak i 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