Архитектура анализа модели Tensorflow

Обзор

Конвейер анализа модели 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 s принимают сам 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 , который использует входной экстракт, созданный преобразованием чтения входных данных, и пропускает его через модель для создания прогнозных экстрактов. Настраиваемые экстракторы могут быть вставлены в любой момент при условии, что их преобразования соответствуют API 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 (включаемых по выходному имени). Если выполняется оценка нескольких моделей, метки и весовые коэффициенты примеров будут дополнительно встроены в другой словарь (с ключом по имени модели).

PredictExtractor

tfma.extractors.PredictExtractor запускает прогнозы модели и сохраняет их под ключевыми predictions в tfma.Extracts . Прогнозы модели с одним выходом сохраняются непосредственно как прогнозируемые выходные значения. Прогнозы модели с несколькими выходами хранятся в виде списка выходных значений (с ключом по выходному имени). Если выполняется оценка нескольких моделей, прогноз будет дополнительно встроен в другой словарь (с ключом по имени модели). Фактическое используемое выходное значение зависит от модели (например, выходные данные оценщика 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

Обратите внимание, что оценщик — это 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

MetricsAndPlotsWriter

Мы предоставляем tfma.writers.MetricsAndPlotsWriter , который преобразует метрики и словари графиков в сериализованные прототипы и записывает их на диск.

Если вы хотите использовать другой формат сериализации, вы можете создать собственный модуль записи и использовать его вместо этого. Поскольку tfma.evaluators.Evaluation передаваемый авторам, содержит выходные данные для всех объединенных оценщиков, предоставляется вспомогательное преобразование tfma.writers.Write , которое писатели могут использовать в своих реализациях ptransform для выбора подходящего beam.PCollection . выходной ключ (см. пример ниже).

Настройка

Метод tfma.run_model_analysis принимает аргументы extractors , evaluators и средств writers для настройки экстракторов, оценщиков и средств записи, используемых конвейером. Если аргументы не указаны, по умолчанию используются tfma.default_extractors , tfma.default_evaluators и tfma.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 . Автор для 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