Path: blob/master/site/es-419/tfx/guide/custom_component.md
25118 views
Cómo compilar componentes totalmente personalizados
En esta guía se describe cómo usar la API de TFX para compilar un componente totalmente personalizado. Los componentes totalmente personalizados le permiten compilar componentes a través de la definición de la especificación del componente, el ejecutor y las clases de interfaz del componente. Este enfoque le permite reutilizar y ampliar un componente estándar para adaptarlo a sus necesidades.
Si no tiene experiencia con las canalizaciones de TFX, obtenga más información sobre los conceptos básicos de las canalizaciones de TFX.
Ejecutor personalizado o componente personalizado
Si solo se necesita una lógica de procesamiento personalizada mientras las entradas, salidas y propiedades de ejecución del componente son idénticas a las de un componente existente, basta con un ejecutor personalizado. Se necesita un componente totalmente personalizado cuando alguna de las entradas, salidas o propiedades de ejecución es diferente de cualquier componente de TFX existente.
¿Cómo crear un componente personalizado?
Para desarrollar un componente totalmente personalizado se requiere lo siguiente:
Un conjunto definido de especificaciones de artefactos de entrada y salida para el nuevo componente. Sobre todo, los tipos de artefactos de entrada deben ser coherentes con los tipos de artefactos de salida de los componentes que producen los artefactos y los tipos de artefactos de salida deben ser coherentes con los tipos de artefactos de entrada de los componentes que consumen los artefactos, si los hubiera.
Los parámetros de ejecución que no son artefactos necesarios para el nuevo componente.
ComponentSpec
La clase ComponentSpec
define el contrato del componente mediante la definición de los artefactos de entrada y salida a un componente, así como los parámetros que se utilizan para la ejecución del componente. Consta de tres partes:
ENTRADAS: un diccionario de parámetros escritos para los artefactos de entrada que se pasan al ejecutor del componente. Normalmente, los artefactos de entrada son las salidas de los componentes ascendentes y, por lo tanto, comparten el mismo tipo.
SALIDAS: un diccionario de parámetros escritos para los artefactos de salida que produce el componente.
PARÁMETROS: un diccionario de elementos ExecutionParameter adicionales que se pasarán al ejecutor del componente. Estos son parámetros que no son artefactos y que queremos definir de manera flexible en el DSL de la canalización y pasar a ejecución.
A continuación se muestra un ejemplo de ComponentSpec.
Ejecutor
A continuación, escriba el código ejecutor para el nuevo componente. Básicamente, se debe crear una nueva subclase de base_executor.BaseExecutor
con su función Do
anulada. En la función Do
, los argumentos input_dict
, output_dict
y exec_properties
que se pasan en el mapa a INPUTS
, OUTPUTS
y PARAMETERS
que se definen en ComponentSpec respectivamente. Para exec_properties
, el valor se puede extraer directamente mediante una búsqueda en el diccionario. Para los artefactos en input_dict
y output_dict
, hay funciones convenientes disponibles en la clase artifact_utils que se pueden usar para extraer la instancia del artefacto o el URI del artefacto.
Pruebas unitarias de un ejecutor personalizado
Se pueden crear pruebas unitarias para el ejecutor personalizado similares a esta.
Interfaz de componentes
Ahora que ya completamos la parte más compleja, el siguiente paso consiste en ensamblar estas piezas para formar una interfaz de componente, que permita utilizar el componente en una canalización. Este proceso consta de varios pasos:
Haga que la interfaz de componente sea una subclase de
base_component.BaseComponent
Asigne una variable de clase
SPEC_CLASS
con la claseComponentSpec
que se definió anteriormenteAsigne una variable de clase
EXECUTOR_SPEC
con la clase Ejecutor que se definió anteriormenteDefina la función constructora
__init__()
con los argumentos de la función para construir una instancia de la clase ComponentSpec e invocar la superfunción con ese valor, junto con un nombre opcional.
Cuando se cree una instancia del componente, se invocará la lógica de verificación de tipos en la clase base_component.BaseComponent
para garantizar que los argumentos que se pasaron sean compatibles con la información de tipo definida en la clase ComponentSpec
.
Ensamblado en una canalización de TFX
Como último paso, debe conectar el nuevo componente personalizado a una canalización de TFX. Además de agregar una instancia del nuevo componente, también debe hacer lo siguiente:
Conectar correctamente los componentes ascendentes y descendentes del nuevo componente. Para esto, debe hacer referencia a las salidas del componente ascendente en el nuevo componente y hacer referencia a las salidas del nuevo componente en los componentes descendentes.
Agregar la nueva instancia del componente a la lista de componentes al construir la canalización.
En el siguiente ejemplo se destacan los cambios antes mencionados. El ejemplo completo se puede encontrar en el repositorio GitHub de TFX.
Implemente un componente totalmente personalizado
Más allá de los cambios de código, es necesario que pueda acceder a todas las partes recién agregadas (ComponentSpec
, Executor
, interfaz de componente) en el entorno de ejecución de la canalización para poder ejecutar la canalización correctamente.