¡Únase a la comunidad de SIG TFX-Addons y ayude a que TFX sea aún mejor!

Apache Beam y TFX

Apache Beam proporciona un marco para ejecutar trabajos de procesamiento de datos por lotes y en streaming que se ejecutan en una variedad de motores de ejecución. Varias de las bibliotecas TFX usan Beam para ejecutar tareas, lo que permite un alto grado de escalabilidad entre clústeres de cómputo. Beam incluye soporte para una variedad de motores de ejecución o "ejecutores", incluido un ejecutor directo que se ejecuta en un solo nodo de cómputo y es muy útil para desarrollo, pruebas o implementaciones pequeñas. Beam proporciona una capa de abstracción que permite que TFX se ejecute en cualquier corredor compatible sin modificaciones de código. TFX usa la API Beam Python, por lo que está limitado a los corredores que son compatibles con la API Python.

Implementación y escalabilidad

A medida que aumentan los requisitos de carga de trabajo, Beam puede escalar a implementaciones muy grandes en grandes clústeres de cómputo. Esto está limitado solo por la escalabilidad del corredor subyacente. Los corredores en implementaciones grandes generalmente se implementarán en un sistema de orquestación de contenedores como Kubernetes o Apache Mesos para automatizar la implementación, el escalado y la administración de aplicaciones.

Consulte la documentación de Apache Beam para obtener más información sobre Apache Beam.

Para los usuarios de Google Cloud, Dataflow es el corredor recomendado, que proporciona una plataforma rentable y sin servidor a través del ajuste de escala automático de recursos, reequilibrio dinámico del trabajo, integración profunda con otros servicios de Google Cloud, seguridad integrada y supervisión.

Dependencias y código Python personalizado

Una complejidad notable del uso de Beam en una canalización TFX es el manejo de código personalizado y / o las dependencias necesarias de módulos Python adicionales. A continuación, se muestran algunos ejemplos de situaciones en las que esto podría suponer un problema:

  • preprocessing_fn necesita hacer referencia al módulo Python del usuario
  • un extractor personalizado para el componente Evaluador
  • módulos personalizados que se subclasifican de un componente TFX

TFX se basa en el soporte de Beam para administrar las dependencias de la canalización de Python para manejar las dependencias de Python. Actualmente hay dos formas de gestionar esto:

  1. Proporcionar código Python y dependencias como paquete fuente
  2. [Solo Dataflow] Uso de una imagen de contenedor como trabajador

Estos se discuten a continuación.

Proporcionar código Python y dependencias como paquete fuente

Esto se recomienda para usuarios que:

  1. Están familiarizados con el empaquetado de Python y
  2. Utilice únicamente código fuente de Python (es decir, sin módulos C ni bibliotecas compartidas).

Siga una de las rutas en Gestión de las dependencias de canalización de Python para proporcionar esto mediante uno de los siguientes beam_pipeline_args:

  • --setup_file
  • --extra_package
  • --requirements_file

Aviso: En cualquiera de los casos anteriores, asegúrese de que la misma versión de tfx como dependencia.

[Solo Dataflow] Uso de una imagen de contenedor para un trabajador

TFX 0.26.0 y versiones posteriores tienen compatibilidad experimental para usar una imagen de contenedor personalizada para los trabajadores de Dataflow.

Para usar esto, debe:

  • Cree una imagen de Docker que tenga tanto tfx como el código personalizado y las dependencias de los usuarios preinstalados.
    • Para los usuarios que (1) usan tfx>=0.26 y (2) usan Python 3.7 para desarrollar sus pipelines, la forma más fácil de hacerlo es extendiendo la versión correspondiente de la imagen oficial de tensorflow/tfx :
# You can use a build-arg to dynamically pass in the
# version of TFX being used to your Dockerfile.

ARG TFX_VERSION
FROM tensorflow/tfx:${TFX_VERSION}
# COPY your code and dependencies in
  • Envíe la imagen creada a un registro de imágenes de contenedor al que puede acceder el proyecto que usa Dataflow.
    • Los usuarios de Google Cloud pueden considerar el uso de Cloud Build, que automatiza muy bien los pasos anteriores.
  • Proporcione los siguientes beam_pipeline_args :
beam_pipeline_args.extend([
    '--runner=DataflowRunner',
    '--project={project-id}',
    '--worker_harness_container_image={image-ref}',
    '--experiments=use_runner_v2',
])

TODO (b / 171733562): elimine use_runner_v2 una vez que esté predeterminado para Dataflow.

TODO (b / 179738639): Cree documentación sobre cómo probar el contenedor personalizado localmente después de https://issues.apache.org/jira/browse/BEAM-5440

Argumentos de canalización de vigas

Varios componentes TFX dependen de Beam para el procesamiento de datos distribuidos. Están configurados con beam_pipeline_args , que se especifica durante la creación de la canalización:

my_pipeline = Pipeline(
    ...,
    beam_pipeline_args=[...])

TFX 0.30 y superior agrega una interfaz, with_beam_pipeline_args , para extender los args de haz de nivel de tubería por componente:

example_gen = CsvExampleGen(input_base=data_root).with_beam_pipeline_args([...])