Visión general
La tubería de TensorFlow Model Analysis (TFMA) se representa de la siguiente manera:
La canalización se compone de cuatro componentes principales:
- Leer entradas
- Extracción
- Evaluación
- Escribir resultados
Estos componentes utilizan dos tipos principales: tfma.Extracts
y tfma.evaluators.Evaluation
. El tipo tfma.Extracts
representa los datos que se extraen durante el procesamiento de la canalización y pueden corresponder a uno o más ejemplos del modelo. tfma.evaluators.Evaluation
representa el resultado de evaluar los extractos en varios puntos durante el proceso de extracción. Para proporcionar una API flexible, estos tipos son solo dictados donde las claves están definidas (reservadas para su uso) por diferentes implementaciones. Los tipos se definen de la siguiente manera:
# 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]
Tenga en cuenta que tfma.Extracts
nunca se escriben directamente; siempre deben pasar por un evaluador para producir un tfma.evaluators.Evaluation
que luego se escribe. También tenga en cuenta que tfma.Extracts
son dictados que se almacenan en un beam.pvalue.PCollection
(es decir, beam.PTransform
s toma como entrada beam.pvalue.PCollection[tfma.Extracts]
) mientras que un tfma.evaluators.Evaluation
es un dictado cuyos valores son beam.pvalue.PCollection
s (es decir, beam.PTransform
s toman el propio dict como argumento para la entrada beam.value.PCollection
). En otras palabras tfma.evaluators.Evaluation
se usa en el momento de la construcción de la tubería, pero tfma.Extracts
se usa en el tiempo de ejecución de la tubería.
Leer entradas
La etapa ReadInputs
se compone de una transformación que toma entradas sin procesar (tf.train.Example, CSV, ...) y las convierte en extractos. Hoy en día, los extractos se representan como bytes de entrada sin procesar almacenados en tfma.INPUT_KEY
; sin embargo, los extractos pueden tener cualquier forma que sea compatible con la canalización de extracción, lo que significa que crea tfma.Extracts
como salida, y que esos extractos son compatibles con aguas abajo. extractores Depende de los diferentes extractores documentar claramente lo que necesitan.
Extracción
El proceso de extracción es una lista de beam.PTransform
s que se ejecutan en serie. Los extractores toman tfma.Extracts
como entrada y devuelven tfma.Extracts
como salida. El extractor prototípico es el tfma.extractors.PredictExtractor
que usa el extracto de entrada producido por la transformación de entradas de lectura y lo ejecuta a través de un modelo para producir extractos de predicciones. Los extractores personalizados se pueden insertar en cualquier punto siempre que sus transformaciones se ajusten a la tfma.Extracts
in y tfma.Extracts
out. Un extractor se define de la siguiente manera:
# 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
Extractor de entrada
El tfma.extractors.InputExtractor
se usa para extraer características sin procesar, etiquetas sin procesar y pesos de ejemplo sin procesar de registros tf.train.Example
para usar en cálculos y división de métricas. De forma predeterminada, los valores se almacenan en las claves de extracción features
, labels
y example_weights
, respectivamente. Las etiquetas de modelo de salida única y los pesos de ejemplo se almacenan directamente como valores np.ndarray
. Las etiquetas de modelo de salida múltiple y los pesos de ejemplo se almacenan como dictados de valores np.ndarray
(codificados por nombre de salida). Si se realiza una evaluación de varios modelos, las etiquetas y los pesos de ejemplo se incrustarán aún más en otro dict (codificado por el nombre del modelo).
PredictExtractor
El tfma.extractors.PredictExtractor
ejecuta predicciones del modelo y las almacena bajo las predictions
clave en el tfma.Extracts
. Las predicciones del modelo de salida única se almacenan directamente como los valores de salida previstos. Las predicciones del modelo de salida múltiple se almacenan como un dict de los valores de salida (codificados por nombre de salida). Si se realiza una evaluación de varios modelos, la predicción se integrará aún más dentro de otro dict (codificado por el nombre del modelo). El valor de salida real utilizado depende del modelo (por ejemplo, las salidas de retorno del estimador TF en forma de dictado, mientras que keras devuelve valores np.ndarray
).
SliceKeyExtractor
El tfma.extractors.SliceKeyExtractor
utiliza la especificación de corte para determinar qué cortes se aplican a cada entrada de ejemplo en función de las características extraídas y agrega los valores de corte correspondientes a los extractos para su uso posterior por parte de los evaluadores.
Evaluación
La evaluación es el proceso de tomar un extracto y evaluarlo. Si bien es común realizar la evaluación al final de la tubería de extracción, hay casos de uso que requieren una evaluación antes en el proceso de extracción. Como tales, los evaluadores están asociados con los extractores contra cuya salida deben evaluarse. Un evaluador se define de la siguiente manera:
# 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
Observe que un evaluador es un beam.PTransform
que toma tfma.Extracts
como entradas. Nada impide que una implementación realice transformaciones adicionales en los extractos como parte del proceso de evaluación. A diferencia de los extractores que deben devolver un tfma.Extracts
, no hay restricciones sobre los tipos de resultados que un evaluador puede generar, aunque la mayoría de los evaluadores también devuelven un dictado (por ejemplo, de nombres y valores de métricas).
Evaluador de métricas y parcelas
El tfma.evaluators.MetricsAndPlotsEvaluator
toma features
, labels
y predictions
como entrada, las ejecuta a través de tfma.slicer.FanoutSlices
para agruparlas por sectores y luego realiza cálculos de métricas y gráficos. Produce resultados en forma de diccionarios de métricas y traza claves y valores (estos luego se convierten en prototipos serializados para su salida por tfma.writers.MetricsAndPlotsWriter
).
Escribir resultados
La etapa WriteResults
es donde la salida de la evaluación se escribe en el disco. WriteResults utiliza escritores para escribir los datos en función de las claves de salida. Por ejemplo, un tfma.evaluators.Evaluation
puede contener claves para metrics
y plots
. Luego, estos se asociarían con los diccionarios de métricas y gráficos llamados 'métricas' y 'gráficos'. Los escritores especifican cómo escribir cada archivo:
# 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
Proporcionamos un tfma.writers.MetricsAndPlotsWriter
que convierte los diccionarios de métricas y diagramas en prototipos serializados y los escribe en el disco.
Si desea usar un formato de serialización diferente, puede crear un escritor personalizado y usarlo en su lugar. Dado que tfma.evaluators.Evaluation
pasado a los escritores contiene la salida de todos los evaluadores combinados, se proporciona una transformación auxiliar tfma.writers.Write
que los escritores pueden usar en sus implementaciones de ptransform
para seleccionar los beam.PCollection
apropiados basados en un tecla de salida (ver a continuación un ejemplo).
personalización
El método tfma.run_model_analysis
toma argumentos de extractors
, evaluators
y writers
para personalizar los extractores, evaluadores y escritores utilizados por la canalización. Si no se proporcionan argumentos, se tfma.default_extractors
, tfma.default_evaluators
y tfma.default_writers
de forma predeterminada.
Extractores personalizados
Para crear un extractor personalizado, cree un tipo tfma.extractors.Extractor
que envuelva un beam.PTransform
tomando tfma.Extracts
como entrada y devolviendo tfma.Extracts
como salida. Hay ejemplos de extractores disponibles en tfma.extractors
.
Evaluadores personalizados
Para crear un evaluador personalizado, cree un tipo tfma.evaluators.Evaluator
que envuelva un beam.PTransform
tomando tfma.Extracts
como entrada y devolviendo tfma.evaluators.Evaluation
como salida. Un evaluador muy básico podría simplemente tomar los tfma.Extracts
entrantes y generarlos para almacenarlos en una tabla. Esto es exactamente lo que hace tfma.evaluators.AnalysisTableEvaluator
. Un evaluador más complicado podría realizar procesamiento adicional y agregación de datos. Consulte tfma.evaluators.MetricsAndPlotsEvaluator
como ejemplo.
Tenga en cuenta que el propio tfma.evaluators.MetricsAndPlotsEvaluator
se puede personalizar para admitir métricas personalizadas (consulte métricas para obtener más detalles).
Escritores personalizados
Para crear un escritor personalizado, cree un tipo tfma.writers.Writer
que envuelva un beam.PTransform
tomando tfma.evaluators.Evaluation
como entrada y devolviendo beam.pvalue.PDone
como salida. El siguiente es un ejemplo básico de un escritor para escribir TFRecords que contienen métricas:
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))
Las entradas de un escritor dependen de la salida del evaluador asociado. Para el ejemplo anterior, la salida es un prototipo serializado producido por tfma.evaluators.MetricsAndPlotsEvaluator
. Un escritor de tfma.evaluators.AnalysisTableEvaluator
sería responsable de escribir un beam.pvalue.PCollection
de tfma.Extracts
.
Tenga en cuenta que un escritor está asociado con la salida de un evaluador a través de la clave de salida utilizada (por ejemplo, tfma.METRICS_KEY
, tfma.ANALYSIS_KEY
, etc.).
Ejemplo paso a paso
El siguiente es un ejemplo de los pasos involucrados en la canalización de extracción y evaluación cuando se utilizan tfma.evaluators.MetricsAndPlotsEvaluator
y 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
}
-
tfma.evaluators.MetricsAndPlotsEvaluator
(ejecutar_después de:SLICE_KEY_EXTRACTOR_STAGE_NAME
)
# 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)
}
-
tfma.evaluators.AnalysisTableEvaluator
(ejecutar_después de:LAST_EXTRACTOR_STAGE_NAME
)
# 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